xref: /aosp_15_r20/external/llvm/test/Transforms/InstSimplify/call.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
5*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.usub.with.overflow.i8(i8 %a, i8 %b)
6*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.ssub.with.overflow.i8(i8 %a, i8 %b)
7*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.umul.with.overflow.i8(i8 %a, i8 %b)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine i1 @test_uadd1() {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_uadd1(
11*9880d681SAndroid Build Coastguard Worker  %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 3)
12*9880d681SAndroid Build Coastguard Worker  %overflow = extractvalue {i8, i1} %x, 1
13*9880d681SAndroid Build Coastguard Worker  ret i1 %overflow
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i8 @test_uadd2() {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_uadd2(
19*9880d681SAndroid Build Coastguard Worker  %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 44)
20*9880d681SAndroid Build Coastguard Worker  %result = extractvalue {i8, i1} %x, 0
21*9880d681SAndroid Build Coastguard Worker  ret i8 %result
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 42
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_usub1(i8 %V) {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_usub1(
27*9880d681SAndroid Build Coastguard Worker  %x = call {i8, i1} @llvm.usub.with.overflow.i8(i8 %V, i8 %V)
28*9880d681SAndroid Build Coastguard Worker  ret {i8, i1} %x
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_ssub1(i8 %V) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_ssub1(
34*9880d681SAndroid Build Coastguard Worker  %x = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 %V, i8 %V)
35*9880d681SAndroid Build Coastguard Worker  ret {i8, i1} %x
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_umul1(i8 %V) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_umul1(
41*9880d681SAndroid Build Coastguard Worker  %x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %V, i8 0)
42*9880d681SAndroid Build Coastguard Worker  ret {i8, i1} %x
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdeclare i256 @llvm.cttz.i256(i256 %src, i1 %is_zero_undef)
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i256 @test_cttz() {
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_cttz(
50*9880d681SAndroid Build Coastguard Worker  %x = call i256 @llvm.cttz.i256(i256 10, i1 false)
51*9880d681SAndroid Build Coastguard Worker  ret i256 %x
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i256 1
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdeclare i256 @llvm.ctpop.i256(i256 %src)
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i256 @test_ctpop() {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_ctpop(
59*9880d681SAndroid Build Coastguard Worker  %x = call i256 @llvm.ctpop.i256(i256 10)
60*9880d681SAndroid Build Coastguard Worker  ret i256 %x
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i256 2
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Test a non-intrinsic that we know about as a library call.
65*9880d681SAndroid Build Coastguard Workerdeclare float @fabs(float %x)
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine float @test_fabs_libcall() {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_fabs_libcall(
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker  %x = call float @fabs(float -42.0)
71*9880d681SAndroid Build Coastguard Worker; This is still a real function call, so instsimplify won't nuke it -- other
72*9880d681SAndroid Build Coastguard Worker; passes have to do that.
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @fabs
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker  ret float %x
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 4.2{{0+}}e+01
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) nounwind readnone
81*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.floor.f32(float) nounwind readnone
82*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.ceil.f32(float) nounwind readnone
83*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.trunc.f32(float) nounwind readnone
84*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.rint.f32(float) nounwind readnone
85*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nearbyint.f32(float) nounwind readnone
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; Test idempotent intrinsics
88*9880d681SAndroid Build Coastguard Workerdefine float @test_idempotence(float %a) {
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_idempotence(
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker; CHECK: fabs
92*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs
93*9880d681SAndroid Build Coastguard Worker  %a0 = call float @llvm.fabs.f32(float %a)
94*9880d681SAndroid Build Coastguard Worker  %a1 = call float @llvm.fabs.f32(float %a0)
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK: floor
97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: floor
98*9880d681SAndroid Build Coastguard Worker  %b0 = call float @llvm.floor.f32(float %a)
99*9880d681SAndroid Build Coastguard Worker  %b1 = call float @llvm.floor.f32(float %b0)
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; CHECK: ceil
102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ceil
103*9880d681SAndroid Build Coastguard Worker  %c0 = call float @llvm.ceil.f32(float %a)
104*9880d681SAndroid Build Coastguard Worker  %c1 = call float @llvm.ceil.f32(float %c0)
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; CHECK: trunc
107*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: trunc
108*9880d681SAndroid Build Coastguard Worker  %d0 = call float @llvm.trunc.f32(float %a)
109*9880d681SAndroid Build Coastguard Worker  %d1 = call float @llvm.trunc.f32(float %d0)
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; CHECK: rint
112*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rint
113*9880d681SAndroid Build Coastguard Worker  %e0 = call float @llvm.rint.f32(float %a)
114*9880d681SAndroid Build Coastguard Worker  %e1 = call float @llvm.rint.f32(float %e0)
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; CHECK: nearbyint
117*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nearbyint
118*9880d681SAndroid Build Coastguard Worker  %f0 = call float @llvm.nearbyint.f32(float %a)
119*9880d681SAndroid Build Coastguard Worker  %f1 = call float @llvm.nearbyint.f32(float %f0)
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  %r0 = fadd float %a1, %b1
122*9880d681SAndroid Build Coastguard Worker  %r1 = fadd float %r0, %c1
123*9880d681SAndroid Build Coastguard Worker  %r2 = fadd float %r1, %d1
124*9880d681SAndroid Build Coastguard Worker  %r3 = fadd float %r2, %e1
125*9880d681SAndroid Build Coastguard Worker  %r4 = fadd float %r3, %f1
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker  ret float %r4
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine i8* @operator_new() {
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  %call = tail call noalias i8* @_Znwm(i64 8)
133*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8* %call, null
134*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cast.end, label %cast.notnull
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workercast.notnull:                                     ; preds = %entry
137*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %call, i64 4
138*9880d681SAndroid Build Coastguard Worker  br label %cast.end
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workercast.end:                                         ; preds = %cast.notnull, %entry
141*9880d681SAndroid Build Coastguard Worker  %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
142*9880d681SAndroid Build Coastguard Worker  ret i8* %cast.result
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @operator_new
145*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %cast.end, label %cast.notnull
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdeclare nonnull noalias i8* @_Znwm(i64)
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker%"struct.std::nothrow_t" = type { i8 }
151*9880d681SAndroid Build Coastguard Worker@_ZSt7nothrow = external global %"struct.std::nothrow_t"
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerdefine i8* @operator_new_nothrow_t() {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker  %call = tail call noalias i8* @_ZnamRKSt9nothrow_t(i64 8, %"struct.std::nothrow_t"* @_ZSt7nothrow)
156*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8* %call, null
157*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cast.end, label %cast.notnull
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workercast.notnull:                                     ; preds = %entry
160*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %call, i64 4
161*9880d681SAndroid Build Coastguard Worker  br label %cast.end
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workercast.end:                                         ; preds = %cast.notnull, %entry
164*9880d681SAndroid Build Coastguard Worker  %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
165*9880d681SAndroid Build Coastguard Worker  ret i8* %cast.result
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @operator_new_nothrow_t
168*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp, label %cast.end, label %cast.notnull
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdeclare i8* @_ZnamRKSt9nothrow_t(i64, %"struct.std::nothrow_t"*) nounwind
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine i8* @malloc_can_return_null() {
174*9880d681SAndroid Build Coastguard Workerentry:
175*9880d681SAndroid Build Coastguard Worker  %call = tail call noalias i8* @malloc(i64 8)
176*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8* %call, null
177*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cast.end, label %cast.notnull
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workercast.notnull:                                     ; preds = %entry
180*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %call, i64 4
181*9880d681SAndroid Build Coastguard Worker  br label %cast.end
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workercast.end:                                         ; preds = %cast.notnull, %entry
184*9880d681SAndroid Build Coastguard Worker  %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
185*9880d681SAndroid Build Coastguard Worker  ret i8* %cast.result
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @malloc_can_return_null
188*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp, label %cast.end, label %cast.notnull
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine i32 @call_null() {
192*9880d681SAndroid Build Coastguard Workerentry:
193*9880d681SAndroid Build Coastguard Worker  %call = call i32 null()
194*9880d681SAndroid Build Coastguard Worker  ret i32 %call
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @call_null(
197*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine i32 @call_undef() {
200*9880d681SAndroid Build Coastguard Workerentry:
201*9880d681SAndroid Build Coastguard Worker  %call = call i32 undef()
202*9880d681SAndroid Build Coastguard Worker  ret i32 %call
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @call_undef(
205*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker@GV = private constant [8 x i32] [i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49]
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @partial_masked_load() {
210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @partial_masked_load(
211*9880d681SAndroid Build Coastguard Worker; CHECK:         ret <8 x i32> <i32 undef, i32 undef, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47>
212*9880d681SAndroid Build Coastguard Worker  %masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* bitcast (i32* getelementptr ([8 x i32], [8 x i32]* @GV, i64 0, i64 -2) to <8 x i32>*), i32 4, <8 x i1> <i1 false, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)
213*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %masked.load
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @masked_load_undef_mask(<8 x i32>* %V) {
217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_load_undef_mask(
218*9880d681SAndroid Build Coastguard Worker; CHECK:         ret <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>
219*9880d681SAndroid Build Coastguard Worker  %masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %V, i32 4, <8 x i1> undef, <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>)
220*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %masked.load
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @malloc(i64)
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdeclare <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>*, i32, <8 x i1>, <8 x i32>)
226