[llvm] [LLVM][AArch64] Correctly lower funnel shifts by zero. (PR #140058)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 15 06:33:46 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Paul Walker (paulwalker-arm)
<details>
<summary>Changes</summary>
Prevent LowerFunnelShift from creating an invalid ISD::FSHR when lowering "ISD::FSHL X, Y, 0". Such inputs are rare because it's a NOP that DAGCombiner will optimise away. However, we shoudl not rely on this and so this PR mirror the same optimisation.
NOTE: To simiplify testing, this PR also adds a command line option to disable the DAG combiner (-combiner-disabled).
---
Full diff: https://github.com/llvm/llvm-project/pull/140058.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (+6-1)
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+6)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index d6e288a59b2ee..2b752498f64a1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -149,6 +149,10 @@ static cl::opt<bool> EnableShrinkLoadReplaceStoreWithStore(
cl::desc("DAG combiner enable load/<replace bytes>/store with "
"a narrower store"));
+static cl::opt<bool> DisableCombines("combiner-disabled", cl::Hidden,
+ cl::init(false),
+ cl::desc("Disable the DAG combiner"));
+
namespace {
class DAGCombiner {
@@ -248,7 +252,8 @@ namespace {
STI(D.getSubtarget().getSelectionDAGInfo()), OptLevel(OL),
BatchAA(BatchAA) {
ForCodeSize = DAG.shouldOptForSize();
- DisableGenericCombines = STI && STI->disableGenericCombines(OptLevel);
+ DisableGenericCombines =
+ DisableCombines || (STI && STI->disableGenericCombines(OptLevel));
MaximumLegalStoreInBits = 0;
// We use the minimum store size here, since that's all we can guarantee
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index fb7f7d6f7537d..7206a619cb767 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -7266,12 +7266,18 @@ static SDValue LowerFunnelShift(SDValue Op, SelectionDAG &DAG) {
MVT VT = Op.getSimpleValueType();
if (Op.getOpcode() == ISD::FSHL) {
+ if (ShiftNo->isZero())
+ return Op.getOperand(0);
+
unsigned int NewShiftNo =
VT.getFixedSizeInBits() - ShiftNo->getZExtValue();
return DAG.getNode(
ISD::FSHR, DL, VT, Op.getOperand(0), Op.getOperand(1),
DAG.getConstant(NewShiftNo, DL, Shifts.getValueType()));
} else if (Op.getOpcode() == ISD::FSHR) {
+ if (ShiftNo->isZero())
+ return Op.getOperand(1);
+
return Op;
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/140058
More information about the llvm-commits
mailing list