@@ -275,6 +275,7 @@ class VOP3_INTERP16 <list<ValueType> ArgVT> : VOPProfile<ArgVT> {
275
275
276
276
let isCommutable = 1 in {
277
277
278
+ let isReMaterializable = 1 in {
278
279
let mayRaiseFPException = 0 in {
279
280
let SubtargetPredicate = HasMadMacF32Insts in {
280
281
defm V_MAD_LEGACY_F32 : VOP3Inst <"v_mad_legacy_f32", VOP3_Profile<VOP_F32_F32_F32_F32>>;
@@ -308,6 +309,7 @@ defm V_MUL_HI_U32 : VOP3Inst <"v_mul_hi_u32", VOP3_Profile<VOP_I32_I32_I32>, mul
308
309
defm V_MUL_LO_I32 : VOP3Inst <"v_mul_lo_i32", VOP3_Profile<VOP_I32_I32_I32>>;
309
310
defm V_MUL_HI_I32 : VOP3Inst <"v_mul_hi_i32", VOP3_Profile<VOP_I32_I32_I32>, mulhs>;
310
311
} // End SchedRW = [WriteIntMul]
312
+ } // End isReMaterializable = 1
311
313
312
314
let Uses = [MODE, VCC, EXEC] in {
313
315
// v_div_fmas_f32:
@@ -328,6 +330,7 @@ defm V_DIV_FMAS_F64 : VOP3Inst_Pseudo_Wrapper <"v_div_fmas_f64", VOP_F64_F64_F6
328
330
329
331
} // End isCommutable = 1
330
332
333
+ let isReMaterializable = 1 in {
331
334
let mayRaiseFPException = 0 in {
332
335
defm V_CUBEID_F32 : VOP3Inst <"v_cubeid_f32", VOP3_Profile<VOP_F32_F32_F32_F32>, int_amdgcn_cubeid>;
333
336
defm V_CUBESC_F32 : VOP3Inst <"v_cubesc_f32", VOP3_Profile<VOP_F32_F32_F32_F32>, int_amdgcn_cubesc>;
@@ -370,6 +373,7 @@ let SchedRW = [WriteDoubleAdd], FPDPRounding = 1 in {
370
373
defm V_DIV_FIXUP_F64 : VOP3Inst <"v_div_fixup_f64", VOP3_Profile<VOP_F64_F64_F64_F64>, AMDGPUdiv_fixup>;
371
374
defm V_LDEXP_F64 : VOP3Inst <"v_ldexp_f64", VOP3_Profile<VOP_F64_F64_I32>, AMDGPUldexp, 1>;
372
375
} // End SchedRW = [WriteDoubleAdd], FPDPRounding = 1
376
+ } // End isReMaterializable = 1
373
377
374
378
375
379
let mayRaiseFPException = 0 in { // Seems suspicious but manual doesn't say it does.
@@ -381,13 +385,15 @@ let mayRaiseFPException = 0 in { // Seems suspicious but manual doesn't say it d
381
385
defm V_DIV_SCALE_F64 : VOP3Inst_Pseudo_Wrapper <"v_div_scale_f64", VOP3b_F64_I1_F64_F64_F64, [], 1>;
382
386
} // End mayRaiseFPException = 0
383
387
388
+ let isReMaterializable = 1 in
384
389
defm V_MSAD_U8 : VOP3Inst <"v_msad_u8", VOP3_Profile<VOP_I32_I32_I32_I32, VOP3_CLAMP>>;
385
390
386
391
let Constraints = "@earlyclobber $vdst" in {
387
392
defm V_MQSAD_PK_U16_U8 : VOP3Inst <"v_mqsad_pk_u16_u8", VOP3_Profile<VOP_I64_I64_I32_I64, VOP3_CLAMP>>;
388
393
} // End Constraints = "@earlyclobber $vdst"
389
394
390
395
396
+ let isReMaterializable = 1 in {
391
397
let SchedRW = [WriteDouble] in {
392
398
defm V_TRIG_PREOP_F64 : VOP3Inst <"v_trig_preop_f64", VOP3_Profile<VOP_F64_F64_I32>, int_amdgcn_trig_preop>;
393
399
} // End SchedRW = [WriteDouble]
@@ -405,12 +411,14 @@ let SchedRW = [Write64Bit] in {
405
411
defm V_ASHRREV_I64 : VOP3Inst <"v_ashrrev_i64", VOP3_Profile<VOP_I64_I32_I64>, ashr_rev>;
406
412
} // End SubtargetPredicate = isGFX8Plus
407
413
} // End SchedRW = [Write64Bit]
414
+ } // End isReMaterializable = 1
408
415
409
416
def : GCNPat<
410
417
(i32 (getDivergentFrag<sext>.ret i16:$src)),
411
418
(i32 (V_BFE_I32_e64 $src, (S_MOV_B32 (i32 0)), (S_MOV_B32 (i32 0x10))))
412
419
>;
413
420
421
+ let isReMaterializable = 1 in {
414
422
let SubtargetPredicate = isGFX6GFX7GFX10 in {
415
423
defm V_MULLIT_F32 : VOP3Inst <"v_mullit_f32", VOP3_Profile<VOP_F32_F32_F32_F32>>;
416
424
} // End SubtargetPredicate = isGFX6GFX7GFX10
@@ -420,6 +428,7 @@ let SubtargetPredicate = isGFX8Plus in {
420
428
defm V_PERM_B32 : VOP3Inst <"v_perm_b32", VOP3_Profile<VOP_I32_I32_I32_I32>, AMDGPUperm>;
421
429
} // End SubtargetPredicate = isGFX8Plus
422
430
} // End SchedRW = [Write32Bit]
431
+ } // End isReMaterializable = 1
423
432
424
433
let SubtargetPredicate = isGFX7Plus in {
425
434
@@ -601,14 +610,14 @@ class ThreeOpFrag<SDPatternOperator op1, SDPatternOperator op2> : PatFrag<
601
610
}
602
611
603
612
let SubtargetPredicate = isGFX9Plus in {
604
- let isCommutable = 1 in {
613
+ let isCommutable = 1, isReMaterializable = 1 in {
605
614
defm V_ADD3_U32 : VOP3Inst <"v_add3_u32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
606
615
defm V_AND_OR_B32 : VOP3Inst <"v_and_or_b32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
607
616
defm V_OR3_B32 : VOP3Inst <"v_or3_b32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
608
617
defm V_XAD_U32 : VOP3Inst <"v_xad_u32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
609
618
defm V_ADD_I32 : VOP3Inst <"v_add_i32", VOP3_Profile<VOP_I32_I32_I32_ARITH>>;
610
619
defm V_ADD_LSHL_U32 : VOP3Inst <"v_add_lshl_u32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
611
- } // End isCommutable = 1
620
+ } // End isCommutable = 1, isReMaterializable = 1
612
621
// TODO src0 contains the opsel bit for dst, so if we commute, need to mask and swap this
613
622
// to the new src0.
614
623
defm V_MED3_F16 : VOP3Inst <"v_med3_f16", VOP3_Profile<VOP_F16_F16_F16_F16, VOP3_OPSEL>, AMDGPUfmed3>;
@@ -632,11 +641,13 @@ defm V_MAD_I32_I16 : VOP3Inst <"v_mad_i32_i16", VOP3_Profile<VOP_I32_I16_I16_I32
632
641
defm V_CVT_PKNORM_I16_F16 : VOP3Inst <"v_cvt_pknorm_i16_f16", VOP3_Profile<VOP_B32_F16_F16, VOP3_OPSEL>>;
633
642
defm V_CVT_PKNORM_U16_F16 : VOP3Inst <"v_cvt_pknorm_u16_f16", VOP3_Profile<VOP_B32_F16_F16, VOP3_OPSEL>>;
634
643
635
- defm V_SUB_I32 : VOP3Inst <"v_sub_i32", VOP3_Profile<VOP_I32_I32_I32_ARITH>>;
636
644
defm V_PACK_B32_F16 : VOP3Inst <"v_pack_b32_f16", VOP3_Profile<VOP_B32_F16_F16, VOP3_OPSEL>>;
645
+
646
+ let isReMaterializable = 1 in {
647
+ defm V_SUB_I32 : VOP3Inst <"v_sub_i32", VOP3_Profile<VOP_I32_I32_I32_ARITH>>;
637
648
defm V_LSHL_ADD_U32 : VOP3Inst <"v_lshl_add_u32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
638
649
defm V_LSHL_OR_B32 : VOP3Inst <"v_lshl_or_b32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
639
-
650
+ } // End isReMaterializable = 1
640
651
641
652
642
653
class ThreeOp_i32_Pats <SDPatternOperator op1, SDPatternOperator op2, Instruction inst> : GCNPat <
@@ -715,9 +726,9 @@ class PermlaneDiscardVDstIn<SDPatternOperator permlane,
715
726
716
727
717
728
let SubtargetPredicate = isGFX10Plus in {
718
- let isCommutable = 1 in {
729
+ let isCommutable = 1, isReMaterializable = 1 in {
719
730
defm V_XOR3_B32 : VOP3Inst <"v_xor3_b32", VOP3_Profile<VOP_I32_I32_I32_I32>>;
720
- } // End isCommutable = 1
731
+ } // End isCommutable = 1, isReMaterializable = 1
721
732
def : ThreeOp_i32_Pats<xor, xor, V_XOR3_B32_e64>;
722
733
723
734
let Constraints = "$vdst = $vdst_in", DisableEncoding="$vdst_in" in {
0 commit comments