diff options
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/Analysis/ScalarEvolution/binomial-explision.ll | 2 |
2 files changed, 7 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 8fe500f150b..77f2467d72d 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3060,7 +3060,7 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops, SmallVector<const SCEV*, 7> AddRecOps; for (int x = 0, xe = AddRec->getNumOperands() + OtherAddRec->getNumOperands() - 1; x != xe && !Overflow; ++x) { - const SCEV *Term = getZero(Ty); + SmallVector <const SCEV *, 7> SumOps; for (int y = x, ye = 2*x+1; y != ye && !Overflow; ++y) { uint64_t Coeff1 = Choose(x, 2*x - y, Overflow); for (int z = std::max(y-x, y-(int)AddRec->getNumOperands()+1), @@ -3075,12 +3075,13 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops, const SCEV *CoeffTerm = getConstant(Ty, Coeff); const SCEV *Term1 = AddRec->getOperand(y-z); const SCEV *Term2 = OtherAddRec->getOperand(z); - Term = getAddExpr(Term, getMulExpr(CoeffTerm, Term1, Term2, - SCEV::FlagAnyWrap, Depth + 1), - SCEV::FlagAnyWrap, Depth + 1); + SumOps.push_back(getMulExpr(CoeffTerm, Term1, Term2, + SCEV::FlagAnyWrap, Depth + 1)); } } - AddRecOps.push_back(Term); + if (SumOps.empty()) + SumOps.push_back(getZero(Ty)); + AddRecOps.push_back(getAddExpr(SumOps, SCEV::FlagAnyWrap, Depth + 1)); } if (!Overflow) { const SCEV *NewAddRec = getAddRecExpr(AddRecOps, AddRec->getLoop(), diff --git a/llvm/test/Analysis/ScalarEvolution/binomial-explision.ll b/llvm/test/Analysis/ScalarEvolution/binomial-explision.ll index 82d0beda6b5..ff27bfcbd76 100644 --- a/llvm/test/Analysis/ScalarEvolution/binomial-explision.ll +++ b/llvm/test/Analysis/ScalarEvolution/binomial-explision.ll @@ -8,7 +8,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1" define void @test(i32 %x, i64 %y, i1 %cond) { ; CHECK: %tmp19 = mul i32 %tmp17, %tmp18 -; CHECK: (((( +; CHECK: (((((( ; CHECK-NOT: ((((( ; CHECK: %tmp20 = add i32 %tmp19, %x |

