| ; 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 | |
| } |