11; Test strict multiplication of two f32s, producing an f64 result.
2- ; FIXME: We should use llvm.experimental.constrained.fpext, but we currently
3- ; cannot match a combination of two strict operations in ISel.
42;
53; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
64
75declare float @foo ()
86declare double @llvm.experimental.constrained.fmul.f64 (double , double , metadata , metadata )
97declare float @llvm.experimental.constrained.fadd.f32 (float , float , metadata , metadata )
108declare float @llvm.experimental.constrained.fptrunc.f32.f64 (double , metadata , metadata )
9+ declare double @llvm.experimental.constrained.fpext.f64.f32 (float , metadata )
1110
1211; Check register multiplication.
1312define double @f1 (float %f1 , float %f2 ) #0 {
1413; CHECK-LABEL: f1:
1514; CHECK: mdebr %f0, %f2
1615; CHECK: br %r14
17- %f1x = fpext float %f1 to double
18- %f2x = fpext float %f2 to double
16+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
17+ float %f1 ,
18+ metadata !"fpexcept.strict" ) #0
19+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
20+ float %f2 ,
21+ metadata !"fpexcept.strict" ) #0
1922 %res = call double @llvm.experimental.constrained.fmul.f64 (
2023 double %f1x , double %f2x ,
2124 metadata !"round.dynamic" ,
@@ -29,8 +32,12 @@ define double @f2(float %f1, float *%ptr) #0 {
2932; CHECK: mdeb %f0, 0(%r2)
3033; CHECK: br %r14
3134 %f2 = load float , float *%ptr
32- %f1x = fpext float %f1 to double
33- %f2x = fpext float %f2 to double
35+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
36+ float %f1 ,
37+ metadata !"fpexcept.strict" ) #0
38+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
39+ float %f2 ,
40+ metadata !"fpexcept.strict" ) #0
3441 %res = call double @llvm.experimental.constrained.fmul.f64 (
3542 double %f1x , double %f2x ,
3643 metadata !"round.dynamic" ,
@@ -45,8 +52,12 @@ define double @f3(float %f1, float *%base) #0 {
4552; CHECK: br %r14
4653 %ptr = getelementptr float , float *%base , i64 1023
4754 %f2 = load float , float *%ptr
48- %f1x = fpext float %f1 to double
49- %f2x = fpext float %f2 to double
55+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
56+ float %f1 ,
57+ metadata !"fpexcept.strict" ) #0
58+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
59+ float %f2 ,
60+ metadata !"fpexcept.strict" ) #0
5061 %res = call double @llvm.experimental.constrained.fmul.f64 (
5162 double %f1x , double %f2x ,
5263 metadata !"round.dynamic" ,
@@ -63,8 +74,12 @@ define double @f4(float %f1, float *%base) #0 {
6374; CHECK: br %r14
6475 %ptr = getelementptr float , float *%base , i64 1024
6576 %f2 = load float , float *%ptr
66- %f1x = fpext float %f1 to double
67- %f2x = fpext float %f2 to double
77+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
78+ float %f1 ,
79+ metadata !"fpexcept.strict" ) #0
80+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
81+ float %f2 ,
82+ metadata !"fpexcept.strict" ) #0
6883 %res = call double @llvm.experimental.constrained.fmul.f64 (
6984 double %f1x , double %f2x ,
7085 metadata !"round.dynamic" ,
@@ -80,8 +95,12 @@ define double @f5(float %f1, float *%base) #0 {
8095; CHECK: br %r14
8196 %ptr = getelementptr float , float *%base , i64 -1
8297 %f2 = load float , float *%ptr
83- %f1x = fpext float %f1 to double
84- %f2x = fpext float %f2 to double
98+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
99+ float %f1 ,
100+ metadata !"fpexcept.strict" ) #0
101+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
102+ float %f2 ,
103+ metadata !"fpexcept.strict" ) #0
85104 %res = call double @llvm.experimental.constrained.fmul.f64 (
86105 double %f1x , double %f2x ,
87106 metadata !"round.dynamic" ,
@@ -98,8 +117,12 @@ define double @f6(float %f1, float *%base, i64 %index) #0 {
98117 %ptr1 = getelementptr float , float *%base , i64 %index
99118 %ptr2 = getelementptr float , float *%ptr1 , i64 100
100119 %f2 = load float , float *%ptr2
101- %f1x = fpext float %f1 to double
102- %f2x = fpext float %f2 to double
120+ %f1x = call double @llvm.experimental.constrained.fpext.f64.f32 (
121+ float %f1 ,
122+ metadata !"fpexcept.strict" ) #0
123+ %f2x = call double @llvm.experimental.constrained.fpext.f64.f32 (
124+ float %f2 ,
125+ metadata !"fpexcept.strict" ) #0
103126 %res = call double @llvm.experimental.constrained.fmul.f64 (
104127 double %f1x , double %f2x ,
105128 metadata !"round.dynamic" ,
@@ -195,8 +218,12 @@ define float @f7(float *%ptr0) #0 {
195218
196219 %ret = call float @foo () #0
197220
198- %accext0 = fpext float %ret to double
199- %ext0 = fpext float %frob0 to double
221+ %accext0 = call double @llvm.experimental.constrained.fpext.f64.f32 (
222+ float %ret ,
223+ metadata !"fpexcept.strict" ) #0
224+ %ext0 = call double @llvm.experimental.constrained.fpext.f64.f32 (
225+ float %frob0 ,
226+ metadata !"fpexcept.strict" ) #0
200227 %mul0 = call double @llvm.experimental.constrained.fmul.f64 (
201228 double %accext0 , double %ext0 ,
202229 metadata !"round.dynamic" ,
@@ -210,8 +237,12 @@ define float @f7(float *%ptr0) #0 {
210237 metadata !"round.dynamic" ,
211238 metadata !"fpexcept.strict" ) #0
212239
213- %accext1 = fpext float %trunc0 to double
214- %ext1 = fpext float %frob1 to double
240+ %accext1 = call double @llvm.experimental.constrained.fpext.f64.f32 (
241+ float %trunc0 ,
242+ metadata !"fpexcept.strict" ) #0
243+ %ext1 = call double @llvm.experimental.constrained.fpext.f64.f32 (
244+ float %frob1 ,
245+ metadata !"fpexcept.strict" ) #0
215246 %mul1 = call double @llvm.experimental.constrained.fmul.f64 (
216247 double %accext1 , double %ext1 ,
217248 metadata !"round.dynamic" ,
@@ -225,8 +256,12 @@ define float @f7(float *%ptr0) #0 {
225256 metadata !"round.dynamic" ,
226257 metadata !"fpexcept.strict" ) #0
227258
228- %accext2 = fpext float %trunc1 to double
229- %ext2 = fpext float %frob2 to double
259+ %accext2 = call double @llvm.experimental.constrained.fpext.f64.f32 (
260+ float %trunc1 ,
261+ metadata !"fpexcept.strict" ) #0
262+ %ext2 = call double @llvm.experimental.constrained.fpext.f64.f32 (
263+ float %frob2 ,
264+ metadata !"fpexcept.strict" ) #0
230265 %mul2 = call double @llvm.experimental.constrained.fmul.f64 (
231266 double %accext2 , double %ext2 ,
232267 metadata !"round.dynamic" ,
@@ -240,8 +275,12 @@ define float @f7(float *%ptr0) #0 {
240275 metadata !"round.dynamic" ,
241276 metadata !"fpexcept.strict" ) #0
242277
243- %accext3 = fpext float %trunc2 to double
244- %ext3 = fpext float %frob3 to double
278+ %accext3 = call double @llvm.experimental.constrained.fpext.f64.f32 (
279+ float %trunc2 ,
280+ metadata !"fpexcept.strict" ) #0
281+ %ext3 = call double @llvm.experimental.constrained.fpext.f64.f32 (
282+ float %frob3 ,
283+ metadata !"fpexcept.strict" ) #0
245284 %mul3 = call double @llvm.experimental.constrained.fmul.f64 (
246285 double %accext3 , double %ext3 ,
247286 metadata !"round.dynamic" ,
@@ -255,8 +294,12 @@ define float @f7(float *%ptr0) #0 {
255294 metadata !"round.dynamic" ,
256295 metadata !"fpexcept.strict" ) #0
257296
258- %accext4 = fpext float %trunc3 to double
259- %ext4 = fpext float %frob4 to double
297+ %accext4 = call double @llvm.experimental.constrained.fpext.f64.f32 (
298+ float %trunc3 ,
299+ metadata !"fpexcept.strict" ) #0
300+ %ext4 = call double @llvm.experimental.constrained.fpext.f64.f32 (
301+ float %frob4 ,
302+ metadata !"fpexcept.strict" ) #0
260303 %mul4 = call double @llvm.experimental.constrained.fmul.f64 (
261304 double %accext4 , double %ext4 ,
262305 metadata !"round.dynamic" ,
@@ -270,8 +313,12 @@ define float @f7(float *%ptr0) #0 {
270313 metadata !"round.dynamic" ,
271314 metadata !"fpexcept.strict" ) #0
272315
273- %accext5 = fpext float %trunc4 to double
274- %ext5 = fpext float %frob5 to double
316+ %accext5 = call double @llvm.experimental.constrained.fpext.f64.f32 (
317+ float %trunc4 ,
318+ metadata !"fpexcept.strict" ) #0
319+ %ext5 = call double @llvm.experimental.constrained.fpext.f64.f32 (
320+ float %frob5 ,
321+ metadata !"fpexcept.strict" ) #0
275322 %mul5 = call double @llvm.experimental.constrained.fmul.f64 (
276323 double %accext5 , double %ext5 ,
277324 metadata !"round.dynamic" ,
@@ -285,8 +332,12 @@ define float @f7(float *%ptr0) #0 {
285332 metadata !"round.dynamic" ,
286333 metadata !"fpexcept.strict" ) #0
287334
288- %accext6 = fpext float %trunc5 to double
289- %ext6 = fpext float %frob6 to double
335+ %accext6 = call double @llvm.experimental.constrained.fpext.f64.f32 (
336+ float %trunc5 ,
337+ metadata !"fpexcept.strict" ) #0
338+ %ext6 = call double @llvm.experimental.constrained.fpext.f64.f32 (
339+ float %frob6 ,
340+ metadata !"fpexcept.strict" ) #0
290341 %mul6 = call double @llvm.experimental.constrained.fmul.f64 (
291342 double %accext6 , double %ext6 ,
292343 metadata !"round.dynamic" ,
@@ -300,8 +351,12 @@ define float @f7(float *%ptr0) #0 {
300351 metadata !"round.dynamic" ,
301352 metadata !"fpexcept.strict" ) #0
302353
303- %accext7 = fpext float %trunc6 to double
304- %ext7 = fpext float %frob7 to double
354+ %accext7 = call double @llvm.experimental.constrained.fpext.f64.f32 (
355+ float %trunc6 ,
356+ metadata !"fpexcept.strict" ) #0
357+ %ext7 = call double @llvm.experimental.constrained.fpext.f64.f32 (
358+ float %frob7 ,
359+ metadata !"fpexcept.strict" ) #0
305360 %mul7 = call double @llvm.experimental.constrained.fmul.f64 (
306361 double %accext7 , double %ext7 ,
307362 metadata !"round.dynamic" ,
@@ -315,8 +370,12 @@ define float @f7(float *%ptr0) #0 {
315370 metadata !"round.dynamic" ,
316371 metadata !"fpexcept.strict" ) #0
317372
318- %accext8 = fpext float %trunc7 to double
319- %ext8 = fpext float %frob8 to double
373+ %accext8 = call double @llvm.experimental.constrained.fpext.f64.f32 (
374+ float %trunc7 ,
375+ metadata !"fpexcept.strict" ) #0
376+ %ext8 = call double @llvm.experimental.constrained.fpext.f64.f32 (
377+ float %frob8 ,
378+ metadata !"fpexcept.strict" ) #0
320379 %mul8 = call double @llvm.experimental.constrained.fmul.f64 (
321380 double %accext8 , double %ext8 ,
322381 metadata !"round.dynamic" ,
@@ -330,8 +389,12 @@ define float @f7(float *%ptr0) #0 {
330389 metadata !"round.dynamic" ,
331390 metadata !"fpexcept.strict" ) #0
332391
333- %accext9 = fpext float %trunc8 to double
334- %ext9 = fpext float %frob9 to double
392+ %accext9 = call double @llvm.experimental.constrained.fpext.f64.f32 (
393+ float %trunc8 ,
394+ metadata !"fpexcept.strict" ) #0
395+ %ext9 = call double @llvm.experimental.constrained.fpext.f64.f32 (
396+ float %frob9 ,
397+ metadata !"fpexcept.strict" ) #0
335398 %mul9 = call double @llvm.experimental.constrained.fmul.f64 (
336399 double %accext9 , double %ext9 ,
337400 metadata !"round.dynamic" ,
0 commit comments