Index: llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp =================================================================== --- llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -310,9 +310,10 @@ // the comparison is testing local values. While LVI can sometimes reason // about such cases, it's not its primary purpose. We do make sure to do // the block local query for uses from terminator instructions, but that's - // handled in the code for each terminator. + // handled in the code for each terminator. As an exception, we allow phi + // nodes, for which LVI can thread the condition into predecessors. auto *I = dyn_cast(Op0); - if (I && I->getParent() == Cmp->getParent()) + if (I && I->getParent() == Cmp->getParent() && !isa(I)) return false; LazyValueInfo::Tristate Result = Index: llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll =================================================================== --- llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll +++ llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll @@ -627,11 +627,9 @@ ; CHECK: loop: ; CHECK-NEXT: [[P:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B:%.*]], [[LOOP]] ] ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[P]], 0 -; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[P]], 2 -; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]] ; CHECK-NEXT: [[C4:%.*]] = call i1 @get_bool() ; CHECK-NEXT: [[B]] = zext i1 [[C4]] to i8 -; CHECK-NEXT: br i1 [[C3]], label [[LOOP]], label [[EXIT]] +; CHECK-NEXT: br i1 [[C1]], label [[LOOP]], label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ;