diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 575221a98df1..6dff45f7143c 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2074,6 +2074,12 @@ bool isKnownNonZero(Value *V, unsigned Depth, const Query &Q) { } } } + // Check if all incoming values are non-zero constant. + bool AllNonZeroConstants = all_of(PN->operands(), [](Value *V) { + return isa(V) && !cast(V)->isZeroValue(); + }); + if (AllNonZeroConstants) + return true; } if (!BitWidth) return false; diff --git a/llvm/test/Transforms/InstCombine/phi.ll b/llvm/test/Transforms/InstCombine/phi.ll index d0441d76d399..7e3bdd0e0aac 100644 --- a/llvm/test/Transforms/InstCombine/phi.ll +++ b/llvm/test/Transforms/InstCombine/phi.ll @@ -760,3 +760,27 @@ epilog: ; CHECK-NEXT: ret i1 %[[RES]] } +; CHECK-LABEL: phi_allnonzeroconstant +; CHECK-NOT: phi i32 +; CHECK: ret i1 false +define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) { +entry: + br i1 %c, label %if.then, label %if.else + +if.then: ; preds = %entry + br label %if.end + +if.else: ; preds = %entry + call void @dummy() + + br label %if.end + +if.end: ; preds = %if.else, %if.then + %x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ] + %or = or i32 %x.0, %a + %cmp1 = icmp eq i32 %or, 0 + ret i1 %cmp1 +} + +declare void @dummy() +