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