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:
parent
ddb1cf7aeb
commit
238e81b7c6
@ -189,6 +189,7 @@ static bool tryAddToFoldList(std::vector<FoldCandidate> &FoldList,
|
|||||||
static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
|
static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
|
||||||
unsigned UseOpIdx,
|
unsigned UseOpIdx,
|
||||||
std::vector<FoldCandidate> &FoldList,
|
std::vector<FoldCandidate> &FoldList,
|
||||||
|
SmallVectorImpl<MachineInstr *> &CopiesToReplace,
|
||||||
const SIInstrInfo *TII, const SIRegisterInfo &TRI,
|
const SIInstrInfo *TII, const SIRegisterInfo &TRI,
|
||||||
MachineRegisterInfo &MRI) {
|
MachineRegisterInfo &MRI) {
|
||||||
const MachineOperand &UseOp = UseMI->getOperand(UseOpIdx);
|
const MachineOperand &UseOp = UseMI->getOperand(UseOpIdx);
|
||||||
@ -242,6 +243,7 @@ static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
UseMI->setDesc(TII->get(MovOp));
|
UseMI->setDesc(TII->get(MovOp));
|
||||||
|
CopiesToReplace.push_back(UseMI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +263,7 @@ static void foldOperand(MachineOperand &OpToFold, MachineInstr *UseMI,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
foldOperand(OpToFold, RSUseMI, RSUse.getOperandNo(), FoldList,
|
foldOperand(OpToFold, RSUseMI, RSUse.getOperandNo(), FoldList,
|
||||||
TII, TRI, MRI);
|
CopiesToReplace, TII, TRI, MRI);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -328,6 +330,12 @@ bool SIFoldOperands::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
OpToFold.getSubReg()))
|
OpToFold.getSubReg()))
|
||||||
continue;
|
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;
|
std::vector<FoldCandidate> FoldList;
|
||||||
for (MachineRegisterInfo::use_iterator
|
for (MachineRegisterInfo::use_iterator
|
||||||
Use = MRI.use_begin(MI.getOperand(0).getReg()), E = MRI.use_end();
|
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();
|
MachineInstr *UseMI = Use->getParent();
|
||||||
|
|
||||||
foldOperand(OpToFold, UseMI, Use.getOperandNo(), FoldList,
|
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) {
|
for (FoldCandidate &Fold : FoldList) {
|
||||||
if (updateOperand(Fold, TRI)) {
|
if (updateOperand(Fold, TRI)) {
|
||||||
// Clear kill flags.
|
// Clear kill flags.
|
||||||
|
Loading…
Reference in New Issue
Block a user