| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -passes='logical-sroa' -S | FileCheck %s --check-prefixes=CHECK | |
| declare void @llvm.lifetime.start.p0(ptr nocapture) | |
| declare void @llvm.lifetime.end.p0(ptr nocapture) | |
| declare ptr @llvm.structured.alloca.p0() | |
| declare ptr @llvm.structured.gep.p0(ptr, ...) | |
| define i32 @test_simple_array() { | |
| ; CHECK-LABEL: define i32 @test_simple_array() { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[TMP:%.*]] = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| ; CHECK-NEXT: [[PTR:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) [[TMP]], i32 0) | |
| ; CHECK-NEXT: store i32 0, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: ret i32 [[RES]] | |
| ; | |
| entry: | |
| %tmp = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| %ptr = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) %tmp, i32 0) | |
| store i32 0, ptr %ptr | |
| %res = load i32, ptr %ptr | |
| ret i32 %res | |
| } | |
| define i32 @test_simple_array_dynamic_index(i32 %i) { | |
| ; CHECK-LABEL: define i32 @test_simple_array_dynamic_index( | |
| ; CHECK-SAME: i32 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[TMP:%.*]] = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| ; CHECK-NEXT: [[PTR:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) [[TMP]], i32 [[I]]) | |
| ; CHECK-NEXT: store i32 0, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[PTR]], align 4 | |
| ; CHECK-NEXT: ret i32 [[RES]] | |
| ; | |
| entry: | |
| %tmp = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| %ptr = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) %tmp, i32 %i) | |
| store i32 0, ptr %ptr | |
| %res = load i32, ptr %ptr | |
| ret i32 %res | |
| } | |
| define i32 @test_simple_array_dynamic_index_in_child(i32 %i) { | |
| ; CHECK-LABEL: define i32 @test_simple_array_dynamic_index_in_child( | |
| ; CHECK-SAME: i32 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[TMP0:%.*]] = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| ; CHECK-NEXT: [[PTR1:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) [[TMP0]], i32 [[I]]) | |
| ; CHECK-NEXT: store i32 0, ptr [[PTR1]], align 4 | |
| ; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[PTR1]], align 4 | |
| ; CHECK-NEXT: ret i32 [[RES]] | |
| ; | |
| entry: | |
| %tmp = call elementtype({ i32, [10 x i32]}) ptr @llvm.structured.alloca.p0() | |
| %ptr = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, [10 x i32] }) %tmp, i32 1, i32 %i) | |
| store i32 0, ptr %ptr | |
| %res = load i32, ptr %ptr | |
| ret i32 %res | |
| } | |
| define i32 @test_simple_array_dynamic_index_only_child(i32 %i) { | |
| ; CHECK-LABEL: define i32 @test_simple_array_dynamic_index_only_child( | |
| ; CHECK-SAME: i32 [[I:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[TMP0:%.*]] = call elementtype([10 x i32]) ptr @llvm.structured.alloca.p0() | |
| ; CHECK-NEXT: [[PTR1:%.*]] = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype([10 x i32]) [[TMP0]], i32 [[I]]) | |
| ; CHECK-NEXT: store i32 0, ptr [[PTR1]], align 4 | |
| ; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[PTR1]], align 4 | |
| ; CHECK-NEXT: ret i32 [[RES]] | |
| ; | |
| entry: | |
| %tmp = call elementtype({[10 x i32]}) ptr @llvm.structured.alloca.p0() | |
| %ptr = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({[10 x i32]}) %tmp, i32 0, i32 %i) | |
| store i32 0, ptr %ptr | |
| %res = load i32, ptr %ptr | |
| ret i32 %res | |
| } |