511 : ST(&_ST), MRI(&_MRI) {
513 addRulesForGOpcs({G_ADD, G_SUB},
Standard)
523 addRulesForGOpcs({G_UADDO, G_USUBO},
Standard)
527 addRulesForGOpcs({G_UADDE, G_USUBE, G_SADDE, G_SSUBE},
Standard)
531 addRulesForGOpcs({G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT},
Standard)
539 bool HasVecMulU64 = ST->hasVectorMulU64();
551 bool hasMulHi = ST->hasScalarMulHiInsts();
552 addRulesForGOpcs({G_UMULH, G_SMULH},
Standard)
557 addRulesForGOpcs({G_AMDGPU_MAD_U64_U32},
Standard)
561 bool HasScalarSMulU64 = ST->hasScalarSMulU64();
562 addRulesForGOpcs({G_AMDGPU_S_MUL_U64_U32, G_AMDGPU_S_MUL_I64_I32},
Standard)
566 addRulesForGOpcs({G_XOR, G_OR, G_AND},
StandardB)
586 addRulesForGOpcs({G_LSHR},
Standard)
596 addRulesForGOpcs({G_ASHR},
Standard)
606 addRulesForGOpcs({G_FSHR},
Standard)
610 addRulesForGOpcs({G_BSWAP},
Standard)
618 addRulesForGOpcs({G_AMDGPU_CVT_F32_UBYTE0, G_AMDGPU_CVT_F32_UBYTE1,
619 G_AMDGPU_CVT_F32_UBYTE2, G_AMDGPU_CVT_F32_UBYTE3,
627 addRulesForGOpcs({G_UBFX, G_SBFX},
Standard)
633 addRulesForGOpcs({G_SMIN, G_SMAX},
Standard)
641 addRulesForGOpcs({G_UMIN, G_UMAX},
Standard)
652 addRulesForGOpcs({G_CONSTANT})
655 addRulesForGOpcs({G_FREEZE})
662 addRulesForGOpcs({G_UNMERGE_VALUES})
667 addRulesForGOpcs({G_PHI})
677 addRulesForGOpcs({G_AMDGPU_INTRIN_IMAGE_LOAD, G_AMDGPU_INTRIN_IMAGE_LOAD_D16,
678 G_AMDGPU_INTRIN_IMAGE_LOAD_NORET,
679 G_AMDGPU_INTRIN_IMAGE_STORE,
680 G_AMDGPU_INTRIN_IMAGE_STORE_D16})
695 bool HasScalarCompareEq64 = ST->hasScalarCompareEq64();
697 addRulesForGOpcs({G_ICMP})
716 addRulesForGOpcs({G_BRCOND})
720 addRulesForGOpcs({G_BR}).
Any({{
_}, {{}, {
None}}});
730 addRulesForGOpcs({G_ANYEXT})
742 bool Has16bitCmp = ST->has16BitInsts();
746 addRulesForGOpcs({G_TRUNC})
763 addRulesForGOpcs({G_ZEXT})
778 addRulesForGOpcs({G_SEXT})
793 addRulesForGOpcs({G_SEXT_INREG})
799 addRulesForGOpcs({G_ASSERT_ZEXT, G_ASSERT_SEXT},
Standard)
805 addRulesForGOpcs({G_ASSERT_ALIGN},
Standard)
817 addRulesForGOpcs({G_ATOMICRMW_ADD, G_ATOMICRMW_SUB, G_ATOMICRMW_XCHG,
818 G_ATOMICRMW_AND, G_ATOMICRMW_OR, G_ATOMICRMW_XOR,
819 G_ATOMICRMW_MIN, G_ATOMICRMW_MAX, G_ATOMICRMW_UMIN,
820 G_ATOMICRMW_UMAX, G_ATOMICRMW_UINC_WRAP,
821 G_ATOMICRMW_UDEC_WRAP, G_ATOMICRMW_FMIN, G_ATOMICRMW_FMAX})
829 bool HasAtomicFlatPkAdd16Insts = ST->hasAtomicFlatPkAdd16Insts();
830 bool HasAtomicBufferGlobalPkAddF16Insts =
831 ST->hasAtomicBufferGlobalPkAddF16NoRtnInsts() ||
832 ST->hasAtomicBufferGlobalPkAddF16Insts();
833 bool HasAtomicDsPkAdd16Insts = ST->hasAtomicDsPkAdd16Insts();
834 addRulesForGOpcs({G_ATOMICRMW_FADD})
842 HasAtomicFlatPkAdd16Insts)
844 HasAtomicBufferGlobalPkAddF16Insts)
846 HasAtomicDsPkAdd16Insts);
848 addRulesForGOpcs({G_ATOMIC_CMPXCHG})
854 addRulesForGOpcs({G_AMDGPU_ATOMIC_CMPXCHG})
860 addRulesForGOpcs({G_AMDGPU_BUFFER_ATOMIC_CMPSWAP},
Standard)
866 addRulesForGOpcs({G_AMDGPU_BUFFER_ATOMIC_SWAP, G_AMDGPU_BUFFER_ATOMIC_UMAX,
867 G_AMDGPU_BUFFER_ATOMIC_UMIN, G_AMDGPU_BUFFER_ATOMIC_SMAX,
868 G_AMDGPU_BUFFER_ATOMIC_SMIN, G_AMDGPU_BUFFER_ATOMIC_FMAX,
869 G_AMDGPU_BUFFER_ATOMIC_FMIN},
874 bool hasSMRDx3 = ST->hasScalarDwordx3Loads();
875 bool hasSMRDSmall = ST->hasScalarSubwordLoads();
876 bool usesTrue16 = ST->useRealTrue16Insts();
879 return (*
MI.memoperands_begin())->getAlign() >=
Align(16);
883 return (*
MI.memoperands_begin())->getAlign() >=
Align(4);
887 return (*
MI.memoperands_begin())->isAtomic();
903 return (*
MI.memoperands_begin())->isVolatile();
907 return (*
MI.memoperands_begin())->isInvariant();
922 return MemSize == 16 || MemSize == 8;
930 auto isUL = !isAtomicMMO && isUniMMO && (isConst || !isVolatileMMO) &&
931 (isConst || isInvMMO || isNoClobberMMO);
935 addRulesForGOpcs({G_LOAD})
1042 addRulesForGOpcs({G_ZEXTLOAD, G_SEXTLOAD})
1062 addRulesForGOpcs({G_STORE})
1098 addRulesForGOpcs({G_AMDGPU_BUFFER_LOAD, G_AMDGPU_BUFFER_LOAD_FORMAT,
1099 G_AMDGPU_TBUFFER_LOAD_FORMAT},
1110 addRulesForGOpcs({G_AMDGPU_BUFFER_LOAD_USHORT, G_AMDGPU_BUFFER_LOAD_UBYTE,
1111 G_AMDGPU_BUFFER_LOAD_SSHORT, G_AMDGPU_BUFFER_LOAD_SBYTE},
1117 {G_AMDGPU_BUFFER_LOAD_UBYTE_TFE, G_AMDGPU_BUFFER_LOAD_USHORT_TFE},
1122 addRulesForGOpcs({G_AMDGPU_BUFFER_LOAD_TFE, G_AMDGPU_BUFFER_LOAD_FORMAT_TFE},
1135 {G_AMDGPU_BUFFER_LOAD_FORMAT_D16, G_AMDGPU_TBUFFER_LOAD_FORMAT_D16},
1144 addRulesForGOpcs({G_AMDGPU_BUFFER_STORE, G_AMDGPU_BUFFER_STORE_BYTE,
1145 G_AMDGPU_BUFFER_STORE_SHORT, G_AMDGPU_BUFFER_STORE_FORMAT,
1146 G_AMDGPU_BUFFER_STORE_FORMAT_D16,
1147 G_AMDGPU_TBUFFER_STORE_FORMAT,
1148 G_AMDGPU_TBUFFER_STORE_FORMAT_D16})
1160 addRulesForGOpcs({G_AMDGPU_BUFFER_ATOMIC_FADD})
1169 addRulesForGOpcs({G_PTR_ADD})
1175 addRulesForGOpcs({G_INTTOPTR})
1183 addRulesForGOpcs({G_PTRTOINT})
1193 addRulesForGOpcs({G_PTRMASK})
1201 addRulesForGOpcs({G_BITREVERSE},
Standard)
1207 addRulesForGOpcs({G_AMDGPU_FFBH_U32, G_AMDGPU_FFBL_B32, G_CTLZ_ZERO_UNDEF,
1214 addRulesForGOpcs({G_FENCE}).
Any({{{}}, {{}, {}}});
1216 addRulesForGOpcs({G_READSTEADYCOUNTER, G_READCYCLECOUNTER},
Standard)
1221 addRulesForGOpcs({G_GLOBAL_VALUE})
1228 addRulesForGOpcs({G_AMDGPU_WAVE_ADDRESS}).
Any({{
UniP5}, {{
SgprP5}, {}}});
1230 addRulesForGOpcs({G_SI_CALL})
1236 bool hasSALUFloat = ST->hasSALUFloatInsts();
1238 addRulesForGOpcs({G_FADD, G_FMUL, G_STRICT_FADD, G_STRICT_FMUL},
Standard)
1252 addRulesForGOpcs({G_FSUB, G_STRICT_FSUB},
Standard)
1260 addRulesForGOpcs({G_FMAD},
Standard)
1266 addRulesForGOpcs({G_FLDEXP, G_STRICT_FLDEXP},
Standard)
1274 addRulesForGOpcs({G_FMA, G_STRICT_FMA},
Standard)
1292 addRulesForGOpcs({G_AMDGPU_FMED3},
Standard)
1301 addRulesForGOpcs({G_AMDGPU_SMED3},
Standard)
1309 addRulesForGOpcs({G_FNEG, G_FABS},
Standard)
1324 addRulesForGOpcs({G_FCANONICALIZE},
Standard)
1336 bool hasPST = ST->hasPseudoScalarTrans();
1337 addRulesForGOpcs({G_FSQRT},
Standard)
1342 addRulesForGOpcs({G_FPTOUI, G_FPTOSI})
1354 addRulesForGOpcs({G_UITOFP, G_SITOFP})
1366 addRulesForGOpcs({G_FPEXT})
1373 addRulesForGOpcs({G_AMDGPU_CVT_PK_I16_I32},
Standard)
1377 addRulesForGOpcs({G_AMDGPU_FMIN_LEGACY, G_AMDGPU_FMAX_LEGACY},
Standard)
1381 bool hasSALUMinimumMaximumInsts = ST->hasSALUMinimumMaximumInsts();
1383 addRulesForGOpcs({G_FMINIMUM, G_FMAXIMUM},
Standard)
1395 addRulesForGOpcs({G_FMINNUM_IEEE, G_FMAXNUM_IEEE, G_FMINNUM, G_FMAXNUM},
1408 addRulesForGOpcs({G_FPTRUNC})
1417 addRulesForGOpcs({G_IS_FPCLASS})
1425 addRulesForGOpcs({G_FCMP},
Standard)
1439 addRulesForGOpcs({G_INTRINSIC_TRUNC, G_INTRINSIC_ROUNDEVEN, G_FFLOOR, G_FCEIL,
1455 addRulesForIOpcs({amdgcn_s_setreg})
1461 addRulesForIOpcs({amdgcn_endpgm,
1463 amdgcn_s_barrier_signal,
1464 amdgcn_s_barrier_wait,
1469 amdgcn_s_wait_asynccnt,
1470 amdgcn_s_wait_bvhcnt,
1471 amdgcn_s_wait_dscnt,
1472 amdgcn_s_wait_event,
1473 amdgcn_s_wait_event_export_ready,
1474 amdgcn_s_wait_expcnt,
1475 amdgcn_s_wait_kmcnt,
1476 amdgcn_s_wait_loadcnt,
1477 amdgcn_s_wait_samplecnt,
1478 amdgcn_s_wait_storecnt,
1479 amdgcn_s_wait_tensorcnt,
1481 amdgcn_wave_barrier})
1482 .
Any({{}, {{}, {}}});
1485 addRulesForIOpcs({amdgcn_end_cf})
1489 addRulesForIOpcs({amdgcn_if_break},
Standard)
1493 addRulesForIOpcs({amdgcn_exp})
1497 addRulesForIOpcs({amdgcn_exp_row})
1503 addRulesForIOpcs({amdgcn_lds_param_load},
Standard)
1506 addRulesForIOpcs({amdgcn_mbcnt_lo, amdgcn_mbcnt_hi},
Standard)
1509 addRulesForIOpcs({amdgcn_readfirstlane})
1515 addRulesForIOpcs({amdgcn_wave_reduce_umax, amdgcn_wave_reduce_umin},
Standard)
1521 addRulesForIOpcs({amdgcn_bitop3},
Standard)
1527 addRulesForIOpcs({amdgcn_mul_u24, amdgcn_mul_i24},
Standard)
1533 addRulesForIOpcs({amdgcn_mulhi_u24, amdgcn_mulhi_i24, amdgcn_fmul_legacy},
1538 addRulesForIOpcs({amdgcn_fma_legacy},
Standard)
1542 addRulesForIOpcs({amdgcn_frexp_mant, amdgcn_fract},
Standard)
1550 addRulesForIOpcs({amdgcn_prng_b32})
1554 addRulesForIOpcs({amdgcn_sffbh},
Standard)
1558 addRulesForIOpcs({amdgcn_ubfe, amdgcn_sbfe},
Standard)
1564 addRulesForIOpcs({amdgcn_cvt_pk_u16, amdgcn_cvt_pk_i16, amdgcn_cvt_pkrtz},
1569 addRulesForIOpcs({amdgcn_global_load_tr_b64})
1573 addRulesForIOpcs({amdgcn_global_load_tr_b128})
1577 addRulesForIOpcs({amdgcn_global_atomic_ordered_add_b64})
1581 {amdgcn_global_atomic_fmin_num, amdgcn_global_atomic_fmax_num},
Standard)
1584 addRulesForIOpcs({amdgcn_flat_atomic_fmin_num, amdgcn_flat_atomic_fmax_num},
1588 addRulesForIOpcs({amdgcn_raw_buffer_load_lds})
1591 addRulesForIOpcs({amdgcn_struct_buffer_load_lds})
1595 addRulesForIOpcs({amdgcn_raw_ptr_buffer_load_lds})
1598 addRulesForIOpcs({amdgcn_struct_ptr_buffer_load_lds})
1601 addRulesForIOpcs({amdgcn_wwm, amdgcn_strict_wwm, amdgcn_wqm, amdgcn_softwqm,
1617 addRulesForIOpcs({amdgcn_sin, amdgcn_cos},
Standard)
1624 {amdgcn_ds_bvh_stack_rtn, amdgcn_ds_bvh_stack_push4_pop1_rtn},
Standard)
1627 addRulesForIOpcs({amdgcn_ds_bvh_stack_push8_pop1_rtn},
Standard)
1630 addRulesForIOpcs({amdgcn_ds_bvh_stack_push8_pop2_rtn},
Standard)
1633 addRulesForIOpcs({amdgcn_ds_swizzle},
Standard)
1637 addRulesForIOpcs({amdgcn_ds_read_tr4_b64, amdgcn_ds_read_tr8_b64})
1640 addRulesForIOpcs({amdgcn_ds_read_tr6_b96})
1643 addRulesForIOpcs({amdgcn_ds_read_tr16_b64})