[llvm-commits] [llvm] r149836 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp
Duncan Sands
baldrick at free.fr
Sun Feb 5 07:50:43 PST 2012
Author: baldrick
Date: Sun Feb 5 09:50:43 2012
New Revision: 149836
URL: http://llvm.org/viewvc/llvm-project?rev=149836&view=rev
Log:
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.
Modified:
llvm/trunk/lib/Transforms/Scalar/GVN.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=149836&r1=149835&r2=149836&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Sun Feb 5 09:50:43 2012
@@ -1996,28 +1996,30 @@
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) {
- // An edge from Src to Dst.
- if (SawEdgeFromSrc)
- // There are multiple edges from Src to Dst - fail.
- return false;
- SawEdgeFromSrc = true;
+ if (*PI != Src)
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))
+ // An edge from Src to Dst.
+ if (SawEdgeFromSrc)
+ // There are multiple edges from Src to Dst - fail.
return false;
+ SawEdgeFromSrc = true;
}
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
More information about the llvm-commits
mailing list