summaryrefslogtreecommitdiffstats
path: root/polly/lib/Support/SCEVValidator.cpp
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-11-12 03:25:01 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-11-12 03:25:01 +0000
commit2af10e2eed41b8d110f905f726e4467bb03e6ed1 (patch)
treed0b398d8565bb8a7013e74d9c4d7aa2352f68908 /polly/lib/Support/SCEVValidator.cpp
parent645af38957642cac0b31098e3bd5d72847e6f2ba (diff)
downloadbcm5719-llvm-2af10e2eed41b8d110f905f726e4467bb03e6ed1.tar.gz
bcm5719-llvm-2af10e2eed41b8d110f905f726e4467bb03e6ed1.zip
Use parameter constraints provided via llvm.assume
If an llvm.assume dominates the SCoP entry block and the assumed condition can be expressed as an affine inequality we will now add it to the context. Differential Revision: http://reviews.llvm.org/D14413 llvm-svn: 252851
Diffstat (limited to 'polly/lib/Support/SCEVValidator.cpp')
-rw-r--r--polly/lib/Support/SCEVValidator.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp
index 9b3ce1860d5..e22d3df162e 100644
--- a/polly/lib/Support/SCEVValidator.cpp
+++ b/polly/lib/Support/SCEVValidator.cpp
@@ -587,6 +587,44 @@ bool isAffineExpr(const Region *R, const SCEV *Expr, ScalarEvolution &SE,
return Result.isValid();
}
+static bool isAffineParamExpr(Value *V, const Region *R, ScalarEvolution &SE,
+ std::vector<const SCEV *> &Params) {
+ auto *E = SE.getSCEV(V);
+ if (isa<SCEVCouldNotCompute>(E))
+ return false;
+
+ SCEVValidator Validator(R, SE, nullptr, nullptr);
+ ValidatorResult Result = Validator.visit(E);
+ if (!Result.isConstant())
+ return false;
+
+ auto ResultParams = Result.getParameters();
+ Params.insert(Params.end(), ResultParams.begin(), ResultParams.end());
+
+ return true;
+}
+
+bool isAffineParamConstraint(Value *V, const Region *R, ScalarEvolution &SE,
+ std::vector<const SCEV *> &Params, bool OrExpr) {
+ if (auto *ICmp = dyn_cast<ICmpInst>(V)) {
+ return isAffineParamConstraint(ICmp->getOperand(0), R, SE, Params, true) &&
+ isAffineParamConstraint(ICmp->getOperand(1), R, SE, Params, true);
+ } else if (auto *BinOp = dyn_cast<BinaryOperator>(V)) {
+ auto Opcode = BinOp->getOpcode();
+ if (Opcode == Instruction::And || Opcode == Instruction::Or)
+ return isAffineParamConstraint(BinOp->getOperand(0), R, SE, Params,
+ false) &&
+ isAffineParamConstraint(BinOp->getOperand(1), R, SE, Params,
+ false);
+ /* Fall through */
+ }
+
+ if (!OrExpr)
+ return false;
+
+ return isAffineParamExpr(V, R, SE, Params);
+}
+
std::vector<const SCEV *> getParamsInAffineExpr(const Region *R,
const SCEV *Expr,
ScalarEvolution &SE,
OpenPOWER on IntegriCloud