mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
[CaptureTracking] Simplify reachability check (NFCI)
This code was re-implementing the same-BB case of isPotentiallyReachable(). Historically, this was done because CaptureTracking used additional caching for local dominance queries. Now that it is no longer needed, the code is effectively the same as isPotentiallyReachable(). The only difference are extra checks for invoke/phis. These are misleading checks related to dominance in the value availability sense that are not relevant for control reachability. The invoke check was correct but redundant in that invokes are always terminators, so `I` could never come before the invoke. The phi check is a matter of interpretation (should an earlier phi node be considered reachable from a later phi node in the same block?) but ultimately doesn't matter because phis don't capture anyway.
This commit is contained in:
parent
88e5c8610b
commit
945b8d0f5d
@ -109,40 +109,11 @@ namespace {
|
||||
if (BeforeHere == I)
|
||||
return !IncludeI;
|
||||
|
||||
BasicBlock *BB = I->getParent();
|
||||
// We explore this usage only if the usage can reach "BeforeHere".
|
||||
// If use is not reachable from entry, there is no need to explore.
|
||||
if (!DT->isReachableFromEntry(BB))
|
||||
if (!DT->isReachableFromEntry(I->getParent()))
|
||||
return true;
|
||||
|
||||
// Compute the case where both instructions are inside the same basic
|
||||
// block.
|
||||
if (BB == BeforeHere->getParent()) {
|
||||
// 'I' dominates 'BeforeHere' => not safe to prune.
|
||||
//
|
||||
// The value defined by an invoke dominates an instruction only
|
||||
// if it dominates every instruction in UseBB. A PHI is dominated only
|
||||
// if the instruction dominates every possible use in the UseBB. Since
|
||||
// UseBB == BB, avoid pruning.
|
||||
if (isa<InvokeInst>(BeforeHere) || isa<PHINode>(I))
|
||||
return false;
|
||||
if (!BeforeHere->comesBefore(I))
|
||||
return false;
|
||||
|
||||
// 'BeforeHere' comes before 'I', it's safe to prune if we also
|
||||
// guarantee that 'I' never reaches 'BeforeHere' through a back-edge or
|
||||
// by its successors, i.e, prune if:
|
||||
//
|
||||
// (1) BB is an entry block or have no successors.
|
||||
// (2) There's no path coming back through BB successors.
|
||||
if (BB->isEntryBlock() || !BB->getTerminator()->getNumSuccessors())
|
||||
return true;
|
||||
|
||||
SmallVector<BasicBlock*, 32> Worklist;
|
||||
Worklist.append(succ_begin(BB), succ_end(BB));
|
||||
return !isPotentiallyReachableFromMany(Worklist, BB, nullptr, DT);
|
||||
}
|
||||
|
||||
// Check whether there is a path from I to BeforeHere.
|
||||
return !isPotentiallyReachable(I, BeforeHere, nullptr, DT);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user