[llvm] [AMDGPU] SIPeepholeSDWA: Handle V_CNDMASK_B32_e64 (PR #137930)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 30 02:25:36 PDT 2025
================
@@ -1061,6 +1062,79 @@ void SIPeepholeSDWA::pseudoOpConvertToVOP2(MachineInstr &MI,
MISucc.substituteRegister(CarryIn->getReg(), TRI->getVCC(), 0, *TRI);
}
+static unsigned getVCmpEqOpcode(unsigned Bits) {
+ if (Bits == 64)
+ return AMDGPU::V_CMP_EQ_U64_e64;
+ if (Bits == 32)
+ return AMDGPU::V_CMP_EQ_U32_e64;
+ if (Bits == 16)
+ return AMDGPU::V_CMP_EQ_U16_e64;
+
+ llvm_unreachable("Unexpected register bit width.");
+};
+
+/// Try to convert an \p MI in VOP3 which takes an src2 carry-in
+/// operand into the corresponding VOP2 form which expects the
+/// argument in VCC. To this end, either try to change the definition
+/// of the carry-in operand to write to VCC or add an instruction that
+/// copies from the carry-in to VCC. The conversion will only be
+/// applied if \p MI can be shrunk to VOP2 and if VCC can be proven to
+/// be dead before \p MI.
+void SIPeepholeSDWA::convertToImplicitVcc(MachineInstr &MI,
+ const GCNSubtarget &ST) const {
+ assert(MI.getOpcode() == AMDGPU::V_CNDMASK_B32_e64);
+
+ MCRegister Vcc = TRI->getVCC();
+ // FIXME Conversion introduces implicit vcc_hi use
+ if (Vcc == AMDGPU::VCC_LO)
+ return;
----------------
arsenm wrote:
Need to fix the fixme, this is just dropping support for wave32. The way we handle wave32 is not good, the definitions are wave64 and we have to hack on the instruction after creation to adjust it to wave32. e.g. see fixImplicitOperands
https://github.com/llvm/llvm-project/pull/137930
More information about the llvm-commits
mailing list