[llvm] [AArch64] Spare N2I roundtrip when splatting float comparison (PR #141806)

David Green via llvm-commits llvm-commits at lists.llvm.org
Thu May 29 09:42:20 PDT 2025


================
@@ -11099,6 +11138,29 @@ SDValue AArch64TargetLowering::LowerSELECT_CC(ISD::CondCode CC, SDValue LHS,
          LHS.getValueType() == MVT::f64);
   assert(LHS.getValueType() == RHS.getValueType());
   EVT VT = TVal.getValueType();
+
+  // If the purpose of the comparison is to select between all ones
+  // or all zeros, use a vector comparison because the operands are already
+  // stored in SIMD registers.
+  auto *CTVal = dyn_cast<ConstantSDNode>(TVal);
+  auto *CFVal = dyn_cast<ConstantSDNode>(FVal);
+  if (Subtarget->isNeonAvailable() &&
+      (VT.getSizeInBits() == LHS.getValueType().getSizeInBits()) && CTVal &&
+      CFVal &&
+      ((CTVal->isAllOnes() && CFVal->isZero()) ||
+       ((CTVal->isZero()) && CFVal->isAllOnes()))) {
----------------
davemgreen wrote:

Can drop brackets from (CTVal->isZero()).

https://github.com/llvm/llvm-project/pull/141806


More information about the llvm-commits mailing list