[llvm] [ValueTracking] Infer `X | Y != 0` from `X != Y` (PR #117443)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 14 21:44:12 PDT 2025
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/117443
>From 2183f59c19efd2ecb54627ffe97faed0105f428f Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
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 <dtcxzyw2333 at gmail.com>
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) ||
More information about the llvm-commits
mailing list