diff options
| author | Eli Friedman <efriedma@codeaurora.org> | 2018-05-14 23:05:43 +0000 |
|---|---|---|
| committer | Eli Friedman <efriedma@codeaurora.org> | 2018-05-14 23:05:43 +0000 |
| commit | 9ae56b9a0e2f9769eddcbfb16feff28fce773edb (patch) | |
| tree | 07c808fda50e99f4a63861c4a9909842fa426048 /polly/lib/Support/SCEVAffinator.cpp | |
| parent | 65d6380cd63db11c1285325078e3c0e740191dab (diff) | |
| download | bcm5719-llvm-9ae56b9a0e2f9769eddcbfb16feff28fce773edb.tar.gz bcm5719-llvm-9ae56b9a0e2f9769eddcbfb16feff28fce773edb.zip | |
[SCEVAffinator] Fix handling of pwaff complexity limit.
nullptr is not a valid affine expression, and none of the callers check
for null, so we eventually hit an isl error and crash.
Instead, invalidate the scop and return a constant zero.
Differential Revision: https://reviews.llvm.org/D46445
llvm-svn: 332309
Diffstat (limited to 'polly/lib/Support/SCEVAffinator.cpp')
| -rw-r--r-- | polly/lib/Support/SCEVAffinator.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/polly/lib/Support/SCEVAffinator.cpp b/polly/lib/Support/SCEVAffinator.cpp index 1d4099fdb96..e31b1028599 100644 --- a/polly/lib/Support/SCEVAffinator.cpp +++ b/polly/lib/Support/SCEVAffinator.cpp @@ -368,7 +368,7 @@ PWACtx SCEVAffinator::visitAddExpr(const SCEVAddExpr *Expr) { for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) { Sum = combine(Sum, visit(Expr->getOperand(i)), isl_pw_aff_add); if (isTooComplex(Sum)) - return std::make_pair(nullptr, nullptr); + return complexityBailout(); } return Sum; @@ -380,7 +380,7 @@ PWACtx SCEVAffinator::visitMulExpr(const SCEVMulExpr *Expr) { for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) { Prod = combine(Prod, visit(Expr->getOperand(i)), isl_pw_aff_mul); if (isTooComplex(Prod)) - return std::make_pair(nullptr, nullptr); + return complexityBailout(); } return Prod; @@ -431,7 +431,7 @@ PWACtx SCEVAffinator::visitSMaxExpr(const SCEVSMaxExpr *Expr) { for (int i = 1, e = Expr->getNumOperands(); i < e; ++i) { Max = combine(Max, visit(Expr->getOperand(i)), isl_pw_aff_max); if (isTooComplex(Max)) - return std::make_pair(nullptr, nullptr); + return complexityBailout(); } return Max; @@ -532,3 +532,11 @@ PWACtx SCEVAffinator::visitUnknown(const SCEVUnknown *Expr) { llvm_unreachable( "Unknowns SCEV was neither parameter nor a valid instruction."); } + +PWACtx SCEVAffinator::complexityBailout() { + // We hit the complexity limit for affine expressions; invalidate the scop + // and return a constant zero. + const DebugLoc &Loc = BB ? BB->getTerminator()->getDebugLoc() : DebugLoc(); + S->invalidate(COMPLEXITY, Loc); + return visit(SE.getZero(Type::getInt32Ty(BB->getContext()))); +} |

