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);
}
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) {
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);
TerminatorInst *TI = LatchBB->getTerminator();
BranchInst *BI = dyn_cast<BranchInst>(TI);
- if (BI && BI->isUnconditional())
+ assert(BI && "Only branch instructions allowed in loop latches");
+
+ if (BI->isUnconditional())
BackedgeCondition = isl_set_copy(LatchBBDom);
else {
SmallVector<isl_set *, 8> ConditionSets;