summaryrefslogtreecommitdiffstats
path: root/polly/lib/Support/SCEVValidator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/Support/SCEVValidator.cpp')
-rw-r--r--polly/lib/Support/SCEVValidator.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp
index 85bda185ec3..9b3ce1860d5 100644
--- a/polly/lib/Support/SCEVValidator.cpp
+++ b/polly/lib/Support/SCEVValidator.cpp
@@ -8,6 +8,7 @@
#include <vector>
using namespace llvm;
+using namespace polly;
#define DEBUG_TYPE "polly-scev-validator"
@@ -125,10 +126,12 @@ private:
const Region *R;
ScalarEvolution &SE;
const Value *BaseAddress;
+ InvariantLoadsSetTy *ILS;
public:
- SCEVValidator(const Region *R, ScalarEvolution &SE, const Value *BaseAddress)
- : R(R), SE(SE), BaseAddress(BaseAddress) {}
+ SCEVValidator(const Region *R, ScalarEvolution &SE, const Value *BaseAddress,
+ InvariantLoadsSetTy *ILS)
+ : R(R), SE(SE), BaseAddress(BaseAddress), ILS(ILS) {}
class ValidatorResult visitConstant(const SCEVConstant *Constant) {
return ValidatorResult(SCEVType::INT);
@@ -335,6 +338,15 @@ public:
return ValidatorResult(SCEVType::PARAM, S);
}
+ ValidatorResult visitLoadInstruction(Instruction *I, const SCEV *S) {
+ if (R->contains(I) && ILS) {
+ ILS->insert(cast<LoadInst>(I));
+ return ValidatorResult(SCEVType::PARAM, S);
+ }
+
+ return visitGenericInst(I, S);
+ }
+
ValidatorResult visitSDivInstruction(Instruction *SDiv, const SCEV *S) {
assert(SDiv->getOpcode() == Instruction::SDiv &&
"Assumed SDiv instruction!");
@@ -391,6 +403,8 @@ public:
if (Instruction *I = dyn_cast<Instruction>(Expr->getValue())) {
switch (I->getOpcode()) {
+ case Instruction::Load:
+ return visitLoadInstruction(I, Expr);
case Instruction::SDiv:
return visitSDivInstruction(I, Expr);
case Instruction::SRem:
@@ -550,11 +564,11 @@ bool hasScalarDepsInsideRegion(const SCEV *Expr, const Region *R) {
}
bool isAffineExpr(const Region *R, const SCEV *Expr, ScalarEvolution &SE,
- const Value *BaseAddress) {
+ const Value *BaseAddress, InvariantLoadsSetTy *ILS) {
if (isa<SCEVCouldNotCompute>(Expr))
return false;
- SCEVValidator Validator(R, SE, BaseAddress);
+ SCEVValidator Validator(R, SE, BaseAddress, ILS);
DEBUG({
dbgs() << "\n";
dbgs() << "Expr: " << *Expr << "\n";
@@ -580,7 +594,8 @@ std::vector<const SCEV *> getParamsInAffineExpr(const Region *R,
if (isa<SCEVCouldNotCompute>(Expr))
return std::vector<const SCEV *>();
- SCEVValidator Validator(R, SE, BaseAddress);
+ InvariantLoadsSetTy ILS;
+ SCEVValidator Validator(R, SE, BaseAddress, &ILS);
ValidatorResult Result = Validator.visit(Expr);
assert(Result.isValid() && "Requested parameters for an invalid SCEV!");
OpenPOWER on IntegriCloud