From 2183f59c19efd2ecb54627ffe97faed0105f428f Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Mon, 28 Apr 2025 20:22:34 +0800 Subject: [PATCH 1/2] [ValueTracking] Infer `X | Y != 0` from `X != Y` --- llvm/lib/Analysis/ValueTracking.cpp | 4 ++++ llvm/test/Transforms/InstCombine/icmp-dom.ll | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index d8c1096049dce..7caa0ec57196c 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3043,6 +3043,10 @@ static bool isKnownNonZeroFromOperator(const Operator *I, // (X | (X != 0)) is non zero if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1))) return true; + // X | Y != 0 if X != Y. + if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Depth, + Q)) + return true; // X | Y != 0 if X != 0 or Y != 0. return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) || isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth); diff --git a/llvm/test/Transforms/InstCombine/icmp-dom.ll b/llvm/test/Transforms/InstCombine/icmp-dom.ll index 6613bbeb8d6ae..a72b5e0bbfa03 100644 --- a/llvm/test/Transforms/InstCombine/icmp-dom.ll +++ b/llvm/test/Transforms/InstCombine/icmp-dom.ll @@ -535,16 +535,13 @@ else: ret i1 %cmp1 } -; TODO: X != Y implies X | Y != 0 define i1 @or_nonzero_from_nonequal(i8 %x, i8 %y) { ; CHECK-LABEL: @or_nonzero_from_nonequal( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] ; CHECK: if.then: -; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], [[Y]] -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: ret i1 false ; CHECK: if.else: ; CHECK-NEXT: ret i1 false ; From da1785059e9c4987b99a72a75419ab65a9a0f3aa Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sun, 15 Jun 2025 12:43:42 +0800 Subject: [PATCH 2/2] [ValueTracking] Fix compilation error --- llvm/lib/Analysis/ValueTracking.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 7caa0ec57196c..99670b92187c5 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3044,8 +3044,8 @@ static bool isKnownNonZeroFromOperator(const Operator *I, if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1))) return true; // X | Y != 0 if X != Y. - if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Depth, - Q)) + if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Q, + Depth)) return true; // X | Y != 0 if X != 0 or Y != 0. return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) ||