xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/intrinsics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker%overflow.result = type {i8, i1}
4*9880d681SAndroid Build Coastguard Worker%ov.result.32 = type { i32, i1 }
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8) nounwind readnone
8*9880d681SAndroid Build Coastguard Workerdeclare %overflow.result @llvm.umul.with.overflow.i8(i8, i8) nounwind readnone
9*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
10*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
11*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
12*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
13*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone
14*9880d681SAndroid Build Coastguard Workerdeclare %ov.result.32 @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone
15*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.powi.f64(double, i32) nounwind readonly
16*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) nounwind readnone
17*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone
18*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctpop.i32(i32) nounwind readnone
19*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.ctlz.i8(i8, i1) nounwind readnone
20*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.cos.f64(double %Val) nounwind readonly
21*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sin.f64(double %Val) nounwind readonly
22*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.floor.f64(double %Val) nounwind readonly
23*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.ceil.f64(double %Val) nounwind readonly
24*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.trunc.f64(double %Val) nounwind readonly
25*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.rint.f64(double %Val) nounwind readonly
26*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.nearbyint.f64(double %Val) nounwind readonly
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest1(i8 %A, i8 %B) {
29*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
30*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
31*9880d681SAndroid Build Coastguard Worker  ret i8 %y
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest1(
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %y = add i8 %A, %B
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %y
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest2(i8 %A, i8 %B, i1* %overflowPtr) {
38*9880d681SAndroid Build Coastguard Worker  %and.A = and i8 %A, 127
39*9880d681SAndroid Build Coastguard Worker  %and.B = and i8 %B, 127
40*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %and.A, i8 %and.B)
41*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
42*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
43*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
44*9880d681SAndroid Build Coastguard Worker  ret i8 %y
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest2(
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %and.A = and i8 %A, 127
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %and.B = and i8 %B, 127
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %x = add nuw i8 %and.A, %and.B
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i1 false, i1* %overflowPtr
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %x
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest3(i8 %A, i8 %B, i1* %overflowPtr) {
54*9880d681SAndroid Build Coastguard Worker  %or.A = or i8 %A, -128
55*9880d681SAndroid Build Coastguard Worker  %or.B = or i8 %B, -128
56*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %or.A, i8 %or.B)
57*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
58*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
59*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
60*9880d681SAndroid Build Coastguard Worker  ret i8 %y
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest3(
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %or.A = or i8 %A, -128
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %or.B = or i8 %B, -128
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %x = add i8 %or.A, %or.B
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i1 true, i1* %overflowPtr
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %x
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest4(i8 %A, i1* %overflowPtr) {
70*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 undef, i8 %A)
71*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
72*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
73*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
74*9880d681SAndroid Build Coastguard Worker  ret i8 %y
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest4(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 undef
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest5(i8 %A, i1* %overflowPtr) {
80*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 0, i8 %A)
81*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
82*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
83*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
84*9880d681SAndroid Build Coastguard Worker  ret i8 %y
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest5(
86*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i1 @uaddtest6(i8 %A, i8 %B) {
90*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 -4)
91*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
92*9880d681SAndroid Build Coastguard Worker  ret i1 %z
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest6(
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %z = icmp ugt i8 %A, 3
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %z
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine i8 @uaddtest7(i8 %A, i8 %B) {
99*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
100*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 0
101*9880d681SAndroid Build Coastguard Worker  ret i8 %z
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest7(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %z = add i8 %A, %B
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %z
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; PR20194
108*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @saddtest_nsw(i8 %a, i8 %b) {
109*9880d681SAndroid Build Coastguard Worker  %A = sext i8 %a to i32
110*9880d681SAndroid Build Coastguard Worker  %B = sext i8 %b to i32
111*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.sadd.with.overflow.i32(i32 %A, i32 %B)
112*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @saddtest_nsw
114*9880d681SAndroid Build Coastguard Worker; CHECK: %x = add nsw i32 %A, %B
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @uaddtest_nuw(i32 %a, i32 %b) {
120*9880d681SAndroid Build Coastguard Worker  %A = and i32 %a, 2147483647
121*9880d681SAndroid Build Coastguard Worker  %B = and i32 %b, 2147483647
122*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.uadd.with.overflow.i32(i32 %A, i32 %B)
123*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @uaddtest_nuw
125*9880d681SAndroid Build Coastguard Worker; CHECK: %x = add nuw i32 %A, %B
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @ssubtest_nsw(i8 %a, i8 %b) {
131*9880d681SAndroid Build Coastguard Worker  %A = sext i8 %a to i32
132*9880d681SAndroid Build Coastguard Worker  %B = sext i8 %b to i32
133*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.ssub.with.overflow.i32(i32 %A, i32 %B)
134*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ssubtest_nsw
136*9880d681SAndroid Build Coastguard Worker; CHECK: %x = sub nsw i32 %A, %B
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @usubtest_nuw(i32 %a, i32 %b) {
142*9880d681SAndroid Build Coastguard Worker  %A = or i32 %a, 2147483648
143*9880d681SAndroid Build Coastguard Worker  %B = and i32 %b, 2147483647
144*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.usub.with.overflow.i32(i32 %A, i32 %B)
145*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @usubtest_nuw
147*9880d681SAndroid Build Coastguard Worker; CHECK: %x = sub nuw i32 %A, %B
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @smultest1_nsw(i32 %a, i32 %b) {
153*9880d681SAndroid Build Coastguard Worker  %A = and i32 %a, 4095 ; 0xfff
154*9880d681SAndroid Build Coastguard Worker  %B = and i32 %b, 524287; 0x7ffff
155*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %A, i32 %B)
156*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @smultest1_nsw
158*9880d681SAndroid Build Coastguard Worker; CHECK: %x = mul nuw nsw i32 %A, %B
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @smultest2_nsw(i32 %a, i32 %b) {
164*9880d681SAndroid Build Coastguard Worker  %A = ashr i32 %a, 16
165*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %b, 16
166*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %A, i32 %B)
167*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @smultest2_nsw
169*9880d681SAndroid Build Coastguard Worker; CHECK: %x = mul nsw i32 %A, %B
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @smultest3_sw(i32 %a, i32 %b) {
175*9880d681SAndroid Build Coastguard Worker  %A = ashr i32 %a, 16
176*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %b, 15
177*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %A, i32 %B)
178*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @smultest3_sw
180*9880d681SAndroid Build Coastguard Worker; CHECK: %x = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %A, i32 %B)
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %x
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @umultest_nuw(i32 %a, i32 %b) {
185*9880d681SAndroid Build Coastguard Worker  %A = and i32 %a, 65535 ; 0xffff
186*9880d681SAndroid Build Coastguard Worker  %B = and i32 %b, 65535 ; 0xffff
187*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.umul.with.overflow.i32(i32 %A, i32 %B)
188*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest_nuw
190*9880d681SAndroid Build Coastguard Worker; CHECK: %x = mul nuw i32 %A, %B
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine i8 @umultest1(i8 %A, i1* %overflowPtr) {
196*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 0, i8 %A)
197*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
198*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
199*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
200*9880d681SAndroid Build Coastguard Worker  ret i8 %y
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest1(
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i1 false, i1* %overflowPtr
203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 0
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine i8 @umultest2(i8 %A, i1* %overflowPtr) {
207*9880d681SAndroid Build Coastguard Worker  %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 1, i8 %A)
208*9880d681SAndroid Build Coastguard Worker  %y = extractvalue %overflow.result %x, 0
209*9880d681SAndroid Build Coastguard Worker  %z = extractvalue %overflow.result %x, 1
210*9880d681SAndroid Build Coastguard Worker  store i1 %z, i1* %overflowPtr
211*9880d681SAndroid Build Coastguard Worker  ret i8 %y
212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest2(
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i1 false, i1* %overflowPtr
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 %A
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdefine i32 @umultest3(i32 %n) nounwind {
218*9880d681SAndroid Build Coastguard Worker  %shr = lshr i32 %n, 2
219*9880d681SAndroid Build Coastguard Worker  %mul = call %ov.result.32 @llvm.umul.with.overflow.i32(i32 %shr, i32 3)
220*9880d681SAndroid Build Coastguard Worker  %ov = extractvalue %ov.result.32 %mul, 1
221*9880d681SAndroid Build Coastguard Worker  %res = extractvalue %ov.result.32 %mul, 0
222*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %ov, i32 -1, i32 %res
223*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest3(
225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shr
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul nuw
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdefine i32 @umultest4(i32 %n) nounwind {
231*9880d681SAndroid Build Coastguard Worker  %shr = lshr i32 %n, 1
232*9880d681SAndroid Build Coastguard Worker  %mul = call %ov.result.32 @llvm.umul.with.overflow.i32(i32 %shr, i32 4)
233*9880d681SAndroid Build Coastguard Worker  %ov = extractvalue %ov.result.32 %mul, 1
234*9880d681SAndroid Build Coastguard Worker  %res = extractvalue %ov.result.32 %mul, 0
235*9880d681SAndroid Build Coastguard Worker  %ret = select i1 %ov, i32 -1, i32 %res
236*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest4(
238*9880d681SAndroid Build Coastguard Worker; CHECK: umul.with.overflow
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @umultest5(i32 %x, i32 %y) nounwind {
242*9880d681SAndroid Build Coastguard Worker  %or_x = or i32 %x, 2147483648
243*9880d681SAndroid Build Coastguard Worker  %or_y = or i32 %y, 2147483648
244*9880d681SAndroid Build Coastguard Worker  %mul = call %ov.result.32 @llvm.umul.with.overflow.i32(i32 %or_x, i32 %or_y)
245*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %mul
246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @umultest5(
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[or_x:.*]] = or i32 %x, -2147483648
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[or_y:.*]] = or i32 %y, -2147483648
249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[mul:.*]] = mul i32 %[[or_x]], %[[or_y]]
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[ret:.*]] = insertvalue %ov.result.32 { i32 undef, i1 true }, i32 %[[mul]], 0
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %ov.result.32 %[[ret]]
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdefine void @powi(double %V, double *%P) {
255*9880d681SAndroid Build Coastguard Workerentry:
256*9880d681SAndroid Build Coastguard Worker  %A = tail call double @llvm.powi.f64(double %V, i32 -1) nounwind
257*9880d681SAndroid Build Coastguard Worker  store volatile double %A, double* %P
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.powi.f64(double %V, i32 0) nounwind
260*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.powi.f64(double %V, i32 1) nounwind
263*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
264*9880d681SAndroid Build Coastguard Worker  ret void
265*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @powi(
266*9880d681SAndroid Build Coastguard Worker; CHECK: %A = fdiv double 1.0{{.*}}, %V
267*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double %A,
268*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 1.0
269*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double %V
270*9880d681SAndroid Build Coastguard Worker}
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Workerdefine i32 @cttz(i32 %a) {
273*9880d681SAndroid Build Coastguard Workerentry:
274*9880d681SAndroid Build Coastguard Worker  %or = or i32 %a, 8
275*9880d681SAndroid Build Coastguard Worker  %and = and i32 %or, -8
276*9880d681SAndroid Build Coastguard Worker  %count = tail call i32 @llvm.cttz.i32(i32 %and, i1 true) nounwind readnone
277*9880d681SAndroid Build Coastguard Worker  ret i32 %count
278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cttz(
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 3
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerdefine i8 @ctlz(i8 %a) {
284*9880d681SAndroid Build Coastguard Workerentry:
285*9880d681SAndroid Build Coastguard Worker  %or = or i8 %a, 32
286*9880d681SAndroid Build Coastguard Worker  %and = and i8 %or, 63
287*9880d681SAndroid Build Coastguard Worker  %count = tail call i8 @llvm.ctlz.i8(i8 %and, i1 true) nounwind readnone
288*9880d681SAndroid Build Coastguard Worker  ret i8 %count
289*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ctlz(
290*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 2
292*9880d681SAndroid Build Coastguard Worker}
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Workerdefine void @cmp.simplify(i32 %a, i32 %b, i1* %c) {
295*9880d681SAndroid Build Coastguard Workerentry:
296*9880d681SAndroid Build Coastguard Worker  %lz = tail call i32 @llvm.ctlz.i32(i32 %a, i1 false) nounwind readnone
297*9880d681SAndroid Build Coastguard Worker  %lz.cmp = icmp eq i32 %lz, 32
298*9880d681SAndroid Build Coastguard Worker  store volatile i1 %lz.cmp, i1* %c
299*9880d681SAndroid Build Coastguard Worker  %tz = tail call i32 @llvm.cttz.i32(i32 %a, i1 false) nounwind readnone
300*9880d681SAndroid Build Coastguard Worker  %tz.cmp = icmp ne i32 %tz, 32
301*9880d681SAndroid Build Coastguard Worker  store volatile i1 %tz.cmp, i1* %c
302*9880d681SAndroid Build Coastguard Worker  %pop = tail call i32 @llvm.ctpop.i32(i32 %b) nounwind readnone
303*9880d681SAndroid Build Coastguard Worker  %pop.cmp = icmp eq i32 %pop, 0
304*9880d681SAndroid Build Coastguard Worker  store volatile i1 %pop.cmp, i1* %c
305*9880d681SAndroid Build Coastguard Worker  ret void
306*9880d681SAndroid Build Coastguard Worker; CHECK: @cmp.simplify
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %lz.cmp = icmp eq i32 %a, 0
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store volatile i1 %lz.cmp, i1* %c
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tz.cmp = icmp ne i32 %a, 0
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store volatile i1 %tz.cmp, i1* %c
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %pop.cmp = icmp eq i32 %b, 0
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store volatile i1 %pop.cmp, i1* %c
314*9880d681SAndroid Build Coastguard Worker}
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerdefine i32 @cttz_simplify1a(i32 %x) nounwind readnone ssp {
317*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
318*9880d681SAndroid Build Coastguard Worker  %shr3 = lshr i32 %tmp1, 5
319*9880d681SAndroid Build Coastguard Worker  ret i32 %shr3
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cttz_simplify1a(
322*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %x, 0
323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext i1
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdefine i32 @cttz_simplify1b(i32 %x) nounwind readnone ssp {
328*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true)
329*9880d681SAndroid Build Coastguard Worker  %shr3 = lshr i32 %tmp1, 5
330*9880d681SAndroid Build Coastguard Worker  ret i32 %shr3
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cttz_simplify1b(
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerdefine i32 @ctlz_undef(i32 %Value) nounwind {
337*9880d681SAndroid Build Coastguard Worker  %ctlz = call i32 @llvm.ctlz.i32(i32 0, i1 true)
338*9880d681SAndroid Build Coastguard Worker  ret i32 %ctlz
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ctlz_undef(
341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerdefine i32 @cttz_undef(i32 %Value) nounwind {
345*9880d681SAndroid Build Coastguard Worker  %cttz = call i32 @llvm.cttz.i32(i32 0, i1 true)
346*9880d681SAndroid Build Coastguard Worker  ret i32 %cttz
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cttz_undef(
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerdefine i32 @ctlz_select(i32 %Value) nounwind {
353*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %Value, 0
354*9880d681SAndroid Build Coastguard Worker  %ctlz = call i32 @llvm.ctlz.i32(i32 %Value, i1 true)
355*9880d681SAndroid Build Coastguard Worker  %s = select i1 %tobool, i32 %ctlz, i32 32
356*9880d681SAndroid Build Coastguard Worker  ret i32 %s
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ctlz_select(
359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @llvm.ctlz.i32(i32 %Value, i1 false)
360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerdefine i32 @cttz_select(i32 %Value) nounwind {
364*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %Value, 0
365*9880d681SAndroid Build Coastguard Worker  %cttz = call i32 @llvm.cttz.i32(i32 %Value, i1 true)
366*9880d681SAndroid Build Coastguard Worker  %s = select i1 %tobool, i32 %cttz, i32 32
367*9880d681SAndroid Build Coastguard Worker  ret i32 %s
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cttz_select(
370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @llvm.cttz.i32(i32 %Value, i1 false)
371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
372*9880d681SAndroid Build Coastguard Worker}
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_div_add(
375*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
376*9880d681SAndroid Build Coastguard Workerdefine i1 @overflow_div_add(i32 %v1, i32 %v2) nounwind {
377*9880d681SAndroid Build Coastguard Workerentry:
378*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %v1, 2
379*9880d681SAndroid Build Coastguard Worker  %t = call %ov.result.32 @llvm.sadd.with.overflow.i32(i32 %div, i32 1)
380*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue %ov.result.32 %t, 1
381*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_div_sub(
385*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
386*9880d681SAndroid Build Coastguard Workerdefine i1 @overflow_div_sub(i32 %v1, i32 %v2) nounwind {
387*9880d681SAndroid Build Coastguard Workerentry:
388*9880d681SAndroid Build Coastguard Worker  ; Check cases where the known sign bits are larger than the word size.
389*9880d681SAndroid Build Coastguard Worker  %a = ashr i32 %v1, 18
390*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %a, 65536
391*9880d681SAndroid Build Coastguard Worker  %t = call %ov.result.32 @llvm.ssub.with.overflow.i32(i32 %div, i32 1)
392*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue %ov.result.32 %t, 1
393*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
394*9880d681SAndroid Build Coastguard Worker}
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_mod_mul(
397*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
398*9880d681SAndroid Build Coastguard Workerdefine i1 @overflow_mod_mul(i32 %v1, i32 %v2) nounwind {
399*9880d681SAndroid Build Coastguard Workerentry:
400*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %v1, 1000
401*9880d681SAndroid Build Coastguard Worker  %t = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %rem, i32 %rem)
402*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue %ov.result.32 %t, 1
403*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_mod_overflow_mul(
407*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ret i1 false
408*9880d681SAndroid Build Coastguard Workerdefine i1 @overflow_mod_overflow_mul(i32 %v1, i32 %v2) nounwind {
409*9880d681SAndroid Build Coastguard Workerentry:
410*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %v1, 65537
411*9880d681SAndroid Build Coastguard Worker  ; This may overflow because the result of the mul operands may be greater than 16bits
412*9880d681SAndroid Build Coastguard Worker  ; and the result greater than 32.
413*9880d681SAndroid Build Coastguard Worker  %t = call %ov.result.32 @llvm.smul.with.overflow.i32(i32 %rem, i32 %rem)
414*9880d681SAndroid Build Coastguard Worker  %obit = extractvalue %ov.result.32 %t, 1
415*9880d681SAndroid Build Coastguard Worker  ret i1 %obit
416*9880d681SAndroid Build Coastguard Worker}
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @ssubtest_reorder(i8 %a) {
419*9880d681SAndroid Build Coastguard Worker  %A = sext i8 %a to i32
420*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.ssub.with.overflow.i32(i32 0, i32 %A)
421*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ssubtest_reorder
423*9880d681SAndroid Build Coastguard Worker; CHECK: %x = sub nsw i32 0, %A
424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %1
426*9880d681SAndroid Build Coastguard Worker}
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Workerdefine %ov.result.32 @never_overflows_ssub_test0(i32 %a) {
429*9880d681SAndroid Build Coastguard Worker  %x = call %ov.result.32 @llvm.ssub.with.overflow.i32(i32 %a, i32 0)
430*9880d681SAndroid Build Coastguard Worker  ret %ov.result.32 %x
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @never_overflows_ssub_test0
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[x:.*]] = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %a, 0
433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret %ov.result.32 %[[x]]
434*9880d681SAndroid Build Coastguard Worker}
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Workerdefine void @cos(double *%P) {
437*9880d681SAndroid Build Coastguard Workerentry:
438*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.cos.f64(double 0.0) nounwind
439*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker  ret void
442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cos(
443*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 1.000000e+00, double* %P
444*9880d681SAndroid Build Coastguard Worker}
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workerdefine void @sin(double *%P) {
447*9880d681SAndroid Build Coastguard Workerentry:
448*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.sin.f64(double 0.0) nounwind
449*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker  ret void
452*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sin(
453*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 0.000000e+00, double* %P
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdefine void @floor(double *%P) {
457*9880d681SAndroid Build Coastguard Workerentry:
458*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.floor.f64(double 1.5) nounwind
459*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
460*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.floor.f64(double -1.5) nounwind
461*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
462*9880d681SAndroid Build Coastguard Worker  ret void
463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @floor(
464*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 1.000000e+00, double* %P, align 8
465*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double -2.000000e+00, double* %P, align 8
466*9880d681SAndroid Build Coastguard Worker}
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Workerdefine void @ceil(double *%P) {
469*9880d681SAndroid Build Coastguard Workerentry:
470*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.ceil.f64(double 1.5) nounwind
471*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
472*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.ceil.f64(double -1.5) nounwind
473*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
474*9880d681SAndroid Build Coastguard Worker  ret void
475*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ceil(
476*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 2.000000e+00, double* %P, align 8
477*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double -1.000000e+00, double* %P, align 8
478*9880d681SAndroid Build Coastguard Worker}
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workerdefine void @trunc(double *%P) {
481*9880d681SAndroid Build Coastguard Workerentry:
482*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.trunc.f64(double 1.5) nounwind
483*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
484*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.trunc.f64(double -1.5) nounwind
485*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
486*9880d681SAndroid Build Coastguard Worker  ret void
487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @trunc(
488*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 1.000000e+00, double* %P, align 8
489*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double -1.000000e+00, double* %P, align 8
490*9880d681SAndroid Build Coastguard Worker}
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard Workerdefine void @rint(double *%P) {
493*9880d681SAndroid Build Coastguard Workerentry:
494*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.rint.f64(double 1.5) nounwind
495*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
496*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.rint.f64(double -1.5) nounwind
497*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
498*9880d681SAndroid Build Coastguard Worker  ret void
499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @rint(
500*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 2.000000e+00, double* %P, align 8
501*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double -2.000000e+00, double* %P, align 8
502*9880d681SAndroid Build Coastguard Worker}
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerdefine void @nearbyint(double *%P) {
505*9880d681SAndroid Build Coastguard Workerentry:
506*9880d681SAndroid Build Coastguard Worker  %B = tail call double @llvm.nearbyint.f64(double 1.5) nounwind
507*9880d681SAndroid Build Coastguard Worker  store volatile double %B, double* %P
508*9880d681SAndroid Build Coastguard Worker  %C = tail call double @llvm.nearbyint.f64(double -1.5) nounwind
509*9880d681SAndroid Build Coastguard Worker  store volatile double %C, double* %P
510*9880d681SAndroid Build Coastguard Worker  ret void
511*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nearbyint(
512*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double 2.000000e+00, double* %P, align 8
513*9880d681SAndroid Build Coastguard Worker; CHECK: store volatile double -2.000000e+00, double* %P, align 8
514*9880d681SAndroid Build Coastguard Worker}
515