153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -S -passes=gvn < %s | FileCheck %s3 4declare void @capture(ptr)5declare void @some_call()6 7define i32 @test_call_before_capture(ptr %p) {8; CHECK-LABEL: define i32 @test_call_before_capture(9; CHECK-SAME: ptr [[P:%.*]]) {10; CHECK-NEXT: [[A:%.*]] = alloca i32, align 411; CHECK-NEXT: store i32 123, ptr [[A]], align 412; CHECK-NEXT: call void @some_call()13; CHECK-NEXT: call void @capture(ptr [[A]])14; CHECK-NEXT: ret i32 12315;16 %a = alloca i3217 store i32 123, ptr %a18 call void @some_call()19 %v = load i32, ptr %a20 call void @capture(ptr %a)21 ret i32 %v22}23 24define i32 @test_call_after_capture(ptr %p) {25; CHECK-LABEL: define i32 @test_call_after_capture(26; CHECK-SAME: ptr [[P:%.*]]) {27; CHECK-NEXT: [[A:%.*]] = alloca i32, align 428; CHECK-NEXT: store i32 123, ptr [[A]], align 429; CHECK-NEXT: call void @capture(ptr [[A]])30; CHECK-NEXT: call void @some_call()31; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 432; CHECK-NEXT: ret i32 [[V]]33;34 %a = alloca i3235 store i32 123, ptr %a36 call void @capture(ptr %a)37 call void @some_call()38 %v = load i32, ptr %a39 ret i32 %v40}41 42define i32 @test_store_before_capture(ptr %p) {43; CHECK-LABEL: define i32 @test_store_before_capture(44; CHECK-SAME: ptr [[P:%.*]]) {45; CHECK-NEXT: [[A:%.*]] = alloca i32, align 446; CHECK-NEXT: store i32 123, ptr [[A]], align 447; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P]], align 848; CHECK-NEXT: store i32 42, ptr [[P2]], align 449; CHECK-NEXT: call void @capture(ptr [[A]])50; CHECK-NEXT: ret i32 12351;52 %a = alloca i3253 store i32 123, ptr %a54 %p2 = load ptr, ptr %p55 store i32 42, ptr %p256 %v = load i32, ptr %a57 call void @capture(ptr %a)58 ret i32 %v59}60 61define i32 @test_store_after_capture(ptr %p) {62; CHECK-LABEL: define i32 @test_store_after_capture(63; CHECK-SAME: ptr [[P:%.*]]) {64; CHECK-NEXT: [[A:%.*]] = alloca i32, align 465; CHECK-NEXT: store i32 123, ptr [[A]], align 466; CHECK-NEXT: call void @capture(ptr [[A]])67; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P]], align 868; CHECK-NEXT: store i32 42, ptr [[P2]], align 469; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 470; CHECK-NEXT: ret i32 [[V]]71;72 %a = alloca i3273 store i32 123, ptr %a74 call void @capture(ptr %a)75 %p2 = load ptr, ptr %p76 store i32 42, ptr %p277 %v = load i32, ptr %a78 ret i32 %v79}80 81define i32 @test_capture_readonly() {82; CHECK-LABEL: define i32 @test_capture_readonly() {83; CHECK-NEXT: [[A:%.*]] = alloca i32, align 484; CHECK-NEXT: store i32 123, ptr [[A]], align 485; CHECK-NEXT: call void @capture(ptr readonly [[A]])86; CHECK-NEXT: ret i32 12387;88 %a = alloca i3289 store i32 123, ptr %a90 call void @capture(ptr readonly %a)91 %v = load i32, ptr %a92 ret i32 %v93}94 95define i32 @test_capture_readonly_with_following_call() {96; CHECK-LABEL: define i32 @test_capture_readonly_with_following_call() {97; CHECK-NEXT: [[A:%.*]] = alloca i32, align 498; CHECK-NEXT: store i32 123, ptr [[A]], align 499; CHECK-NEXT: call void @capture(ptr readonly [[A]])100; CHECK-NEXT: call void @some_call()101; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4102; CHECK-NEXT: ret i32 [[V]]103;104 %a = alloca i32105 store i32 123, ptr %a106 call void @capture(ptr readonly %a)107 call void @some_call()108 %v = load i32, ptr %a109 ret i32 %v110}111 112declare void @use(i32)113 114define i32 @test_capture_readonly_in_loop() {115; CHECK-LABEL: define i32 @test_capture_readonly_in_loop() {116; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4117; CHECK-NEXT: store i32 123, ptr [[A]], align 4118; CHECK-NEXT: br label [[LOOP:%.*]]119; CHECK: loop:120; CHECK-NEXT: call void @capture(ptr readonly [[A]])121; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4122; CHECK-NEXT: call void @use(i32 [[V]]) #[[ATTR0:[0-9]+]]123; CHECK-NEXT: br label [[LOOP]]124;125 %a = alloca i32126 store i32 123, ptr %a127 br label %loop128 129loop:130 call void @capture(ptr readonly %a)131 %v = load i32, ptr %a132 call void @use(i32 %v) memory(none)133 br label %loop134}135 136define i32 @test_splat_gep_capture(<1 x i32> %index) {137; CHECK-LABEL: define i32 @test_splat_gep_capture(138; CHECK-SAME: <1 x i32> [[INDEX:%.*]]) {139; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4140; CHECK-NEXT: store i32 123, ptr [[A]], align 4141; CHECK-NEXT: [[PTRS:%.*]] = getelementptr inbounds i32, ptr [[A]], <1 x i32> [[INDEX]]142; CHECK-NEXT: call void @some_call(<1 x ptr> [[PTRS]])143; CHECK-NEXT: [[RELOAD:%.*]] = load i32, ptr [[A]], align 4144; CHECK-NEXT: ret i32 [[RELOAD]]145;146 %a = alloca i32147 store i32 123, ptr %a148 %ptrs = getelementptr inbounds i32, ptr %a, <1 x i32> %index149 call void @some_call(<1 x ptr> %ptrs)150 %reload = load i32, ptr %a151 ret i32 %reload152}153