mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +00:00
Reduce the number of non-trivial domtree queries by about 1% when
compiling sqlite3, by only doing dom queries after the cheap check rather than interleaved with it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5b8a1db7ea
commit
68e20223a7
@ -1996,28 +1996,30 @@ static bool isOnlyReachableViaThisEdge(BasicBlock *Src, BasicBlock *Dst,
|
||||
DominatorTree *DT) {
|
||||
// First off, there must not be more than one edge from Src to Dst, there
|
||||
// should be exactly one. So keep track of the number of times Src occurs
|
||||
// as a predecessor of Dst and fail if it's more than once. Secondly, any
|
||||
// other predecessors of Dst should be dominated by Dst (see logic below).
|
||||
// as a predecessor of Dst and fail if it's more than once.
|
||||
bool SawEdgeFromSrc = false;
|
||||
for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) {
|
||||
BasicBlock *Pred = *PI;
|
||||
if (Pred == Src) {
|
||||
if (*PI != Src)
|
||||
continue;
|
||||
// An edge from Src to Dst.
|
||||
if (SawEdgeFromSrc)
|
||||
// There are multiple edges from Src to Dst - fail.
|
||||
return false;
|
||||
SawEdgeFromSrc = true;
|
||||
continue;
|
||||
}
|
||||
// If the predecessor is not dominated by Dst, then it must be possible to
|
||||
// reach it either without passing through Src (and thus not via the edge)
|
||||
// or by passing through Src but taking a different edge out of Src. Either
|
||||
// way it is possible to reach Dst without passing via the edge, so fail.
|
||||
if (!DT->dominates(Dst, *PI))
|
||||
return false;
|
||||
}
|
||||
assert(SawEdgeFromSrc && "No edge between these basic blocks!");
|
||||
|
||||
// Secondly, any other predecessors of Dst should be dominated by Dst. If the
|
||||
// predecessor is not dominated by Dst, then it must be possible to reach it
|
||||
// either without passing through Src (thus not via the edge) or by passing
|
||||
// through Src but taking a different edge out of Src. Either way Dst can be
|
||||
// reached without passing via the edge, so fail.
|
||||
for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) {
|
||||
BasicBlock *Pred = *PI;
|
||||
if (Pred != Src && !DT->dominates(Dst, Pred))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Every path from the entry block to Dst must at some point pass to Dst from
|
||||
// a predecessor that is not dominated by Dst. This predecessor can only be
|
||||
// Src, since all others are dominated by Dst. As there is only one edge from
|
||||
|
Loading…
Reference in New Issue
Block a user