xref: /aosp_15_r20/external/llvm/test/Transforms/Sink/call.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -sink -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_load_global() nounwind readonly
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_load_arg(i32*) nounwind readonly argmemonly
5*9880d681SAndroid Build Coastguard Workerdeclare void @f_store_global(i32) nounwind
6*9880d681SAndroid Build Coastguard Workerdeclare void @f_store_arg(i32*) nounwind argmemonly
7*9880d681SAndroid Build Coastguard Workerdeclare void @f_readonly_arg(i32* readonly, i32*) nounwind argmemonly
8*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_readnone(i32) nounwind readnone
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker@A = external global i32
11*9880d681SAndroid Build Coastguard Worker@B = external global i32
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; Sink readonly call if no stores are in the way.
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_no_stores(
16*9880d681SAndroid Build Coastguard Worker; CHECK: true:
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_global
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l
19*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_no_stores(i1 %z) {
20*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_global()
21*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
22*9880d681SAndroid Build Coastguard Workertrue:
23*9880d681SAndroid Build Coastguard Worker  ret i32 %l
24*9880d681SAndroid Build Coastguard Workerfalse:
25*9880d681SAndroid Build Coastguard Worker  ret i32 0
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_store(
29*9880d681SAndroid Build Coastguard Worker; CHECK: true:
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l
32*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_store(i1 %z) {
33*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_arg(i32* @A)
34*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* @B
35*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
36*9880d681SAndroid Build Coastguard Workertrue:
37*9880d681SAndroid Build Coastguard Worker  ret i32 %l
38*9880d681SAndroid Build Coastguard Workerfalse:
39*9880d681SAndroid Build Coastguard Worker  ret i32 0
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_call(
43*9880d681SAndroid Build Coastguard Worker; CHECK: true:
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l
46*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_call(i1 %z) {
47*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_arg(i32* @A)
48*9880d681SAndroid Build Coastguard Worker  call void @f_store_arg(i32* @B)
49*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
50*9880d681SAndroid Build Coastguard Workertrue:
51*9880d681SAndroid Build Coastguard Worker  ret i32 %l
52*9880d681SAndroid Build Coastguard Workerfalse:
53*9880d681SAndroid Build Coastguard Worker  ret i32 0
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_multiple(
57*9880d681SAndroid Build Coastguard Worker; CHECK: true:
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l
60*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_multiple(i1 %z) {
61*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_arg(i32* @A)
62*9880d681SAndroid Build Coastguard Worker  call void @f_readonly_arg(i32* @A, i32* @B)
63*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
64*9880d681SAndroid Build Coastguard Workertrue:
65*9880d681SAndroid Build Coastguard Worker  ret i32 %l
66*9880d681SAndroid Build Coastguard Workerfalse:
67*9880d681SAndroid Build Coastguard Worker  ret i32 0
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; But don't sink if there is a store.
71*9880d681SAndroid Build Coastguard Worker;
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_nosink_store(
73*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f_load_global
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32
75*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nosink_store(i1 %z) {
76*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_global()
77*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* @A
78*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
79*9880d681SAndroid Build Coastguard Workertrue:
80*9880d681SAndroid Build Coastguard Worker  ret i32 %l
81*9880d681SAndroid Build Coastguard Workerfalse:
82*9880d681SAndroid Build Coastguard Worker  ret i32 0
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_nosink_call(
86*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f_load_global
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f_store_global
88*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nosink_call(i1 %z) {
89*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_load_global()
90*9880d681SAndroid Build Coastguard Worker  call void @f_store_global(i32 0)
91*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
92*9880d681SAndroid Build Coastguard Workertrue:
93*9880d681SAndroid Build Coastguard Worker  ret i32 %l
94*9880d681SAndroid Build Coastguard Workerfalse:
95*9880d681SAndroid Build Coastguard Worker  ret i32 0
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; readnone calls are sunk across stores.
99*9880d681SAndroid Build Coastguard Worker;
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_readnone(
101*9880d681SAndroid Build Coastguard Worker; CHECK: true:
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_readnone(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l
104*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_readnone(i1 %z) {
105*9880d681SAndroid Build Coastguard Worker  %l = call i32 @f_readnone(i32 0)
106*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* @A
107*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %true, label %false
108*9880d681SAndroid Build Coastguard Workertrue:
109*9880d681SAndroid Build Coastguard Worker  ret i32 %l
110*9880d681SAndroid Build Coastguard Workerfalse:
111*9880d681SAndroid Build Coastguard Worker  ret i32 0
112*9880d681SAndroid Build Coastguard Worker}
113