[llvm] Remove Manual combine-to (PR #165106)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 25 15:35:29 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/165106
>From dbff538b01bcc4b35b2c6acdb40d5147c76f2b2c Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Sat, 25 Oct 2025 12:27:59 -0400
Subject: [PATCH 1/3] Remove Manual combine-to
---
llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 313ae3d68fb83..9b7955eda8f8d 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -20178,7 +20178,7 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
// code won't do this, so we have to do it explicitly to avoid an infinite
// loop in obscure cases.)
if (ExpandedMask == ~0U)
- return TLO.CombineTo(Op, Op.getOperand(0));
+ return false;
auto IsLegalMask = [ShrunkMask, ExpandedMask](unsigned Mask) -> bool {
return (ShrunkMask & Mask) == ShrunkMask && (~ExpandedMask & Mask) == 0;
>From c57e5348da79100700da88f50383d2c73b5d956c Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Sat, 25 Oct 2025 18:25:20 -0400
Subject: [PATCH 2/3] Do not change demanded bits if it is already legal
---
llvm/lib/Target/ARM/ARMISelLowering.cpp | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 9b7955eda8f8d..daaba542e731f 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -20138,6 +20138,16 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
}
}
+static bool isLegalLogicalImmediate(unsigned Imm, const ARMSubtarget *Subtarget) {
+ // Handle special cases first
+ if (!Subtarget->isThumb())
+ return ARM_AM::getSOImmVal(Imm) != -1;
+ if (Subtarget->isThumb2())
+ return ARM_AM::getT2SOImmVal(Imm) != -1;
+ // Thumb1 only has 8-bit unsigned immediate.
+ return Imm <= 255;
+}
+
bool ARMTargetLowering::targetShrinkDemandedConstant(
SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
TargetLoweringOpt &TLO) const {
@@ -20178,6 +20188,14 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
// code won't do this, so we have to do it explicitly to avoid an infinite
// loop in obscure cases.)
if (ExpandedMask == ~0U)
+ return TLO.CombineTo(Op, Op.getOperand(0));
+
+ // Don't optimize if it is legal already.
+ if (isLegalLogicalImmediate(Mask, Subtarget))
+ return false;
+
+ // bic
+ if (isLegalLogicalImmediate(~Mask, Subtarget))
return false;
auto IsLegalMask = [ShrunkMask, ExpandedMask](unsigned Mask) -> bool {
@@ -20215,7 +20233,6 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
// We could try to recognize lsls+lsrs or lsrs+lsls pairs here.
// We could try to prefer Thumb1 immediates which can be lowered to a
// two-instruction sequence.
- // We could try to recognize more legal ARM/Thumb2 immediates here.
return false;
}
>From c42dff4d40c1c9416d07a93754180400f76fdec2 Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Sat, 25 Oct 2025 18:35:05 -0400
Subject: [PATCH 3/3] Update ARMISelLowering.cpp
---
llvm/lib/Target/ARM/ARMISelLowering.cpp | 28 ++++++++++++++++---------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index daaba542e731f..9e6f8c287b07a 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -20210,6 +20210,24 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
return TLO.CombineTo(Op, NewOp);
};
+ if (isLegalLogicalImmediate(Mask, Subtarget))
+ return false;
+
+ if (isLegalLogicalImmediate(~Mask, Subtarget))
+ return false;
+
+ if (isLegalLogicalImmediate(ShrunkMask, Subtarget))
+ return UseMask(ShrunkMask);
+
+ if (isLegalLogicalImmediate(~ShrunkMask, Subtarget))
+ return UseMask(ShrunkMask);
+
+ if (isLegalLogicalImmediate(ExpandedMask, Subtarget))
+ return UseMask(ExpandedMask);
+
+ if (isLegalLogicalImmediate(~ExpandedMask, Subtarget))
+ return UseMask(ExpandedMask);
+
// Prefer uxtb mask.
if (IsLegalMask(0xFF))
return UseMask(0xFF);
@@ -20218,16 +20236,6 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
if (IsLegalMask(0xFFFF))
return UseMask(0xFFFF);
- // [1, 255] is Thumb1 movs+ands, legal immediate for ARM/Thumb2.
- // FIXME: Prefer a contiguous sequence of bits for other optimizations.
- if (ShrunkMask < 256)
- return UseMask(ShrunkMask);
-
- // [-256, -2] is Thumb1 movs+bics, legal immediate for ARM/Thumb2.
- // FIXME: Prefer a contiguous sequence of bits for other optimizations.
- if ((int)ExpandedMask <= -2 && (int)ExpandedMask >= -256)
- return UseMask(ExpandedMask);
-
// Potential improvements:
//
// We could try to recognize lsls+lsrs or lsrs+lsls pairs here.
More information about the llvm-commits
mailing list