1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

AMDGPU/SI: Fix creating v_mov_b32s without exec uses

This will be caught by existing tests with a
verifier check to be added in a future commit.

llvm-svn: 247229
This commit is contained in:
Matt Arsenault 2015-09-10 01:06:06 +00:00
parent ddb1cf7aeb
commit 238e81b7c6

View File

@ -189,6 +189,7 @@ static bool tryAddToFoldList(std::vector<FoldCandidate> &FoldList,
static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
unsigned UseOpIdx,
std::vector<FoldCandidate> &FoldList,
SmallVectorImpl<MachineInstr *> &CopiesToReplace,
const SIInstrInfo *TII, const SIRegisterInfo &TRI,
MachineRegisterInfo &MRI) {
const MachineOperand &UseOp = UseMI->getOperand(UseOpIdx);
@ -242,6 +243,7 @@ static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
return;
UseMI->setDesc(TII->get(MovOp));
CopiesToReplace.push_back(UseMI);
}
}
@ -261,7 +263,7 @@ static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
continue;
foldOperand(OpToFold, RSUseMI, RSUse.getOperandNo(), FoldList,
TII, TRI, MRI);
CopiesToReplace, TII, TRI, MRI);
}
return;
}
@ -328,6 +330,12 @@ bool SIFoldOperands::runOnMachineFunction(MachineFunction &MF) {
OpToFold.getSubReg()))
continue;
// We need mutate the operands of new mov instructions to add implicit
// uses of EXEC, but adding them invalidates the use_iterator, so defer
// this.
SmallVector<MachineInstr *, 4> CopiesToReplace;
std::vector<FoldCandidate> FoldList;
for (MachineRegisterInfo::use_iterator
Use = MRI.use_begin(MI.getOperand(0).getReg()), E = MRI.use_end();
@ -336,9 +344,13 @@ bool SIFoldOperands::runOnMachineFunction(MachineFunction &MF) {
MachineInstr *UseMI = Use->getParent();
foldOperand(OpToFold, UseMI, Use.getOperandNo(), FoldList,
TII, TRI, MRI);
CopiesToReplace, TII, TRI, MRI);
}
// Make sure we add EXEC uses to any new v_mov instructions created.
for (MachineInstr *Copy : CopiesToReplace)
Copy->addImplicitDefUseOperands(MF);
for (FoldCandidate &Fold : FoldList) {
if (updateOperand(Fold, TRI)) {
// Clear kill flags.