From c380db12cda84f1eb2101032c4798fdc7a33688f Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Sun, 5 Mar 2017 23:49:17 +0000 Subject: [PATCH] [SCEV] Decrease the recursion threshold for CompareValueComplexity Fixes PR32142. r287232 accidentally increased the recursion threshold for CompareValueComplexity from 2 to 32. This change reverses that change by introducing a separate flag for CompareValueComplexity's threshold. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296992 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ScalarEvolution.cpp | 17 ++++++---- unittests/Analysis/ScalarEvolutionTest.cpp | 38 +++++++++++++++++++++- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 5d5b9b39959..d96a77e0abf 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -132,10 +132,15 @@ static cl::opt AddOpsInlineThreshold( cl::desc("Threshold for inlining multiplication operands into a SCEV"), cl::init(500)); -static cl::opt - MaxCompareDepth("scalar-evolution-max-compare-depth", cl::Hidden, - cl::desc("Maximum depth of recursive compare complexity"), - cl::init(32)); +static cl::opt MaxSCEVCompareDepth( + "scalar-evolution-max-scev-compare-depth", cl::Hidden, + cl::desc("Maximum depth of recursive SCEV complexity comparisons"), + cl::init(32)); + +static cl::opt MaxValueCompareDepth( + "scalar-evolution-max-value-compare-depth", cl::Hidden, + cl::desc("Maximum depth of recursive value complexity comparisons"), + cl::init(2)); static cl::opt MaxAddExprDepth("scalar-evolution-max-addexpr-depth", cl::Hidden, @@ -496,7 +501,7 @@ static int CompareValueComplexity(SmallSet, 8> &EqCache, const LoopInfo *const LI, Value *LV, Value *RV, unsigned Depth) { - if (Depth > MaxCompareDepth || EqCache.count({LV, RV})) + if (Depth > MaxValueCompareDepth || EqCache.count({LV, RV})) return 0; // Order pointer values after integer values. This helps SCEVExpander form @@ -583,7 +588,7 @@ static int CompareSCEVComplexity( if (LType != RType) return (int)LType - (int)RType; - if (Depth > MaxCompareDepth || EqCacheSCEV.count({LHS, RHS})) + if (Depth > MaxSCEVCompareDepth || EqCacheSCEV.count({LHS, RHS})) return 0; // Aside from the getSCEVType() ordering, the particular ordering // isn't very important except that it's beneficial to be consistent, diff --git a/unittests/Analysis/ScalarEvolutionTest.cpp b/unittests/Analysis/ScalarEvolutionTest.cpp index a9b144c5011..b5e36fb7830 100644 --- a/unittests/Analysis/ScalarEvolutionTest.cpp +++ b/unittests/Analysis/ScalarEvolutionTest.cpp @@ -465,7 +465,7 @@ TEST_F(ScalarEvolutionsTest, CommutativeExprOperandOrder) { }); } -TEST_F(ScalarEvolutionsTest, SCEVCompareComplexity) { +TEST_F(ScalarEvolutionsTest, CompareSCEVComplexity) { FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), std::vector(), false); Function *F = cast(M.getOrInsertFunction("f", FTy)); @@ -532,6 +532,42 @@ TEST_F(ScalarEvolutionsTest, SCEVCompareComplexity) { EXPECT_NE(nullptr, SE.getSCEV(Acc[0])); } +TEST_F(ScalarEvolutionsTest, CompareValueComplexity) { + IntegerType *IntPtrTy = M.getDataLayout().getIntPtrType(Context); + PointerType *IntPtrPtrTy = IntPtrTy->getPointerTo(); + + FunctionType *FTy = + FunctionType::get(Type::getVoidTy(Context), {IntPtrTy, IntPtrTy}, false); + Function *F = cast(M.getOrInsertFunction("f", FTy)); + BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F); + + Value *X = &*F->arg_begin(); + Value *Y = &*std::next(F->arg_begin()); + + const int ValueDepth = 10; + for (int i = 0; i < ValueDepth; i++) { + X = new LoadInst(new IntToPtrInst(X, IntPtrPtrTy, "", EntryBB), "", + /*isVolatile*/ false, EntryBB); + Y = new LoadInst(new IntToPtrInst(Y, IntPtrPtrTy, "", EntryBB), "", + /*isVolatile*/ false, EntryBB); + } + + auto *MulA = BinaryOperator::CreateMul(X, Y, "", EntryBB); + auto *MulB = BinaryOperator::CreateMul(Y, X, "", EntryBB); + ReturnInst::Create(Context, nullptr, EntryBB); + + // This test isn't checking for correctness. Today making A and B resolve to + // the same SCEV would require deeper searching in CompareValueComplexity, + // which will slow down compilation. However, this test can fail (with LLVM's + // behavior still being correct) if we ever have a smarter + // CompareValueComplexity that is both fast and more accurate. + + ScalarEvolution SE = buildSE(*F); + auto *A = SE.getSCEV(MulA); + auto *B = SE.getSCEV(MulB); + EXPECT_NE(A, B); +} + TEST_F(ScalarEvolutionsTest, SCEVAddExpr) { Type *Ty32 = Type::getInt32Ty(Context); Type *ArgTys[] = {Type::getInt64Ty(Context), Ty32};