1 ; RUN: opt -S -basicaa -licm %s | FileCheck %s 2 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' < %s -S | FileCheck %s 3 declare i32 @foo() readonly argmemonly nounwind 4 declare i32 @foo2() readonly nounwind 5 declare i32 @bar(i32* %loc2) readonly argmemonly nounwind 6 7 define void @test(i32* %loc) { 8 ; CHECK-LABEL: @test 9 ; CHECK: @foo 10 ; CHECK-LABEL: loop: 11 br label %loop 12 13 loop: 14 %res = call i32 @foo() 15 store i32 %res, i32* %loc 16 br label %loop 17 } 18 19 ; Negative test: show argmemonly is required 20 define void @test_neg(i32* %loc) { 21 ; CHECK-LABEL: @test_neg 22 ; CHECK-LABEL: loop: 23 ; CHECK: @foo 24 br label %loop 25 26 loop: 27 %res = call i32 @foo2() 28 store i32 %res, i32* %loc 29 br label %loop 30 } 31 32 define void @test2(i32* noalias %loc, i32* noalias %loc2) { 33 ; CHECK-LABEL: @test2 34 ; CHECK: @bar 35 ; CHECK-LABEL: loop: 36 br label %loop 37 38 loop: 39 %res = call i32 @bar(i32* %loc2) 40 store i32 %res, i32* %loc 41 br label %loop 42 } 43 44 ; Negative test: %might clobber gep 45 define void @test3(i32* %loc) { 46 ; CHECK-LABEL: @test3 47 ; CHECK-LABEL: loop: 48 ; CHECK: @bar 49 br label %loop 50 51 loop: 52 %res = call i32 @bar(i32* %loc) 53 %gep = getelementptr i32, i32 *%loc, i64 1000000 54 store i32 %res, i32* %gep 55 br label %loop 56 } 57 58 59 ; Negative test: %loc might alias %loc2 60 define void @test4(i32* %loc, i32* %loc2) { 61 ; CHECK-LABEL: @test4 62 ; CHECK-LABEL: loop: 63 ; CHECK: @bar 64 br label %loop 65 66 loop: 67 %res = call i32 @bar(i32* %loc2) 68 store i32 %res, i32* %loc 69 br label %loop 70 } 71