| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -passes=load-store-vectorizer -S < %s | FileCheck %s |
| |
| target datalayout = "e-pe2:32:32:32:32" |
| |
| ; A pointer with external state must remain a pointer-typed memory access. |
| ; Replacing it with an integer vector load would not transfer its out-of-band |
| ; state. |
| define { ptr addrspace(2), i32 } @load_external_state_pointer(ptr align 8 %base) { |
| ; CHECK-LABEL: define { ptr addrspace(2), i32 } @load_external_state_pointer( |
| ; CHECK-SAME: ptr align 8 [[BASE:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[NEXT:%.*]] = getelementptr i8, ptr [[BASE]], i64 4 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load ptr addrspace(2), ptr [[BASE]], align 8 |
| ; CHECK-NEXT: [[I2:%.*]] = load i32, ptr [[NEXT]], align 4 |
| ; CHECK-NEXT: [[R0:%.*]] = insertvalue { ptr addrspace(2), i32 } poison, ptr addrspace(2) [[TMP1]], 0 |
| ; CHECK-NEXT: [[R1:%.*]] = insertvalue { ptr addrspace(2), i32 } [[R0]], i32 [[I2]], 1 |
| ; CHECK-NEXT: ret { ptr addrspace(2), i32 } [[R1]] |
| ; |
| entry: |
| %next = getelementptr i8, ptr %base, i64 4 |
| %p = load ptr addrspace(2), ptr %base, align 8 |
| %i = load i32, ptr %next, align 4 |
| %r0 = insertvalue { ptr addrspace(2), i32 } poison, |
| ptr addrspace(2) %p, 0 |
| %r1 = insertvalue { ptr addrspace(2), i32 } %r0, i32 %i, 1 |
| ret { ptr addrspace(2), i32 } %r1 |
| } |
| |
| ; A pointer with external state must remain a pointer-typed memory access. |
| ; Replacing it with an integer vector store would not transfer its out-of-band |
| ; state. |
| define void @store_external_state_pointer( |
| ; CHECK-LABEL: define void @store_external_state_pointer( |
| ; CHECK-SAME: ptr align 8 [[BASE:%.*]], ptr addrspace(2) [[P:%.*]], i32 [[I:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[NEXT:%.*]] = getelementptr i8, ptr [[BASE]], i64 4 |
| ; CHECK-NEXT: store ptr addrspace(2) [[P]], ptr [[BASE]], align 8 |
| ; CHECK-NEXT: store i32 [[I]], ptr [[NEXT]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| ptr align 8 %base, ptr addrspace(2) %p, i32 %i) { |
| entry: |
| %next = getelementptr i8, ptr %base, i64 4 |
| store ptr addrspace(2) %p, ptr %base, align 8 |
| store i32 %i, ptr %next, align 4 |
| ret void |
| } |