svn commit: r309857 - in stable: 10/contrib/llvm/lib/Analysis 11/contrib/llvm/lib/Analysis 9/contrib/llvm/lib/Analysis
Dimitry Andric
dim at FreeBSD.org
Sun Dec 11 19:58:15 UTC 2016
Author: dim
Date: Sun Dec 11 19:58:13 2016
New Revision: 309857
URL: https://svnweb.freebsd.org/changeset/base/309857
Log:
MFC r309722:
Pull in r281586 from upstream llvm trunk (by Wei Mi):
Add some shortcuts in LazyValueInfo to reduce compile time of
Correlated Value Propagation.
The patch is to partially fix PR10584. Correlated Value Propagation
queries LVI to check non-null for pointer params of each callsite. If
we know the def of param is an alloca instruction, we know it is
non-null and can return early from LVI. Similarly, CVP queries LVI to
check whether pointer for each mem access is constant. If the def of
the pointer is an alloca instruction, we know it is not a constant
pointer. These shortcuts can reduce the cost of CVP significantly.
Differential Revision: https://reviews.llvm.org/D18066
This significantly reduces memory usage and compilation time when
compiling a particular C++ source file of the graphics/colmap port.
PR: 215136
Modified:
stable/10/contrib/llvm/lib/Analysis/LazyValueInfo.cpp
Directory Properties:
stable/10/ (props changed)
Changes in other areas also in this revision:
Modified:
stable/11/contrib/llvm/lib/Analysis/LazyValueInfo.cpp
stable/9/contrib/llvm/lib/Analysis/LazyValueInfo.cpp
Directory Properties:
stable/11/ (props changed)
stable/9/contrib/llvm/ (props changed)
Modified: stable/10/contrib/llvm/lib/Analysis/LazyValueInfo.cpp
==============================================================================
--- stable/10/contrib/llvm/lib/Analysis/LazyValueInfo.cpp Sun Dec 11 19:50:39 2016 (r309856)
+++ stable/10/contrib/llvm/lib/Analysis/LazyValueInfo.cpp Sun Dec 11 19:58:13 2016 (r309857)
@@ -1033,7 +1033,26 @@ void LazyValueInfo::releaseMemory() {
}
}
+
+/// Returns true if we can statically tell that this value will never be a
+/// "useful" constant. In practice, this means we've got something like an
+/// alloca or a malloc call for which a comparison against a constant can
+/// only be guarding dead code. Note that we are potentially giving up some
+/// precision in dead code (a constant result) in favour of avoiding a
+/// expensive search for a easily answered common query.
+static bool isKnownNonConstant(Value *V) {
+ V = V->stripPointerCasts();
+ // The return val of alloc cannot be a Constant.
+ if (isa<AllocaInst>(V))
+ return true;
+ return false;
+}
+
Constant *LazyValueInfo::getConstant(Value *V, BasicBlock *BB) {
+ // Bail out early if V is known not to be a Constant.
+ if (isKnownNonConstant(V))
+ return nullptr;
+
LVILatticeVal Result = getCache(PImpl).getValueInBlock(V, BB);
if (Result.isConstant())
More information about the svn-src-stable
mailing list