mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
R600/SI: Fix general commuting breaking src mods
The generic code trying to use findCommutedOpIndices won't understand that it needs to swap the modifier operands also, so it should fail if they are set. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220064 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bf5be3f989
commit
415789c57e
@ -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;
|
||||
|
@ -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<MachineInstr &>(MI), OpName);
|
||||
}
|
||||
};
|
||||
|
||||
namespace AMDGPU {
|
||||
|
Loading…
Reference in New Issue
Block a user