Skip to content
Snippets Groups Projects
Commit 26890395 authored by Duncan Sands's avatar Duncan Sands
Browse files

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.

llvm-svn: 149836
parent ae22c60f
No related branches found
No related tags found
No related merge requests found
...@@ -1996,28 +1996,30 @@ static bool isOnlyReachableViaThisEdge(BasicBlock *Src, BasicBlock *Dst, ...@@ -1996,28 +1996,30 @@ static bool isOnlyReachableViaThisEdge(BasicBlock *Src, BasicBlock *Dst,
DominatorTree *DT) { DominatorTree *DT) {
// First off, there must not be more than one edge from Src to Dst, there // 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 // 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 // as a predecessor of Dst and fail if it's more than once.
// other predecessors of Dst should be dominated by Dst (see logic below).
bool SawEdgeFromSrc = false; bool SawEdgeFromSrc = false;
for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) { for (pred_iterator PI = pred_begin(Dst), PE = pred_end(Dst); PI != PE; ++PI) {
BasicBlock *Pred = *PI; if (*PI != Src)
if (Pred == Src) {
// An edge from Src to Dst.
if (SawEdgeFromSrc)
// There are multiple edges from Src to Dst - fail.
return false;
SawEdgeFromSrc = true;
continue; continue;
} // An edge from Src to Dst.
// If the predecessor is not dominated by Dst, then it must be possible to if (SawEdgeFromSrc)
// reach it either without passing through Src (and thus not via the edge) // There are multiple edges from Src to Dst - fail.
// 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; return false;
SawEdgeFromSrc = true;
} }
assert(SawEdgeFromSrc && "No edge between these basic blocks!"); 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 // 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 // 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 // Src, since all others are dominated by Dst. As there is only one edge from
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment