brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 0977f6e Raw
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