xref: /llvm-project/llvm/test/Transforms/Util/libcalls-shrinkwrap-double.ll (revision d3c0ed387c478dc07daac575b2ec1216b8044b56)
1; RUN: opt < %s -passes=libcalls-shrinkwrap -S | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6define void @test_range_error(double %value) {
7entry:
8  %call_0 = call double @cosh(double %value)
9; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
10; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
11; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
12; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]]
13; CHECK: [[CALL_LABEL]]:
14; CHECK-NEXT: %call_0 = call double @cosh(double %value)
15; CHECK-NEXT: br label %[[END_LABEL]]
16; CHECK: [[END_LABEL]]:
17
18  %call_1 = call double @exp(double %value)
19; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.450000e+02
20; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
21; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
22; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
23; CHECK: [[CALL_LABEL]]:
24; CHECK-NEXT: %call_1 = call double @exp(double %value)
25; CHECK-NEXT: br label %[[END_LABEL]]
26; CHECK: [[END_LABEL]]:
27
28  %call_3 = call double @exp2(double %value)
29; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -1.074000e+03
30; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 1.023000e+03
31; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
32; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
33; CHECK: [[CALL_LABEL]]:
34; CHECK-NEXT: %call_3 = call double @exp2(double %value)
35; CHECK-NEXT: br label %[[END_LABEL]]
36; CHECK: [[END_LABEL]]:
37
38  %call_4 = call double @sinh(double %value)
39; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
40; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
41; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
42; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
43; CHECK: [[CALL_LABEL]]:
44; CHECK-NEXT: %call_4 = call double @sinh(double %value)
45; CHECK-NEXT: br label %[[END_LABEL]]
46; CHECK: [[END_LABEL]]:
47
48  %call_5 = call double @expm1(double %value)
49; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
50; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
51; CHECK: [[CALL_LABEL]]:
52; CHECK-NEXT: %call_5 = call double @expm1(double %value)
53; CHECK-NEXT: br label %[[END_LABEL]]
54; CHECK: [[END_LABEL]]:
55
56  ret void
57}
58
59define void @test_range_error_strictfp(double %value) strictfp {
60entry:
61  %call_0 = call double @cosh(double %value) strictfp
62; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -7.100000e+02, metadata !"olt", metadata !"fpexcept.strict")
63; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 7.100000e+02, metadata !"ogt", metadata !"fpexcept.strict")
64; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
65; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]]
66; CHECK: [[CALL_LABEL]]:
67; CHECK-NEXT: %call_0 = call double @cosh(double %value)
68; CHECK-NEXT: br label %[[END_LABEL]]
69; CHECK: [[END_LABEL]]:
70
71  %call_1 = call double @exp(double %value) strictfp
72; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -7.450000e+02, metadata !"olt", metadata !"fpexcept.strict")
73; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 7.090000e+02, metadata !"ogt", metadata !"fpexcept.strict")
74; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
75; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
76; CHECK: [[CALL_LABEL]]:
77; CHECK-NEXT: %call_1 = call double @exp(double %value)
78; CHECK-NEXT: br label %[[END_LABEL]]
79; CHECK: [[END_LABEL]]:
80
81  %call_3 = call double @exp2(double %value) strictfp
82; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -1.074000e+03, metadata !"olt", metadata !"fpexcept.strict")
83; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 1.023000e+03, metadata !"ogt", metadata !"fpexcept.strict")
84; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
85; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
86; CHECK: [[CALL_LABEL]]:
87; CHECK-NEXT: %call_3 = call double @exp2(double %value)
88; CHECK-NEXT: br label %[[END_LABEL]]
89; CHECK: [[END_LABEL]]:
90
91  %call_4 = call double @sinh(double %value) strictfp
92; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -7.100000e+02, metadata !"olt", metadata !"fpexcept.strict")
93; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 7.100000e+02, metadata !"ogt", metadata !"fpexcept.strict")
94; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
95; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
96; CHECK: [[CALL_LABEL]]:
97; CHECK-NEXT: %call_4 = call double @sinh(double %value)
98; CHECK-NEXT: br label %[[END_LABEL]]
99; CHECK: [[END_LABEL]]:
100
101  %call_5 = call double @expm1(double %value) strictfp
102; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 7.090000e+02, metadata !"ogt", metadata !"fpexcept.strict")
103; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
104; CHECK: [[CALL_LABEL]]:
105; CHECK-NEXT: %call_5 = call double @expm1(double %value)
106; CHECK-NEXT: br label %[[END_LABEL]]
107; CHECK: [[END_LABEL]]:
108
109  ret void
110}
111
112declare double @cosh(double)
113declare double @exp(double)
114declare double @exp2(double)
115declare double @sinh(double)
116declare double @expm1(double)
117
118define void @test_domain_error(double %value) {
119entry:
120  %call_00 = call double @acos(double %value)
121; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
122; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
123; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
124; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
125; CHECK: [[CALL_LABEL]]:
126; CHECK-NEXT: %call_00 = call double @acos(double %value)
127; CHECK-NEXT: br label %[[END_LABEL]]
128; CHECK: [[END_LABEL]]:
129
130  %call_01 = call double @asin(double %value)
131; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
132; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
133; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
134; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
135; CHECK: [[CALL_LABEL]]:
136; CHECK-NEXT: %call_01 = call double @asin(double %value)
137; CHECK-NEXT: br label %[[END_LABEL]]
138; CHECK: [[END_LABEL]]:
139
140  %call_02 = call double @cos(double %value)
141; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
142; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
143; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
144; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
145; CHECK: [[CALL_LABEL]]:
146; CHECK-NEXT: %call_02 = call double @cos(double %value)
147; CHECK-NEXT: br label %[[END_LABEL]]
148; CHECK: [[END_LABEL]]:
149
150  %call_03 = call double @sin(double %value)
151; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
152; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
153; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
154; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
155; CHECK: [[CALL_LABEL]]:
156; CHECK-NEXT: %call_03 = call double @sin(double %value)
157; CHECK-NEXT: br label %[[END_LABEL]]
158; CHECK: [[END_LABEL]]:
159
160  %call_04 = call double @acosh(double %value)
161; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 1.000000e+00
162; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
163; CHECK: [[CALL_LABEL]]:
164; CHECK-NEXT: %call_04 = call double @acosh(double %value)
165; CHECK-NEXT: br label %[[END_LABEL]]
166; CHECK: [[END_LABEL]]:
167
168  %call_05 = call double @sqrt(double %value)
169; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 0.000000e+00
170; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
171; CHECK: [[CALL_LABEL]]:
172; CHECK-NEXT: %call_05 = call double @sqrt(double %value)
173; CHECK-NEXT: br label %[[END_LABEL]]
174; CHECK: [[END_LABEL]]:
175
176  %call_06 = call double @atanh(double %value)
177; CHECK: [[COND1:%[0-9]+]] = fcmp oge double %value, 1.000000e+00
178; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
179; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
180; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
181; CHECK: [[CALL_LABEL]]:
182; CHECK-NEXT: %call_06 = call double @atanh(double %value)
183; CHECK-NEXT: br label %[[END_LABEL]]
184; CHECK: [[END_LABEL]]:
185
186  %call_07 = call double @log(double %value)
187; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
188; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
189; CHECK: [[CALL_LABEL]]:
190; CHECK-NEXT: %call_07 = call double @log(double %value)
191; CHECK-NEXT: br label %[[END_LABEL]]
192; CHECK: [[END_LABEL]]:
193
194  %call_08 = call double @log10(double %value)
195; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
196; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
197; CHECK: [[CALL_LABEL]]:
198; CHECK-NEXT: %call_08 = call double @log10(double %value)
199; CHECK-NEXT: br label %[[END_LABEL]]
200; CHECK: [[END_LABEL]]:
201
202  %call_09 = call double @log2(double %value)
203; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
204; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
205; CHECK: [[CALL_LABEL]]:
206; CHECK-NEXT: %call_09 = call double @log2(double %value)
207; CHECK-NEXT: br label %[[END_LABEL]]
208; CHECK: [[END_LABEL]]:
209
210  %call_10 = call double @logb(double %value)
211; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
212; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
213; CHECK: [[CALL_LABEL]]:
214; CHECK-NEXT: %call_10 = call double @logb(double %value)
215; CHECK-NEXT: br label %[[END_LABEL]]
216; CHECK: [[END_LABEL]]:
217
218  %call_11 = call double @log1p(double %value)
219; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
220; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
221; CHECK: [[CALL_LABEL]]:
222; CHECK-NEXT: %call_11 = call double @log1p(double %value)
223; CHECK-NEXT: br label %[[END_LABEL]]
224; CHECK: [[END_LABEL]]:
225
226  ret void
227}
228
229define void @test_domain_error_strictfp(double %value) strictfp {
230entry:
231  %call_00 = call double @acos(double %value) strictfp
232; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 1.000000e+00, metadata !"ogt", metadata !"fpexcept.strict")
233; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -1.000000e+00, metadata !"olt", metadata !"fpexcept.strict")
234; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
235; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
236; CHECK: [[CALL_LABEL]]:
237; CHECK-NEXT: %call_00 = call double @acos(double %value)
238; CHECK-NEXT: br label %[[END_LABEL]]
239; CHECK: [[END_LABEL]]:
240
241  %call_01 = call double @asin(double %value) strictfp
242; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 1.000000e+00, metadata !"ogt", metadata !"fpexcept.strict")
243; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -1.000000e+00, metadata !"olt", metadata !"fpexcept.strict")
244; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
245; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
246; CHECK: [[CALL_LABEL]]:
247; CHECK-NEXT: %call_01 = call double @asin(double %value)
248; CHECK-NEXT: br label %[[END_LABEL]]
249; CHECK: [[END_LABEL]]:
250
251  %call_02 = call double @cos(double %value) strictfp
252; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0xFFF0000000000000, metadata !"oeq", metadata !"fpexcept.strict")
253; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0x7FF0000000000000, metadata !"oeq", metadata !"fpexcept.strict")
254; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
255; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
256; CHECK: [[CALL_LABEL]]:
257; CHECK-NEXT: %call_02 = call double @cos(double %value)
258; CHECK-NEXT: br label %[[END_LABEL]]
259; CHECK: [[END_LABEL]]:
260
261  %call_03 = call double @sin(double %value) strictfp
262; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0xFFF0000000000000, metadata !"oeq", metadata !"fpexcept.strict")
263; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0x7FF0000000000000, metadata !"oeq", metadata !"fpexcept.strict")
264; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
265; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
266; CHECK: [[CALL_LABEL]]:
267; CHECK-NEXT: %call_03 = call double @sin(double %value)
268; CHECK-NEXT: br label %[[END_LABEL]]
269; CHECK: [[END_LABEL]]:
270
271  %call_04 = call double @acosh(double %value) strictfp
272; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 1.000000e+00, metadata !"olt", metadata !"fpexcept.strict")
273; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
274; CHECK: [[CALL_LABEL]]:
275; CHECK-NEXT: %call_04 = call double @acosh(double %value)
276; CHECK-NEXT: br label %[[END_LABEL]]
277; CHECK: [[END_LABEL]]:
278
279  %call_05 = call double @sqrt(double %value) strictfp
280; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0.000000e+00, metadata !"olt", metadata !"fpexcept.strict")
281; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
282; CHECK: [[CALL_LABEL]]:
283; CHECK-NEXT: %call_05 = call double @sqrt(double %value)
284; CHECK-NEXT: br label %[[END_LABEL]]
285; CHECK: [[END_LABEL]]:
286
287  %call_06 = call double @atanh(double %value) strictfp
288; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 1.000000e+00, metadata !"oge", metadata !"fpexcept.strict")
289; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -1.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
290; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
291; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
292; CHECK: [[CALL_LABEL]]:
293; CHECK-NEXT: %call_06 = call double @atanh(double %value)
294; CHECK-NEXT: br label %[[END_LABEL]]
295; CHECK: [[END_LABEL]]:
296
297  %call_07 = call double @log(double %value) strictfp
298; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
299; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
300; CHECK: [[CALL_LABEL]]:
301; CHECK-NEXT: %call_07 = call double @log(double %value)
302; CHECK-NEXT: br label %[[END_LABEL]]
303; CHECK: [[END_LABEL]]:
304
305  %call_08 = call double @log10(double %value) strictfp
306; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
307; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
308; CHECK: [[CALL_LABEL]]:
309; CHECK-NEXT: %call_08 = call double @log10(double %value)
310; CHECK-NEXT: br label %[[END_LABEL]]
311; CHECK: [[END_LABEL]]:
312
313  %call_09 = call double @log2(double %value) strictfp
314; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
315; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
316; CHECK: [[CALL_LABEL]]:
317; CHECK-NEXT: %call_09 = call double @log2(double %value)
318; CHECK-NEXT: br label %[[END_LABEL]]
319; CHECK: [[END_LABEL]]:
320
321  %call_10 = call double @logb(double %value) strictfp
322; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
323; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
324; CHECK: [[CALL_LABEL]]:
325; CHECK-NEXT: %call_10 = call double @logb(double %value)
326; CHECK-NEXT: br label %[[END_LABEL]]
327; CHECK: [[END_LABEL]]:
328
329  %call_11 = call double @log1p(double %value) strictfp
330; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %value, double -1.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
331; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
332; CHECK: [[CALL_LABEL]]:
333; CHECK-NEXT: %call_11 = call double @log1p(double %value)
334; CHECK-NEXT: br label %[[END_LABEL]]
335; CHECK: [[END_LABEL]]:
336
337  ret void
338}
339
340declare double @acos(double)
341declare double @asin(double)
342declare double @cos(double)
343declare double @sin(double)
344declare double @acosh(double)
345declare double @sqrt(double)
346declare double @atanh(double)
347declare double @log(double)
348declare double @log10(double)
349declare double @log2(double)
350declare double @logb(double)
351declare double @log1p(double)
352
353define void @test_pow(i32 %int_val, double %exp) {
354  %call = call double @pow(double 2.500000e+00, double %exp)
355; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %exp, 1.270000e+02
356; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
357; CHECK: [[CALL_LABEL]]:
358; CHECK-NEXT: %call = call double @pow(double 2.500000e+00, double %exp)
359; CHECK-NEXT: br label %[[END_LABEL]]
360; CHECK: [[END_LABEL]]:
361
362  %conv = sitofp i32 %int_val to double
363  %call1 = call double @pow(double %conv, double %exp)
364; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 3.200000e+01
365; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv, 0.000000e+00
366; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
367; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
368; CHECK: [[CALL_LABEL]]:
369; CHECK-NEXT: %call1 = call double @pow(double %conv, double %exp)
370; CHECK-NEXT: br label %[[END_LABEL]]
371; CHECK: [[END_LABEL]]:
372
373  %conv2 = trunc i32 %int_val to i8
374  %conv3 = uitofp i8 %conv2 to double
375  %call4 = call double @pow(double %conv3, double %exp)
376; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 1.280000e+02
377; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv3, 0.000000e+00
378; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
379; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
380; CHECK: [[CALL_LABEL]]:
381; CHECK-NEXT: %call4 = call double @pow(double %conv3, double %exp)
382; CHECK-NEXT: br label %[[END_LABEL]]
383; CHECK: [[END_LABEL]]:
384
385
386  %conv5 = trunc i32 %int_val to i16
387  %conv6 = uitofp i16 %conv5 to double
388  %call7 = call double @pow(double %conv6, double %exp)
389; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 6.400000e+01
390; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv6, 0.000000e+00
391; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
392; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
393; CHECK: [[CALL_LABEL]]:
394; CHECK-NEXT: %call7 = call double @pow(double %conv6, double %exp)
395; CHECK-NEXT: br label %[[END_LABEL]]
396; CHECK: [[END_LABEL]]:
397
398  ret void
399}
400
401define void @test_pow_strictfp(i32 %int_val, double %exp) strictfp {
402  %call = call double @pow(double 2.500000e+00, double %exp) strictfp
403; CHECK: [[COND:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %exp, double 1.270000e+02, metadata !"ogt", metadata !"fpexcept.strict")
404; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
405; CHECK: [[CALL_LABEL]]:
406; CHECK-NEXT: %call = call double @pow(double 2.500000e+00, double %exp)
407; CHECK-NEXT: br label %[[END_LABEL]]
408; CHECK: [[END_LABEL]]:
409
410  %conv = sitofp i32 %int_val to double
411  %call1 = call double @pow(double %conv, double %exp) strictfp
412; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %exp, double 3.200000e+01, metadata !"ogt", metadata !"fpexcept.strict")
413; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %conv, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
414; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
415; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
416; CHECK: [[CALL_LABEL]]:
417; CHECK-NEXT: %call1 = call double @pow(double %conv, double %exp)
418; CHECK-NEXT: br label %[[END_LABEL]]
419; CHECK: [[END_LABEL]]:
420
421  %conv2 = trunc i32 %int_val to i8
422  %conv3 = uitofp i8 %conv2 to double
423  %call4 = call double @pow(double %conv3, double %exp) strictfp
424; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %exp, double 1.280000e+02, metadata !"ogt", metadata !"fpexcept.strict")
425; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %conv3, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
426; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
427; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
428; CHECK: [[CALL_LABEL]]:
429; CHECK-NEXT: %call4 = call double @pow(double %conv3, double %exp)
430; CHECK-NEXT: br label %[[END_LABEL]]
431; CHECK: [[END_LABEL]]:
432
433
434  %conv5 = trunc i32 %int_val to i16
435  %conv6 = uitofp i16 %conv5 to double
436  %call7 = call double @pow(double %conv6, double %exp) strictfp
437; CHECK: [[COND1:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %exp, double 6.400000e+01, metadata !"ogt", metadata !"fpexcept.strict")
438; CHECK: [[COND2:%[0-9]+]] = call i1 @llvm.experimental.constrained.fcmp.f64(double %conv6, double 0.000000e+00, metadata !"ole", metadata !"fpexcept.strict")
439; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
440; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
441; CHECK: [[CALL_LABEL]]:
442; CHECK-NEXT: %call7 = call double @pow(double %conv6, double %exp)
443; CHECK-NEXT: br label %[[END_LABEL]]
444; CHECK: [[END_LABEL]]:
445
446  ret void
447}
448
449declare double @pow(double, double)
450
451; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 1048575}
452