mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Reuse operand location when updating PHI instructions.
Calling RemoveOperand is very expensive on huge PHI instructions. This makes early tail duplication run twice as fast on the Firefox JavaScript interpreter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95832 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
598b24c6d1
commit
09eeac9f5f
@ -403,26 +403,45 @@ TailDuplicatePass::UpdateSuccessorsPHIs(MachineBasicBlock *FromBB, bool isDead,
|
||||
II->RemoveOperand(i);
|
||||
}
|
||||
}
|
||||
II->RemoveOperand(Idx+1);
|
||||
II->RemoveOperand(Idx);
|
||||
}
|
||||
} else
|
||||
Idx = 0;
|
||||
|
||||
// If Idx is set, the operands at Idx and Idx+1 must be removed.
|
||||
// We reuse the location to avoid expensive RemoveOperand calls.
|
||||
|
||||
DenseMap<unsigned,AvailableValsTy>::iterator LI=SSAUpdateVals.find(Reg);
|
||||
if (LI != SSAUpdateVals.end()) {
|
||||
// This register is defined in the tail block.
|
||||
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
||||
MachineBasicBlock *SrcBB = LI->second[j].first;
|
||||
unsigned SrcReg = LI->second[j].second;
|
||||
II->addOperand(MachineOperand::CreateReg(SrcReg, false));
|
||||
II->addOperand(MachineOperand::CreateMBB(SrcBB));
|
||||
if (Idx != 0) {
|
||||
II->getOperand(Idx).setReg(SrcReg);
|
||||
II->getOperand(Idx+1).setMBB(SrcBB);
|
||||
Idx = 0;
|
||||
} else {
|
||||
II->addOperand(MachineOperand::CreateReg(SrcReg, false));
|
||||
II->addOperand(MachineOperand::CreateMBB(SrcBB));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Live in tail block, must also be live in predecessors.
|
||||
for (unsigned j = 0, ee = TDBBs.size(); j != ee; ++j) {
|
||||
MachineBasicBlock *SrcBB = TDBBs[j];
|
||||
II->addOperand(MachineOperand::CreateReg(Reg, false));
|
||||
II->addOperand(MachineOperand::CreateMBB(SrcBB));
|
||||
if (Idx != 0) {
|
||||
II->getOperand(Idx).setReg(Reg);
|
||||
II->getOperand(Idx+1).setMBB(SrcBB);
|
||||
Idx = 0;
|
||||
} else {
|
||||
II->addOperand(MachineOperand::CreateReg(Reg, false));
|
||||
II->addOperand(MachineOperand::CreateMBB(SrcBB));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Idx != 0) {
|
||||
II->RemoveOperand(Idx+1);
|
||||
II->RemoveOperand(Idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user