@@ -1250,7 +1250,7 @@ define half @mul_zero_nnan(half %x) {
1250
1250
1251
1251
define <2 x float > @mul_zero_nnan_vec_poison (<2 x float > %x ) {
1252
1252
; CHECK-LABEL: @mul_zero_nnan_vec_poison(
1253
- ; CHECK-NEXT: [[R:%.*]] = call nnan <2 x float> @llvm.copysign.v2f32(<2 x float> <float 0.000000e+00, float poison> , <2 x float> [[X:%.*]])
1253
+ ; CHECK-NEXT: [[R:%.*]] = call nnan <2 x float> @llvm.copysign.v2f32(<2 x float> zeroinitializer , <2 x float> [[X:%.*]])
1254
1254
; CHECK-NEXT: ret <2 x float> [[R]]
1255
1255
;
1256
1256
%r = fmul nnan <2 x float > %x , <float 0 .0 , float poison>
@@ -1268,13 +1268,104 @@ define half @mul_zero(half %x) {
1268
1268
ret half %r
1269
1269
}
1270
1270
1271
- ; TODO: This could be fneg+copysign.
1272
-
1273
1271
define half @mul_negzero_nnan (half %x ) {
1274
1272
; CHECK-LABEL: @mul_negzero_nnan(
1275
- ; CHECK-NEXT: [[R:%.*]] = fmul nnan half [[X:%.*]], 0xH8000
1273
+ ; CHECK-NEXT: [[TMP1:%.*]] = fneg nnan half [[X:%.*]]
1274
+ ; CHECK-NEXT: [[R:%.*]] = call nnan half @llvm.copysign.f16(half 0xH0000, half [[TMP1]])
1276
1275
; CHECK-NEXT: ret half [[R]]
1277
1276
;
1278
1277
%r = fmul nnan half %x , -0 .0
1279
1278
ret half %r
1280
1279
}
1280
+
1281
+ define float @mul_pos_zero_nnan_ninf (float nofpclass(inf nan) %a ) {
1282
+ ; CHECK-LABEL: @mul_pos_zero_nnan_ninf(
1283
+ ; CHECK-NEXT: entry:
1284
+ ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[A:%.*]])
1285
+ ; CHECK-NEXT: ret float [[RET]]
1286
+ ;
1287
+ entry:
1288
+ %ret = fmul float %a , 0 .000000e+00
1289
+ ret float %ret
1290
+ }
1291
+
1292
+ define float @mul_pos_zero_nnan (float nofpclass(nan) %a ) {
1293
+ ; CHECK-LABEL: @mul_pos_zero_nnan(
1294
+ ; CHECK-NEXT: entry:
1295
+ ; CHECK-NEXT: [[RET:%.*]] = fmul float [[A:%.*]], 0.000000e+00
1296
+ ; CHECK-NEXT: ret float [[RET]]
1297
+ ;
1298
+ entry:
1299
+ %ret = fmul float %a , 0 .000000e+00
1300
+ ret float %ret
1301
+ }
1302
+
1303
+ define float @mul_pos_zero_nnan_ninf_fmf (float nofpclass(nan) %a ) {
1304
+ ; CHECK-LABEL: @mul_pos_zero_nnan_ninf_fmf(
1305
+ ; CHECK-NEXT: entry:
1306
+ ; CHECK-NEXT: [[RET:%.*]] = call ninf float @llvm.copysign.f32(float 0.000000e+00, float [[A:%.*]])
1307
+ ; CHECK-NEXT: ret float [[RET]]
1308
+ ;
1309
+ entry:
1310
+ %ret = fmul ninf float %a , 0 .000000e+00
1311
+ ret float %ret
1312
+ }
1313
+
1314
+ define float @mul_neg_zero_nnan_ninf (float nofpclass(inf nan) %a ) {
1315
+ ; CHECK-LABEL: @mul_neg_zero_nnan_ninf(
1316
+ ; CHECK-NEXT: entry:
1317
+ ; CHECK-NEXT: [[TMP0:%.*]] = fneg float [[A:%.*]]
1318
+ ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[TMP0]])
1319
+ ; CHECK-NEXT: ret float [[RET]]
1320
+ ;
1321
+ entry:
1322
+ %ret = fmul float %a , -0 .000000e+00
1323
+ ret float %ret
1324
+ }
1325
+
1326
+ define float @mul_neg_zero_nnan_fmf (float %a ) {
1327
+ ; CHECK-LABEL: @mul_neg_zero_nnan_fmf(
1328
+ ; CHECK-NEXT: entry:
1329
+ ; CHECK-NEXT: [[TMP0:%.*]] = fneg nnan float [[A:%.*]]
1330
+ ; CHECK-NEXT: [[RET:%.*]] = call nnan float @llvm.copysign.f32(float 0.000000e+00, float [[TMP0]])
1331
+ ; CHECK-NEXT: ret float [[RET]]
1332
+ ;
1333
+ entry:
1334
+ %ret = fmul nnan float %a , -0 .000000e+00
1335
+ ret float %ret
1336
+ }
1337
+
1338
+ define float @mul_neg_zero_nnan_ninf_fmf (float nofpclass(inf nan) %a ) {
1339
+ ; CHECK-LABEL: @mul_neg_zero_nnan_ninf_fmf(
1340
+ ; CHECK-NEXT: entry:
1341
+ ; CHECK-NEXT: [[TMP0:%.*]] = fneg nnan ninf float [[A:%.*]]
1342
+ ; CHECK-NEXT: [[RET:%.*]] = call nnan ninf float @llvm.copysign.f32(float 0.000000e+00, float [[TMP0]])
1343
+ ; CHECK-NEXT: ret float [[RET]]
1344
+ ;
1345
+ entry:
1346
+ %ret = fmul nnan ninf float %a , -0 .000000e+00
1347
+ ret float %ret
1348
+ }
1349
+
1350
+ define <3 x float > @mul_neg_zero_nnan_ninf_vec (<3 x float > nofpclass(inf nan) %a ) {
1351
+ ; CHECK-LABEL: @mul_neg_zero_nnan_ninf_vec(
1352
+ ; CHECK-NEXT: entry:
1353
+ ; CHECK-NEXT: [[TMP0:%.*]] = fneg <3 x float> [[A:%.*]]
1354
+ ; CHECK-NEXT: [[RET:%.*]] = call <3 x float> @llvm.copysign.v3f32(<3 x float> zeroinitializer, <3 x float> [[TMP0]])
1355
+ ; CHECK-NEXT: ret <3 x float> [[RET]]
1356
+ ;
1357
+ entry:
1358
+ %ret = fmul <3 x float > %a , <float -0 .0 , float undef , float poison>
1359
+ ret <3 x float > %ret
1360
+ }
1361
+
1362
+ define <3 x float > @mul_mixed_zero_nnan_ninf_vec (<3 x float > nofpclass(inf nan) %a ) {
1363
+ ; CHECK-LABEL: @mul_mixed_zero_nnan_ninf_vec(
1364
+ ; CHECK-NEXT: entry:
1365
+ ; CHECK-NEXT: [[RET:%.*]] = fmul <3 x float> [[A:%.*]], <float -0.000000e+00, float 0.000000e+00, float poison>
1366
+ ; CHECK-NEXT: ret <3 x float> [[RET]]
1367
+ ;
1368
+ entry:
1369
+ %ret = fmul <3 x float > %a , <float -0 .0 , float 0 .0 , float poison>
1370
+ ret <3 x float > %ret
1371
+ }
0 commit comments