[llvm] [AArch64] Check for negative numbers when adjusting icmps (PR #141151)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 29 08:50:36 PDT 2025
================
@@ -3762,58 +3770,82 @@ static unsigned getCmpOperandFoldingProfit(SDValue Op) {
return 0;
}
+// emitComparison() converts comparison with one or negative one to comparison
+// with 0.
+static bool shouldBeAdjustedToZero(SDValue LHS, APInt C, ISD::CondCode &CC) {
+ // Only works for not unsigned comparisons.
+ if (isUnsignedIntSetCC(CC))
+ return false;
+
+ // Only works for ANDS and AND.
+ if (LHS.getOpcode() != ISD::AND && LHS.getOpcode() != AArch64ISD::ANDS)
+ return false;
+
+ if (C.isOne() && (CC == ISD::SETLT || CC == ISD::SETGE)) {
+ CC = (CC == ISD::SETLT) ? ISD::SETLE : ISD::SETGT;
+ return true;
+ }
+
+ if (C.isAllOnes() && (CC == ISD::SETLE || CC == ISD::SETGT)) {
+ CC = (CC == ISD::SETLE) ? ISD::SETLT : ISD::SETGE;
+ return true;
+ }
+
+ return false;
+}
+
static SDValue getAArch64Cmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
SDValue &AArch64cc, SelectionDAG &DAG,
const SDLoc &dl) {
if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS.getNode())) {
EVT VT = RHS.getValueType();
- uint64_t C = RHSC->getZExtValue();
- if (!isLegalArithImmed(C)) {
+ APInt C = RHSC->getAPIntValue();
+ int64_t C = RHSC->getSExtValue();
----------------
AZero13 wrote:
Fixed it!
https://github.com/llvm/llvm-project/pull/141151
More information about the llvm-commits
mailing list