From cd1d79e77ce7920688eb11596138bc5954d116b0 Mon Sep 17 00:00:00 2001 From: Jiangning Liu Date: Mon, 22 Sep 2014 02:23:05 +0000 Subject: [PATCH] Add two thresholds lvi-overdefined-BB-threshold and lvi-overdefined-threshold for LVI algorithm. For a specific value to be lowered, when the number of basic blocks being checked for overdefined lattice value is larger than lvi-overdefined-BB-threshold, or the times of encountering overdefined value for a single basic block is larger than lvi-overdefined-threshold, the LVI algorithm will stop further lowering the lattice value. llvm-svn: 218231 --- llvm/lib/Analysis/LazyValueInfo.cpp | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 3062cfa19497..961fb0f7aef9 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -27,6 +27,7 @@ #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/PatternMatch.h" #include "llvm/IR/ValueHandle.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetLibraryInfo.h" @@ -37,6 +38,20 @@ using namespace PatternMatch; #define DEBUG_TYPE "lazy-value-info" +// Experimentally derived threshold for the number of basic blocks lowered for +// lattice value overdefined. +static cl::opt +OverdefinedBBThreshold("lvi-overdefined-BB-threshold", + cl::init(1500), cl::Hidden, + cl::desc("Threshold of the number of basic blocks lowered for lattice value" + "'overdefined'.")); + +// Experimentally derived threshold for additional lowering lattice values +// overdefined per block. +static cl::opt +OverdefinedThreshold("lvi-overdefined-threshold", cl::init(10), cl::Hidden, + cl::desc("Threshold of lowering lattice value 'overdefined'.")); + char LazyValueInfo::ID = 0; INITIALIZE_PASS_BEGIN(LazyValueInfo, "lazy-value-info", "Lazy Value Information Analysis", false, true) @@ -348,6 +363,9 @@ namespace { const DataLayout *DL; /// An optional DT pointer. DominatorTree *DT; + /// A counter to record how many times Overdefined has been tried to be + /// lowered. + DenseMap LoweringOverdefinedTimes; friend struct LVIValueHandle; @@ -480,6 +498,9 @@ void LazyValueInfoCache::eraseBlock(BasicBlock *BB) { } void LazyValueInfoCache::solve() { + // Reset the counter of lowering overdefined value. + LoweringOverdefinedTimes.clear(); + while (!BlockValueStack.empty()) { std::pair &e = BlockValueStack.top(); if (solveBlockValue(e.second, e.first)) { @@ -539,8 +560,16 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) { // BB2. So we should have to follow data flow propagation algorithm to get the // value on edge BB1->BB2 propagated to BB2, and finally %v on BB2 has a // constant range describing a negative value. + // + // In the mean time, limit the number of additional lowering lattice value to + // avoid unjustified memory grows. - if (!BBLV.isUndefined() && !BBLV.isOverdefined()) { + if (LoweringOverdefinedTimes.count(BB) == 0) + LoweringOverdefinedTimes.insert(std::make_pair(BB, 0)); + if ((!BBLV.isUndefined() && !BBLV.isOverdefined()) || + (BBLV.isOverdefined() && + (LoweringOverdefinedTimes[BB] > OverdefinedThreshold || + LoweringOverdefinedTimes.size() > OverdefinedBBThreshold))) { DEBUG(dbgs() << " reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n'); // Since we're reusing a cached value here, we don't need to update the @@ -554,6 +583,7 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) { // lattice value to overdefined, so that cycles will terminate and be // conservatively correct. BBLV.markOverdefined(); + ++LoweringOverdefinedTimes[BB]; Instruction *BBI = dyn_cast(Val); if (!BBI || BBI->getParent() != BB) {