diff options
Diffstat (limited to 'polly/lib/Analysis/ScopDetection.cpp')
| -rw-r--r-- | polly/lib/Analysis/ScopDetection.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 599b8c85325..8700ae2745a 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -341,16 +341,16 @@ bool ScopDetection::isValidSwitch(BasicBlock &BB, SwitchInst *SI, Loop *L = LI->getLoopFor(&BB); const SCEV *ConditionSCEV = SE->getSCEVAtScope(Condition, L); + if (IsLoopBranch && L->isLoopLatch(&BB)) + return false; + if (isAffine(ConditionSCEV, L, Context)) return true; - if (!IsLoopBranch && AllowNonAffineSubRegions && + if (AllowNonAffineSubRegions && addOverApproximatedRegion(RI->getRegionFor(&BB), Context)) return true; - if (IsLoopBranch) - return false; - return invalid<ReportNonAffBranch>(Context, /*Assert=*/true, &BB, ConditionSCEV, ConditionSCEV, SI); } @@ -359,6 +359,10 @@ bool ScopDetection::isValidBranch(BasicBlock &BB, BranchInst *BI, Value *Condition, bool IsLoopBranch, DetectionContext &Context) const { + // Constant integer conditions are always affine. + if (isa<ConstantInt>(Condition)) + return true; + if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Condition)) { auto Opcode = BinOp->getOpcode(); if (Opcode == Instruction::And || Opcode == Instruction::Or) { @@ -425,10 +429,6 @@ bool ScopDetection::isValidCFG(BasicBlock &BB, bool IsLoopBranch, if (isa<UndefValue>(Condition)) return invalid<ReportUndefCond>(Context, /*Assert=*/true, TI, &BB); - // Constant integer conditions are always affine. - if (isa<ConstantInt>(Condition)) - return true; - if (BranchInst *BI = dyn_cast<BranchInst>(TI)) return isValidBranch(BB, BI, Condition, IsLoopBranch, Context); |

