[llvm] [AArch64] Have fallback for getSwappedCondition(CC) in the Fold check (NFC) (PR #160753)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 25 11:42:41 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/160753
>From d70460eec9e35d67ab4cfad1a1914afcf7e4d25d Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Thu, 25 Sep 2025 14:37:04 -0400
Subject: [PATCH] Have fallback for getSwappedCondition(CC)
NFC for now, but if we simplify nodes where we can remove a compare with 0 and we are stuck with condition codes MI or PL, we are in trouble, as you cannot swap that.
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index a4c1e265f0e63..5be310392d20a 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -25764,13 +25764,18 @@ static SDValue reassociateCSELOperandsForCSE(SDNode *N, SelectionDAG &DAG) {
// Try again with the operands of the SUBS instruction and the condition
// swapped. Due to canonicalization, this only helps for non-constant
// operands of the SUBS instruction.
+ auto NewCC = getSwappedCondition(CC);
+ if (NewCC == AArch64CC::AL)
+ return SDValue();
std::swap(CmpOpToMatch, CmpOpOther);
- if (SDValue R = Fold(getSwappedCondition(CC), CmpOpToMatch, CmpOpToMatch))
+ if (SDValue R = Fold(NewCC, CmpOpToMatch, CmpOpToMatch))
return R;
return SDValue();
}
- if ((CC == AArch64CC::EQ || CC == AArch64CC::NE) && !CmpOpConst->isZero())
+ if ((CC == AArch64CC::EQ || CC == AArch64CC::NE || CC == AArch64CC::MI ||
+ CC == AArch64CC::PL) &&
+ !CmpOpConst->isZero())
return SDValue();
// Next, search for a subtraction with a slightly different constant. By
@@ -25802,6 +25807,7 @@ static SDValue reassociateCSELOperandsForCSE(SDNode *N, SelectionDAG &DAG) {
case AArch64CC::HS:
return CheckedFold(!CmpOpConst->getAPIntValue().isZero(),
CmpOpConst->getAPIntValue() - 1, AArch64CC::HI);
+ case AArch64CC::MI:
case AArch64CC::LT:
return CheckedFold(!CmpOpConst->getAPIntValue().isMinSignedValue(),
CmpOpConst->getAPIntValue() - 1, AArch64CC::LE);
@@ -25811,6 +25817,7 @@ static SDValue reassociateCSELOperandsForCSE(SDNode *N, SelectionDAG &DAG) {
case AArch64CC::GT:
return CheckedFold(!CmpOpConst->getAPIntValue().isMaxSignedValue(),
CmpOpConst->getAPIntValue() + 1, AArch64CC::GE);
+ case AArch64CC::PL:
case AArch64CC::GE:
return CheckedFold(!CmpOpConst->getAPIntValue().isMinSignedValue(),
CmpOpConst->getAPIntValue() - 1, AArch64CC::GT);
More information about the llvm-commits
mailing list