summaryrefslogtreecommitdiffstats
path: root/polly/lib/Support/SCEVAffinator.cpp
diff options
context:
space:
mode:
authorEli Friedman <efriedma@codeaurora.org>2018-05-14 23:05:43 +0000
committerEli Friedman <efriedma@codeaurora.org>2018-05-14 23:05:43 +0000
commit9ae56b9a0e2f9769eddcbfb16feff28fce773edb (patch)
tree07c808fda50e99f4a63861c4a9909842fa426048 /polly/lib/Support/SCEVAffinator.cpp
parent65d6380cd63db11c1285325078e3c0e740191dab (diff)
downloadbcm5719-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.cpp14
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())));
+}
OpenPOWER on IntegriCloud