Index: llvm/trunk/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp @@ -8138,6 +8138,16 @@ if (RV) return getSCEV(RV); } } + + // If there is a single-input Phi, evaluate it at our scope. If we can + // prove that this replacement does not break LCSSA form, use new value. + if (PN->getNumOperands() == 1) { + const SCEV *Input = getSCEV(PN->getOperand(0)); + const SCEV *InputAtScope = getSCEVAtScope(Input, L); + // TODO: We can generalize it using LI.replacementPreservesLCSSAForm, + // for the simplest case just support constants. + if (isa(InputAtScope)) return InputAtScope; + } } // Okay, this is an expression that we cannot symbolically evaluate Index: llvm/trunk/test/Transforms/IndVarSimplify/pr39673.ll =================================================================== --- llvm/trunk/test/Transforms/IndVarSimplify/pr39673.ll +++ llvm/trunk/test/Transforms/IndVarSimplify/pr39673.ll @@ -21,8 +21,7 @@ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i16 [[L2_ADD]], 2 ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP2]], label [[LOOP2_END:%.*]] ; CHECK: loop2.end: -; CHECK-NEXT: [[K2_ADD_LCSSA:%.*]] = phi i16 [ [[K2_ADD]], [[LOOP2]] ] -; CHECK-NEXT: ret i16 [[K2_ADD_LCSSA]] +; CHECK-NEXT: ret i16 184 ; entry: br label %loop1