[llvm] [SelectionDAG] Fix incorrect fold condition in foldSetCCWithFunnelShift. (PR #137637)
via llvm-commits
llvm-commits at lists.llvm.org
Sat May 3 00:49:07 PDT 2025
https://github.com/Ruhung updated https://github.com/llvm/llvm-project/pull/137637
>From 342c7e1e7b9549d757d2c285511ecca85749a780 Mon Sep 17 00:00:00 2001
From: Ruhung <jhlee at pllab.cs.nthu.edu.tw>
Date: Mon, 28 Apr 2025 21:45:36 +0800
Subject: [PATCH 1/2] Pre-commit tests.
---
llvm/test/CodeGen/AArch64/setcc-fsh.ll | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/llvm/test/CodeGen/AArch64/setcc-fsh.ll b/llvm/test/CodeGen/AArch64/setcc-fsh.ll
index 08bfe282703ff..928dc0a692139 100644
--- a/llvm/test/CodeGen/AArch64/setcc-fsh.ll
+++ b/llvm/test/CodeGen/AArch64/setcc-fsh.ll
@@ -248,3 +248,26 @@ define i1 @fshl_or_ne_2(i32 %x, i32 %y) {
%r = icmp ne i32 %f, 2
ret i1 %r
}
+
+define i1 @fshr_0_or_eq_0(i16 %x, i16 %y) {
+; CHECK-LABEL: fshr_0_or_eq_0:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w0, wzr
+; CHECK-NEXT: ret
+ %or = or i16 %x, %y
+ %f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 0)
+ %r = icmp eq i16 %f, 0
+ ret i1 %r
+}
+
+define i1 @fshr_32_or_eq_0(i16 %x, i16 %y) {
+; CHECK-LABEL: fshr_16_or_eq_0:
+; CHECK: // %bb.0:
+; CHECK-NEXT: tst w0, #0xffff
+; CHECK-NEXT: cset w0, eq
+; CHECK-NEXT: ret
+ %or = or i16 %x, %y
+ %f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 32)
+ %r = icmp eq i16 %f, 0
+ ret i1 %r
+}
>From cd8ae16d43e0959d4535c19362466c388adaa4ed Mon Sep 17 00:00:00 2001
From: Ruhung <jhlee at pllab.cs.nthu.edu.tw>
Date: Mon, 28 Apr 2025 21:45:59 +0800
Subject: [PATCH 2/2] [SelectionDAG] Fix incorrect fold condition in
foldSetCCWithFunnelShift.
---
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 7 +++++--
llvm/test/CodeGen/AArch64/setcc-fsh.ll | 5 +++--
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 6930b54ddb14a..a8b01419a42f3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -4462,11 +4462,14 @@ static SDValue foldSetCCWithFunnelShift(EVT VT, SDValue N0, SDValue N1,
unsigned BitWidth = N0.getScalarValueSizeInBits();
auto *ShAmtC = isConstOrConstSplat(N0.getOperand(2));
- if (!ShAmtC || ShAmtC->getAPIntValue().uge(BitWidth))
+ if (!ShAmtC)
+ return SDValue();
+
+ uint64_t ShAmt = ShAmtC->getAPIntValue().urem(BitWidth);
+ if (ShAmt == 0)
return SDValue();
// Canonicalize fshr as fshl to reduce pattern-matching.
- unsigned ShAmt = ShAmtC->getZExtValue();
if (N0.getOpcode() == ISD::FSHR)
ShAmt = BitWidth - ShAmt;
diff --git a/llvm/test/CodeGen/AArch64/setcc-fsh.ll b/llvm/test/CodeGen/AArch64/setcc-fsh.ll
index 928dc0a692139..472723b89a8d6 100644
--- a/llvm/test/CodeGen/AArch64/setcc-fsh.ll
+++ b/llvm/test/CodeGen/AArch64/setcc-fsh.ll
@@ -252,7 +252,8 @@ define i1 @fshl_or_ne_2(i32 %x, i32 %y) {
define i1 @fshr_0_or_eq_0(i16 %x, i16 %y) {
; CHECK-LABEL: fshr_0_or_eq_0:
; CHECK: // %bb.0:
-; CHECK-NEXT: mov w0, wzr
+; CHECK-NEXT: tst w0, #0xffff
+; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
%or = or i16 %x, %y
%f = call i16 @llvm.fshr.i16(i16 %or, i16 %x, i16 0)
@@ -261,7 +262,7 @@ define i1 @fshr_0_or_eq_0(i16 %x, i16 %y) {
}
define i1 @fshr_32_or_eq_0(i16 %x, i16 %y) {
-; CHECK-LABEL: fshr_16_or_eq_0:
+; CHECK-LABEL: fshr_32_or_eq_0:
; CHECK: // %bb.0:
; CHECK-NEXT: tst w0, #0xffff
; CHECK-NEXT: cset w0, eq
More information about the llvm-commits
mailing list