mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 22:30:33 +00:00
[JumpThreading] Refactor ThreadEdge
Summary: This patch moves various checks from ThreadEdge to new function TryThreadEdge The rational behind this is that I'd like to use ThreadEdge without its checks in my upcoming patch. This patch preserves lightweight checks as assertions in ThreadEdge. ThreadEdge does not repeat the cost check, however. Reviewers: wmi Subscribers: hiraditya, jfb, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70338
This commit is contained in:
parent
189d41bfc2
commit
bb2e010798
@ -116,7 +116,10 @@ public:
|
||||
BasicBlock::iterator BE,
|
||||
BasicBlock *NewBB,
|
||||
BasicBlock *PredBB);
|
||||
bool ThreadEdge(BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
bool TryThreadEdge(BasicBlock *BB,
|
||||
const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB);
|
||||
void ThreadEdge(BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB);
|
||||
bool DuplicateCondBranchOnPHIIntoPred(
|
||||
BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs);
|
||||
|
@ -1718,7 +1718,7 @@ bool JumpThreadingPass::ProcessThreadableEdges(Value *Cond, BasicBlock *BB,
|
||||
getSuccessor(GetBestDestForJumpOnUndef(BB));
|
||||
|
||||
// Ok, try to thread it!
|
||||
return ThreadEdge(BB, PredsToFactor, MostPopularDest);
|
||||
return TryThreadEdge(BB, PredsToFactor, MostPopularDest);
|
||||
}
|
||||
|
||||
/// ProcessBranchOnPHI - We have an otherwise unthreadable conditional branch on
|
||||
@ -2016,12 +2016,10 @@ JumpThreadingPass::CloneInstructions(BasicBlock::iterator BI,
|
||||
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.
|
||||
bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB) {
|
||||
/// TryThreadEdge - Thread an edge if it's safe and profitable to do so.
|
||||
bool JumpThreadingPass::TryThreadEdge(
|
||||
BasicBlock *BB, const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB) {
|
||||
// If threading to the same block as we come from, we would infinite loop.
|
||||
if (SuccBB == BB) {
|
||||
LLVM_DEBUG(dbgs() << " Not threading across BB '" << BB->getName()
|
||||
@ -2051,6 +2049,21 @@ bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
return false;
|
||||
}
|
||||
|
||||
ThreadEdge(BB, PredBBs, SuccBB);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// 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.
|
||||
void JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
const SmallVectorImpl<BasicBlock *> &PredBBs,
|
||||
BasicBlock *SuccBB) {
|
||||
assert(SuccBB != BB && "Don't create an infinite loop");
|
||||
|
||||
assert(!LoopHeaders.count(BB) && !LoopHeaders.count(SuccBB) &&
|
||||
"Don't thread across loop headers");
|
||||
|
||||
// And finally, do it! Start by factoring the predecessors if needed.
|
||||
BasicBlock *PredBB;
|
||||
if (PredBBs.size() == 1)
|
||||
@ -2064,7 +2077,6 @@ bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
// And finally, do it!
|
||||
LLVM_DEBUG(dbgs() << " Threading edge from '" << PredBB->getName()
|
||||
<< "' to '" << SuccBB->getName()
|
||||
<< "' with cost: " << JumpThreadCost
|
||||
<< ", across block:\n " << *BB << "\n");
|
||||
|
||||
if (DTU->hasPendingDomTreeUpdates())
|
||||
@ -2125,7 +2137,6 @@ bool JumpThreadingPass::ThreadEdge(BasicBlock *BB,
|
||||
|
||||
// Threaded an edge!
|
||||
++NumThreads;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Create a new basic block that will be the predecessor of BB and successor of
|
||||
|
Loading…
Reference in New Issue
Block a user