diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp index 3435bc7f5eaaa1..4d9883dd662ece 100644 --- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -310,9 +310,10 @@ static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI) { // 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 = diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll index b09d2fd607a3d8..fa2e6ff9af661a 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll @@ -627,11 +627,9 @@ define void @test_cmp_phi(i8 %a) { ; 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 ;