mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-09 01:38:03 +00:00
AMDGPU/SI: Add implicit register operands in the correct order.
This commit fixes a bug in the class 'SIInstrInfo' where the implicit register machine operands were added to a machine instruction in an incorrect order - the implicit uses were added before the implicit defs. I found this bug while working on moving the implicit register operand verification code from the MIR parser to the machine verifier. This commit also makes the method 'addImplicitDefUseOperands' in the machine instruction class public so that it can be reused in the 'SIInstrInfo' class. Reviewers: Matt Arsenault Differential Revision: http://reviews.llvm.org/D11689 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243799 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c198b23a4d
commit
f5cf675376
@ -1180,6 +1180,8 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/// Add all implicit def and use operands to this instruction.
|
||||
void addImplicitDefUseOperands(MachineFunction &MF);
|
||||
|
||||
private:
|
||||
/// If this instruction is embedded into a MachineFunction, return the
|
||||
@ -1187,9 +1189,6 @@ private:
|
||||
/// return null.
|
||||
MachineRegisterInfo *getRegInfo();
|
||||
|
||||
/// Add all implicit def and use operands to this instruction.
|
||||
void addImplicitDefUseOperands(MachineFunction &MF);
|
||||
|
||||
/// Unlink all of the register operands in this instruction from their
|
||||
/// respective use lists. This requires that the operands already be on their
|
||||
/// use lists.
|
||||
|
@ -2305,7 +2305,7 @@ void SIInstrInfo::moveToVALU(MachineInstr &TopInst) const {
|
||||
Inst->addOperand(MachineOperand::CreateImm(0));
|
||||
}
|
||||
|
||||
addDescImplicitUseDef(NewDesc, Inst);
|
||||
Inst->addImplicitDefUseOperands(*Inst->getParent()->getParent());
|
||||
|
||||
if (Opcode == AMDGPU::S_BFE_I32 || Opcode == AMDGPU::S_BFE_U32) {
|
||||
const MachineOperand &OffsetWidthOp = Inst->getOperand(2);
|
||||
@ -2593,24 +2593,6 @@ void SIInstrInfo::splitScalar64BitBFE(SmallVectorImpl<MachineInstr *> &Worklist,
|
||||
MRI.replaceRegWith(Dest.getReg(), ResultReg);
|
||||
}
|
||||
|
||||
void SIInstrInfo::addDescImplicitUseDef(const MCInstrDesc &NewDesc,
|
||||
MachineInstr *Inst) const {
|
||||
// Add the implict and explicit register definitions.
|
||||
if (NewDesc.ImplicitUses) {
|
||||
for (unsigned i = 0; NewDesc.ImplicitUses[i]; ++i) {
|
||||
unsigned Reg = NewDesc.ImplicitUses[i];
|
||||
Inst->addOperand(MachineOperand::CreateReg(Reg, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
if (NewDesc.ImplicitDefs) {
|
||||
for (unsigned i = 0; NewDesc.ImplicitDefs[i]; ++i) {
|
||||
unsigned Reg = NewDesc.ImplicitDefs[i];
|
||||
Inst->addOperand(MachineOperand::CreateReg(Reg, true, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned SIInstrInfo::findUsedSGPR(const MachineInstr *MI,
|
||||
int OpIndices[3]) const {
|
||||
const MCInstrDesc &Desc = get(MI->getOpcode());
|
||||
|
@ -58,8 +58,6 @@ private:
|
||||
void splitScalar64BitBFE(SmallVectorImpl<MachineInstr *> &Worklist,
|
||||
MachineInstr *Inst) const;
|
||||
|
||||
void addDescImplicitUseDef(const MCInstrDesc &Desc, MachineInstr *MI) const;
|
||||
|
||||
bool checkInstOffsetsDoNotOverlap(MachineInstr *MIa,
|
||||
MachineInstr *MIb) const;
|
||||
|
||||
|
@ -0,0 +1,16 @@
|
||||
; RUN: llc -o /dev/null %s -march=amdgcn -mcpu=verde -verify-machineinstrs -stop-after expand-isel-pseudos 2>&1 | FileCheck %s
|
||||
; This test verifies that the instruction selection will add the implicit
|
||||
; register operands in the correct order when modifying the opcode of an
|
||||
; instruction to V_ADD_I32_e32.
|
||||
|
||||
; CHECK: %19 = V_ADD_I32_e32 killed %13, killed %12, implicit-def %vcc, implicit %exec
|
||||
|
||||
define void @test(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
|
||||
entry:
|
||||
%b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
|
||||
%a = load i32, i32 addrspace(1)* %in
|
||||
%b = load i32, i32 addrspace(1)* %b_ptr
|
||||
%result = add i32 %a, %b
|
||||
store i32 %result, i32 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user