// TODO: Support multiple entry loops? (We currently bail out of these in
// the IndVarSimplify pass)
if (auto *BB = L->getLoopPredecessor()) {
- Value *Incoming = PN->getIncomingValueForBlock(BB);
- const SCEV *IncomingS = SE->getSCEV(Incoming);
- CheapExpansions[IncomingS] = Incoming;
+ const int Idx = PN->getBasicBlockIndex(BB);
+ if (Idx >= 0) {
+ Value *Incoming = PN->getIncomingValue(Idx);
+ const SCEV *IncomingS = SE->getSCEV(Incoming);
+ CheapExpansions[IncomingS] = Incoming;
+ }
}
Value *NewLHS = CheapExpansions[InvariantLHS];
Value *NewRHS = CheapExpansions[InvariantRHS];
+ if (!NewLHS)
+ if (auto *ConstLHS = dyn_cast<SCEVConstant>(InvariantLHS))
+ NewLHS = ConstLHS->getValue();
+ if (!NewRHS)
+ if (auto *ConstRHS = dyn_cast<SCEVConstant>(InvariantRHS))
+ NewRHS = ConstRHS->getValue();
+
if (!NewLHS || !NewRHS)
// We could not find an existing value to replace either LHS or RHS.
// Generating new instructions has subtler tradeoffs, so avoid doing that
ret void
}
+; check that we handle conditions with loop invariant operands which
+; *aren't* in the header - this is a very rare and fragile case where
+; we have a "loop" which is known to run exactly one iteration but
+; haven't yet simplified the uses of the IV
+define void @test10() {
+; CHECK-LABEL: @test10
+entry:
+ br label %loop
+
+loop:
+ %phi1 = phi i32 [ %phi2, %latch ], [ 0, %entry ]
+ %dec = add i32 %phi1, -1
+ br i1 false, label %left, label %right
+
+left:
+ br label %latch
+
+right:
+ br label %latch
+
+latch:
+ %phi2 = phi i32 [ %phi1, %left ], [ %dec, %right ]
+ ; CHECK: %cmp = icmp slt i32 -1, undef
+ %cmp = icmp slt i32 %phi2, undef
+ br i1 true, label %exit, label %loop
+
+exit:
+ ret void
+}
+
!1 = !{i64 -1, i64 100}