diff --git a/lib/Target/R600/SIInstrInfo.cpp b/lib/Target/R600/SIInstrInfo.cpp index eb8d38cd184..691e108442b 100644 --- a/lib/Target/R600/SIInstrInfo.cpp +++ b/lib/Target/R600/SIInstrInfo.cpp @@ -779,6 +779,12 @@ bool SIInstrInfo::findCommutedOpIndices(MachineInstr *MI, if (!MI->getOperand(Src1Idx).isReg()) return false; + // If any source modifiers are set, the generic instruction commuting won't + // understand how to copy the source modifiers. + if (hasModifiersSet(*MI, AMDGPU::OpName::src0_modifiers) || + hasModifiersSet(*MI, AMDGPU::OpName::src1_modifiers)) + return false; + SrcOpIdx1 = Src0Idx; SrcOpIdx2 = Src1Idx; return true; @@ -982,6 +988,12 @@ bool SIInstrInfo::hasModifiers(unsigned Opcode) const { AMDGPU::OpName::src0_modifiers) != -1; } +bool SIInstrInfo::hasModifiersSet(const MachineInstr &MI, + unsigned OpName) const { + const MachineOperand *Mods = getNamedOperand(MI, OpName); + return Mods && Mods->getImm(); +} + bool SIInstrInfo::usesConstantBus(const MachineRegisterInfo &MRI, const MachineOperand &MO) const { // Literal constants use the constant bus. @@ -2300,7 +2312,7 @@ void SIInstrInfo::reserveIndirectRegisters(BitVector &Reserved, } MachineOperand *SIInstrInfo::getNamedOperand(MachineInstr &MI, - unsigned OperandName) const { + unsigned OperandName) const { int Idx = AMDGPU::getNamedOperandIdx(MI.getOpcode(), OperandName); if (Idx == -1) return nullptr; diff --git a/lib/Target/R600/SIInstrInfo.h b/lib/Target/R600/SIInstrInfo.h index f2edd8cc2c1..5c5d8476235 100644 --- a/lib/Target/R600/SIInstrInfo.h +++ b/lib/Target/R600/SIInstrInfo.h @@ -151,6 +151,10 @@ public: /// \brief Return true if this instruction has any modifiers. /// e.g. src[012]_mod, omod, clamp. bool hasModifiers(unsigned Opcode) const; + + bool hasModifiersSet(const MachineInstr &MI, + unsigned OpName) const; + bool verifyInstruction(const MachineInstr *MI, StringRef &ErrInfo) const override; @@ -231,6 +235,11 @@ public: /// \brief Returns the operand named \p Op. If \p MI does not have an /// operand named \c Op, this function returns nullptr. MachineOperand *getNamedOperand(MachineInstr &MI, unsigned OperandName) const; + + const MachineOperand *getNamedOperand(const MachineInstr &MI, + unsigned OpName) const { + return getNamedOperand(const_cast(MI), OpName); + } }; namespace AMDGPU {