[llvm] [ValueTracking] Infer `X | Y != 0` from `X != Y` (PR #117443)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 28 05:23:02 PDT 2025
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/117443
>From 2eb61d2b77c90cc8f1f65caeeabc738ca63f7ff7 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] [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 1d3f8b7207a63..9dd41d06ce147 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -3037,6 +3037,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
;
More information about the llvm-commits
mailing list