1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

Simplify this code: if the unfolded load can't be hoisted, just delete

the new instructions and leave the old one in place.

llvm-svn: 85393
This commit is contained in:
Dan Gohman 2009-10-28 15:23:36 +00:00
parent fbe911a40e
commit a43a2a10a1

View File

@ -401,7 +401,7 @@ void MachineLICM::Hoist(MachineInstr *MI) {
const TargetRegisterClass *RC = TID.OpInfo[0].getRegClass(TRI);
// Ok, we're unfolding. Create a temporary register and do the unfold.
unsigned Reg = RegInfo->createVirtualRegister(RC);
SmallVector<MachineInstr *, 1> NewMIs;
SmallVector<MachineInstr *, 2> NewMIs;
bool Success =
TII->unfoldMemoryOperand(MF, MI, Reg,
/*UnfoldLoad=*/true, /*UnfoldStore=*/false,
@ -415,28 +415,15 @@ void MachineLICM::Hoist(MachineInstr *MI) {
MachineBasicBlock *MBB = MI->getParent();
MBB->insert(MI, NewMIs[0]);
MBB->insert(MI, NewMIs[1]);
MI->eraseFromParent();
// If unfolding produced a load that wasn't loop-invariant or profitable to
// hoist, re-fold it to undo the damage.
// hoist, discard the new instructions and bail.
if (!IsLoopInvariantInst(*NewMIs[0]) || !IsProfitableToHoist(*NewMIs[0])) {
SmallVector<unsigned, 1> Ops;
for (unsigned i = 0, e = NewMIs[1]->getNumOperands(); i != e; ++i) {
MachineOperand &MO = NewMIs[1]->getOperand(i);
if (MO.isReg() && MO.getReg() == Reg) {
assert(MO.isUse() &&
"Register defined by unfolded load is redefined "
"instead of just used!");
Ops.push_back(i);
}
}
MI = TII->foldMemoryOperand(MF, NewMIs[1], Ops, NewMIs[0]);
assert(MI && "Re-fold failed!");
MBB->insert(NewMIs[1], MI);
NewMIs[0]->eraseFromParent();
NewMIs[1]->eraseFromParent();
return;
}
// Otherwise we successfully unfolded a load that we can hoist.
MI->eraseFromParent();
MI = NewMIs[0];
}