xref: /aosp_15_r20/external/llvm/test/Transforms/LICM/argmemonly-call.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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