From 09eb4451d2a94995fe985d21ec802b7bb262479c Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Thu, 3 Mar 2016 22:10:47 +0000 Subject: Pass scope and LoopInfo to SCEVValidator. NFC. The scope will be required in the following fix. This commit separates the large changes that do not change behaviour from the small, but functional change. llvm-svn: 262664 --- polly/lib/Support/SCEVValidator.cpp | 38 +++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'polly/lib/Support/SCEVValidator.cpp') diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp index 492264bcb57..24139908c5d 100644 --- a/polly/lib/Support/SCEVValidator.cpp +++ b/polly/lib/Support/SCEVValidator.cpp @@ -124,14 +124,15 @@ struct SCEVValidator : public SCEVVisitor { private: const Region *R; + Loop *Scope; ScalarEvolution &SE; const Value *BaseAddress; InvariantLoadsSetTy *ILS; public: - SCEVValidator(const Region *R, ScalarEvolution &SE, const Value *BaseAddress, - InvariantLoadsSetTy *ILS) - : R(R), SE(SE), BaseAddress(BaseAddress), ILS(ILS) {} + SCEVValidator(const Region *R, Loop *Scope, ScalarEvolution &SE, + const Value *BaseAddress, InvariantLoadsSetTy *ILS) + : R(R), Scope(Scope), SE(SE), BaseAddress(BaseAddress), ILS(ILS) {} class ValidatorResult visitConstant(const SCEVConstant *Constant) { return ValidatorResult(SCEVType::INT); @@ -576,12 +577,13 @@ bool hasScalarDepsInsideRegion(const SCEV *Expr, const Region *R, return SCEVInRegionDependences::hasDependences(Expr, R, Scope, AllowLoops); } -bool isAffineExpr(const Region *R, const SCEV *Expr, ScalarEvolution &SE, - const Value *BaseAddress, InvariantLoadsSetTy *ILS) { +bool isAffineExpr(const Region *R, llvm::Loop *Scope, const SCEV *Expr, + ScalarEvolution &SE, const Value *BaseAddress, + InvariantLoadsSetTy *ILS) { if (isa(Expr)) return false; - SCEVValidator Validator(R, SE, BaseAddress, ILS); + SCEVValidator Validator(R, Scope, SE, BaseAddress, ILS); DEBUG({ dbgs() << "\n"; dbgs() << "Expr: " << *Expr << "\n"; @@ -600,13 +602,14 @@ bool isAffineExpr(const Region *R, const SCEV *Expr, ScalarEvolution &SE, return Result.isValid(); } -static bool isAffineParamExpr(Value *V, const Region *R, ScalarEvolution &SE, +static bool isAffineParamExpr(Value *V, const Region *R, Loop *Scope, + ScalarEvolution &SE, std::vector &Params) { auto *E = SE.getSCEV(V); if (isa(E)) return false; - SCEVValidator Validator(R, SE, nullptr, nullptr); + SCEVValidator Validator(R, Scope, SE, nullptr, nullptr); ValidatorResult Result = Validator.visit(E); if (!Result.isConstant()) return false; @@ -617,17 +620,20 @@ static bool isAffineParamExpr(Value *V, const Region *R, ScalarEvolution &SE, return true; } -bool isAffineParamConstraint(Value *V, const Region *R, ScalarEvolution &SE, +bool isAffineParamConstraint(Value *V, const Region *R, llvm::Loop *Scope, + ScalarEvolution &SE, std::vector &Params, bool OrExpr) { if (auto *ICmp = dyn_cast(V)) { - return isAffineParamConstraint(ICmp->getOperand(0), R, SE, Params, true) && - isAffineParamConstraint(ICmp->getOperand(1), R, SE, Params, true); + return isAffineParamConstraint(ICmp->getOperand(0), R, Scope, SE, Params, + true) && + isAffineParamConstraint(ICmp->getOperand(1), R, Scope, SE, Params, + true); } else if (auto *BinOp = dyn_cast(V)) { auto Opcode = BinOp->getOpcode(); if (Opcode == Instruction::And || Opcode == Instruction::Or) - return isAffineParamConstraint(BinOp->getOperand(0), R, SE, Params, + return isAffineParamConstraint(BinOp->getOperand(0), R, Scope, SE, Params, false) && - isAffineParamConstraint(BinOp->getOperand(1), R, SE, Params, + isAffineParamConstraint(BinOp->getOperand(1), R, Scope, SE, Params, false); /* Fall through */ } @@ -635,10 +641,10 @@ bool isAffineParamConstraint(Value *V, const Region *R, ScalarEvolution &SE, if (!OrExpr) return false; - return isAffineParamExpr(V, R, SE, Params); + return isAffineParamExpr(V, R, Scope, SE, Params); } -std::vector getParamsInAffineExpr(const Region *R, +std::vector getParamsInAffineExpr(const Region *R, Loop *Scope, const SCEV *Expr, ScalarEvolution &SE, const Value *BaseAddress) { @@ -646,7 +652,7 @@ std::vector getParamsInAffineExpr(const Region *R, return std::vector(); InvariantLoadsSetTy ILS; - SCEVValidator Validator(R, SE, BaseAddress, &ILS); + SCEVValidator Validator(R, Scope, SE, BaseAddress, &ILS); ValidatorResult Result = Validator.visit(Expr); assert(Result.isValid() && "Requested parameters for an invalid SCEV!"); -- cgit v1.2.3