mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[JumpThreading] Factor out code to clone instructions (NFC)
Summary: This patch factors out code to clone instructions -- partly for readability and partly to facilitate an upcoming patch of my own. Reviewers: wmi Subscribers: hiraditya, jfb, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69861
This commit is contained in:
parent
e77f587e1a
commit
05208cfb69
@ -112,6 +112,10 @@ public:
|
||||
bool MaybeMergeBasicBlockIntoOnlyPred(BasicBlock *BB);
|
||||
void UpdateSSA(BasicBlock *BB, BasicBlock *NewBB,
|
||||
DenseMap<Instruction *, Value *> &ValueMapping);
|
||||
DenseMap<Instruction *, Value *> CloneInstructions(BasicBlock::iterator BI,
|
||||
BasicBlock::iterator BE,
|
||||
BasicBlock *NewBB,
|
||||
BasicBlock *PredBB);
|
||||
bool ThreadEdge(BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB);
|
||||
bool DuplicateCondBranchOnPHIIntoPred(
|
||||
|
@ -1973,6 +1973,48 @@ void JumpThreadingPass::UpdateSSA(
|
||||
}
|
||||
}
|
||||
|
||||
/// Clone instructions in range [BI, BE) to NewBB. For PHI nodes, we only clone
|
||||
/// arguments that come from PredBB. Return the map from the variables in the
|
||||
/// source basic block to the variables in the newly created basic block.
|
||||
DenseMap<Instruction *, Value *>
|
||||
JumpThreadingPass::CloneInstructions(BasicBlock::iterator BI,
|
||||
BasicBlock::iterator BE, BasicBlock *NewBB,
|
||||
BasicBlock *PredBB) {
|
||||
// We are going to have to map operands from the source basic block to the new
|
||||
// copy of the block 'NewBB'. If there are PHI nodes in the source basic
|
||||
// block, evaluate them to account for entry from PredBB.
|
||||
DenseMap<Instruction *, Value *> ValueMapping;
|
||||
|
||||
// Clone the phi nodes of the source basic block into NewBB. The resulting
|
||||
// phi nodes are trivial since NewBB only has one predecessor, but SSAUpdater
|
||||
// might need to rewrite the operand of the cloned phi.
|
||||
for (; PHINode *PN = dyn_cast<PHINode>(BI); ++BI) {
|
||||
PHINode *NewPN = PHINode::Create(PN->getType(), 1, PN->getName(), NewBB);
|
||||
NewPN->addIncoming(PN->getIncomingValueForBlock(PredBB), PredBB);
|
||||
ValueMapping[PN] = NewPN;
|
||||
}
|
||||
|
||||
// Clone the non-phi instructions of the source basic block into NewBB,
|
||||
// keeping track of the mapping and using it to remap operands in the cloned
|
||||
// instructions.
|
||||
for (; BI != BE; ++BI) {
|
||||
Instruction *New = BI->clone();
|
||||
New->setName(BI->getName());
|
||||
NewBB->getInstList().push_back(New);
|
||||
ValueMapping[&*BI] = New;
|
||||
|
||||
// Remap operands to patch up intra-block references.
|
||||
for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i)
|
||||
if (Instruction *Inst = dyn_cast<Instruction>(New->getOperand(i))) {
|
||||
DenseMap<Instruction *, Value *>::iterator I = ValueMapping.find(Inst);
|
||||
if (I != ValueMapping.end())
|
||||
New->setOperand(i, I->second);
|
||||
}
|
||||
}
|
||||
|
||||
return ValueMapping;
|
||||
}
|
||||
|
||||
/// ThreadEdge - We have decided that it is safe and profitable to factor the
|
||||
/// blocks in PredBBs to one predecessor, then thread an edge from it to SuccBB
|
||||
/// across BB. Transform the IR to reflect this change.
|
||||
@ -2030,11 +2072,6 @@ bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
LVI->enableDT();
|
||||
LVI->threadEdge(PredBB, BB, SuccBB);
|
||||
|
||||
// We are going to have to map operands from the original BB block to the new
|
||||
// copy of the block 'NewBB'. If there are PHI nodes in BB, evaluate them to
|
||||
// account for entry from PredBB.
|
||||
DenseMap<Instruction*, Value*> ValueMapping;
|
||||
|
||||
BasicBlock *NewBB = BasicBlock::Create(BB->getContext(),
|
||||
BB->getName()+".thread",
|
||||
BB->getParent(), BB);
|
||||
@ -2047,32 +2084,9 @@ bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
BFI->setBlockFreq(NewBB, NewBBFreq.getFrequency());
|
||||
}
|
||||
|
||||
BasicBlock::iterator BI = BB->begin();
|
||||
// Clone the phi nodes of BB into NewBB. The resulting phi nodes are trivial,
|
||||
// since NewBB only has one predecessor, but SSAUpdater might need to rewrite
|
||||
// the operand of the cloned phi.
|
||||
for (; PHINode *PN = dyn_cast<PHINode>(BI); ++BI) {
|
||||
PHINode *NewPN = PHINode::Create(PN->getType(), 1, PN->getName(), NewBB);
|
||||
NewPN->addIncoming(PN->getIncomingValueForBlock(PredBB), PredBB);
|
||||
ValueMapping[PN] = NewPN;
|
||||
}
|
||||
|
||||
// Clone the non-phi instructions of BB into NewBB, keeping track of the
|
||||
// mapping and using it to remap operands in the cloned instructions.
|
||||
for (; !BI->isTerminator(); ++BI) {
|
||||
Instruction *New = BI->clone();
|
||||
New->setName(BI->getName());
|
||||
NewBB->getInstList().push_back(New);
|
||||
ValueMapping[&*BI] = New;
|
||||
|
||||
// Remap operands to patch up intra-block references.
|
||||
for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i)
|
||||
if (Instruction *Inst = dyn_cast<Instruction>(New->getOperand(i))) {
|
||||
DenseMap<Instruction*, Value*>::iterator I = ValueMapping.find(Inst);
|
||||
if (I != ValueMapping.end())
|
||||
New->setOperand(i, I->second);
|
||||
}
|
||||
}
|
||||
// Copy all the instructions from BB to NewBB except the terminator.
|
||||
DenseMap<Instruction *, Value *> ValueMapping =
|
||||
CloneInstructions(BB->begin(), std::prev(BB->end()), NewBB, PredBB);
|
||||
|
||||
// We didn't copy the terminator from BB over to NewBB, because there is now
|
||||
// an unconditional jump to SuccBB. Insert the unconditional jump.
|
||||
|
Loading…
Reference in New Issue
Block a user