[llvm] [ValueTracking] Use unionWith when calculating known bits for abs. (PR #155896)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 28 11:01:09 PDT 2025
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/155896
We may have already gotten information from range metadata, don't
overwrite it.
>From bedc2fef7753ac52fd837cd5479e07a407d91e6d Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Thu, 28 Aug 2025 10:44:03 -0700
Subject: [PATCH 1/2] Pre-commit test
---
llvm/test/Transforms/InstCombine/abs-intrinsic.ll | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
index d32f0e4690502..e617dd27cb6ec 100644
--- a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
+++ b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
@@ -847,3 +847,17 @@ cond.end:
%r = phi i32 [ %0, %cond.true ], [ 0, %entry ]
ret i32 %r
}
+
+; The AND should be removable based on range metadata. Make sure
+; computeKnownBits doesn't lose this.
+define i32 @abs_range_metadata(i32 %x) {
+; CHECK-LABEL: @abs_range_metadata(
+; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
+; CHECK-NEXT: [[B:%.*]] = and i32 [[A]], 15
+; CHECK-NEXT: ret i32 [[B]]
+;
+ %a = call i32 @llvm.abs.i32(i32 %x, i1 false), !range !1
+ %b = and i32 %a, 15
+ ret i32 %b
+}
+!1 = !{i32 0, i32 16}
>From 8821b74000efbbdea147c3603f7dabd1d0017863 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Thu, 28 Aug 2025 10:47:08 -0700
Subject: [PATCH 2/2] [ValueTracking] Use unionWith when calculating known bits
for abs.
We may have already gotten information from range metadata, don't
overwrite it.
---
llvm/lib/Analysis/ValueTracking.cpp | 2 +-
llvm/test/Transforms/InstCombine/abs-intrinsic.ll | 3 +--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 7fe129b8456f6..864b972e06a10 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1829,7 +1829,7 @@ static void computeKnownBitsFromOperator(const Operator *I,
case Intrinsic::abs: {
computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
bool IntMinIsPoison = match(II->getArgOperand(1), m_One());
- Known = Known2.abs(IntMinIsPoison);
+ Known = Known.unionWith(Known2.abs(IntMinIsPoison));
break;
}
case Intrinsic::bitreverse:
diff --git a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
index e617dd27cb6ec..346111d892975 100644
--- a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
+++ b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
@@ -852,8 +852,7 @@ cond.end:
; computeKnownBits doesn't lose this.
define i32 @abs_range_metadata(i32 %x) {
; CHECK-LABEL: @abs_range_metadata(
-; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
-; CHECK-NEXT: [[B:%.*]] = and i32 [[A]], 15
+; CHECK-NEXT: [[B:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
; CHECK-NEXT: ret i32 [[B]]
;
%a = call i32 @llvm.abs.i32(i32 %x, i1 false), !range !1
More information about the llvm-commits
mailing list