summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
diff options
context:
space:
mode:
authorDaniil Fukalov <daniil.fukalov@amd.com>2016-11-17 16:07:52 +0000
committerDaniil Fukalov <daniil.fukalov@amd.com>2016-11-17 16:07:52 +0000
commit4c3322cc843c6233e78a123259808eeb37198aa9 (patch)
treef538fec3bb3e41daac70f391f6a879990fd0f6b5 /llvm/unittests/Analysis/ScalarEvolutionTest.cpp
parent74fa2822f6ab87eb163d38ac117eb088fe8c3c5a (diff)
downloadbcm5719-llvm-4c3322cc843c6233e78a123259808eeb37198aa9.tar.gz
bcm5719-llvm-4c3322cc843c6233e78a123259808eeb37198aa9.zip
[SCEV] limit recursion depth of CompareSCEVComplexity
Summary: CompareSCEVComplexity goes too deep (50+ on a quite a big unrolled loop) and runs almost infinite time. Added cache of "equal" SCEV pairs to earlier cutoff of further estimation. Recursion depth limit was also introduced as a parameter. Reviewers: sanjoy Subscribers: mzolotukhin, tstellarAMD, llvm-commits Differential Revision: https://reviews.llvm.org/D26389 llvm-svn: 287232
Diffstat (limited to 'llvm/unittests/Analysis/ScalarEvolutionTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ScalarEvolutionTest.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
index 6dcb18fd94b..752cc812824 100644
--- a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
+++ b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
@@ -465,5 +465,72 @@ TEST_F(ScalarEvolutionsTest, CommutativeExprOperandOrder) {
});
}
+TEST_F(ScalarEvolutionsTest, SCEVCompareComplexity) {
+ FunctionType *FTy =
+ FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
+ Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
+ BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
+ BasicBlock *LoopBB = BasicBlock::Create(Context, "bb1", F);
+ BranchInst::Create(LoopBB, EntryBB);
+
+ auto *Ty = Type::getInt32Ty(Context);
+ SmallVector<Instruction*, 8> Muls(8), Acc(8), NextAcc(8);
+
+ Acc[0] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[1] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[2] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[3] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[4] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[5] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[6] = PHINode::Create(Ty, 2, "", LoopBB);
+ Acc[7] = PHINode::Create(Ty, 2, "", LoopBB);
+
+ for (int i = 0; i < 20; i++) {
+ Muls[0] = BinaryOperator::CreateMul(Acc[0], Acc[0], "", LoopBB);
+ NextAcc[0] = BinaryOperator::CreateAdd(Muls[0], Acc[4], "", LoopBB);
+ Muls[1] = BinaryOperator::CreateMul(Acc[1], Acc[1], "", LoopBB);
+ NextAcc[1] = BinaryOperator::CreateAdd(Muls[1], Acc[5], "", LoopBB);
+ Muls[2] = BinaryOperator::CreateMul(Acc[2], Acc[2], "", LoopBB);
+ NextAcc[2] = BinaryOperator::CreateAdd(Muls[2], Acc[6], "", LoopBB);
+ Muls[3] = BinaryOperator::CreateMul(Acc[3], Acc[3], "", LoopBB);
+ NextAcc[3] = BinaryOperator::CreateAdd(Muls[3], Acc[7], "", LoopBB);
+
+ Muls[4] = BinaryOperator::CreateMul(Acc[4], Acc[4], "", LoopBB);
+ NextAcc[4] = BinaryOperator::CreateAdd(Muls[4], Acc[0], "", LoopBB);
+ Muls[5] = BinaryOperator::CreateMul(Acc[5], Acc[5], "", LoopBB);
+ NextAcc[5] = BinaryOperator::CreateAdd(Muls[5], Acc[1], "", LoopBB);
+ Muls[6] = BinaryOperator::CreateMul(Acc[6], Acc[6], "", LoopBB);
+ NextAcc[6] = BinaryOperator::CreateAdd(Muls[6], Acc[2], "", LoopBB);
+ Muls[7] = BinaryOperator::CreateMul(Acc[7], Acc[7], "", LoopBB);
+ NextAcc[7] = BinaryOperator::CreateAdd(Muls[7], Acc[3], "", LoopBB);
+ Acc = NextAcc;
+ }
+
+ auto II = LoopBB->begin();
+ for (int i = 0; i < 8; i++) {
+ PHINode *Phi = cast<PHINode>(&*II++);
+ Phi->addIncoming(Acc[i], LoopBB);
+ Phi->addIncoming(UndefValue::get(Ty), EntryBB);
+ }
+
+ BasicBlock *ExitBB = BasicBlock::Create(Context, "bb2", F);
+ BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
+ LoopBB);
+
+ Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
+ Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
+ Acc[2] = BinaryOperator::CreateAdd(Acc[4], Acc[5], "", ExitBB);
+ Acc[3] = BinaryOperator::CreateAdd(Acc[6], Acc[7], "", ExitBB);
+ Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
+ Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
+ Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
+
+ ReturnInst::Create(Context, nullptr, ExitBB);
+
+ ScalarEvolution SE = buildSE(*F);
+
+ EXPECT_NE(nullptr, SE.getSCEV(Acc[0]));
+}
+
} // end anonymous namespace
} // end namespace llvm
OpenPOWER on IntegriCloud