diff options
author | Daniil Fukalov <daniil.fukalov@amd.com> | 2016-11-17 16:07:52 +0000 |
---|---|---|
committer | Daniil Fukalov <daniil.fukalov@amd.com> | 2016-11-17 16:07:52 +0000 |
commit | 4c3322cc843c6233e78a123259808eeb37198aa9 (patch) | |
tree | f538fec3bb3e41daac70f391f6a879990fd0f6b5 /llvm/unittests/Analysis/ScalarEvolutionTest.cpp | |
parent | 74fa2822f6ab87eb163d38ac117eb088fe8c3c5a (diff) | |
download | bcm5719-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.cpp | 67 |
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 |