[llvm] [X86] Fix places where we use X86ISD::CMP where we should use SUBS (PR #163476)

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 14 18:34:41 PDT 2025


https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/163476

>From 077d2f29ca8271cc5510333e171d002b4637180f Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Tue, 14 Oct 2025 20:00:30 -0400
Subject: [PATCH] [X86] Fix places where we use X86ISD::CMP where we should use
 SUBS

---
 llvm/lib/Target/X86/X86ISelLowering.cpp | 44 ++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index c32b1a66356ea..7efa04430e434 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -48966,9 +48966,16 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC,
         DAG.ComputeNumSignBits(BC) > (BCNumEltBits - NumEltBits)) {
       SDLoc DL(EFLAGS);
       APInt CmpMask = APInt::getLowBitsSet(32, IsAnyOf ? 0 : BCNumElts);
-      return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
-                         DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, BC),
-                         DAG.getConstant(CmpMask, DL, MVT::i32));
+      if (CmpMask.isZero()) {
+        return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
+                           DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, BC),
+                           DAG.getConstant(CmpMask, DL, MVT::i32));
+      } else {
+        SDVTList CmpVTs = DAG.getVTList(MVT::i32, MVT::i32);
+        return DAG.getNode(X86ISD::SUB, DL, CmpVTs,
+                           DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, BC),
+                           DAG.getConstant(CmpMask, DL, MVT::i32)).getValue(1);
+      }
     }
   }
 
@@ -48987,9 +48994,16 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC,
                               DAG.getBitcast(SubVT, Ops[0]),
                               DAG.getBitcast(SubVT, Ops[1]));
       V = DAG.getBitcast(VecVT.getHalfNumVectorElementsVT(), V);
-      return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
-                         DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, V),
-                         DAG.getConstant(CmpMask, DL, MVT::i32));
+      if (CmpMask.isZero()) {
+        return DAG.getNode(X86ISD::CMP, DL, MVT::i32,
+                           DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, V),
+                           DAG.getConstant(CmpMask, DL, MVT::i32));
+      } else {
+        SDVTList CmpVTs = DAG.getVTList(MVT::i32, MVT::i32);
+        return DAG.getNode(X86ISD::SUB, DL, CmpVTs,
+                           DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, V),
+                           DAG.getConstant(CmpMask, DL, MVT::i32)).getValue(1);
+      }
     }
   }
 
@@ -49072,8 +49086,14 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC,
           Result = DAG.getNode(ISD::AND, DL, MVT::i32, Result,
                                DAG.getConstant(0xAAAAAAAA, DL, MVT::i32));
         }
-        return DAG.getNode(X86ISD::CMP, DL, MVT::i32, Result,
-                           DAG.getConstant(CmpMask, DL, MVT::i32));
+        if (CmpMask == 0) {
+          return DAG.getNode(X86ISD::CMP, DL, MVT::i32, Result,
+                             DAG.getConstant(CmpMask, DL, MVT::i32));
+        } else {
+          SDVTList CmpVTs = DAG.getVTList(MVT::i32, MVT::i32);
+          return DAG.getNode(X86ISD::SUB, DL, CmpVTs, Result,
+                             DAG.getConstant(CmpMask, DL, MVT::i32)).getValue(1);
+        }
       }
     }
   }
@@ -49106,7 +49126,13 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC,
     Result = DAG.getNode(X86ISD::MOVMSK, DL, MVT::i32, Result);
     Result =
         DAG.getZExtOrTrunc(Result, DL, EFLAGS.getOperand(0).getValueType());
-    return DAG.getNode(X86ISD::CMP, DL, MVT::i32, Result, EFLAGS.getOperand(1));
+    SDValue CmpVal = EFLAGS.getOperand(1);
+    if (isNullConstant(CmpVal)) {
+      return DAG.getNode(X86ISD::CMP, DL, MVT::i32, Result, CmpVal);
+    } else {
+      SDVTList CmpVTs = DAG.getVTList(Result.getValueType(), MVT::i32);
+      return DAG.getNode(X86ISD::SUB, DL, CmpVTs, Result, CmpVal).getValue(1);
+    }
   }
 
   // MOVMSKPS(V) !=/== 0 -> TESTPS(V,V)



More information about the llvm-commits mailing list