[llvm] Isd splat vector (PR #189529)

Kartik Ohlan via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 30 21:42:44 PDT 2026


https://github.com/Ko496-glitch created https://github.com/llvm/llvm-project/pull/189529

fix #189481

Added the switch for splat_vector
Added the IR coverage

Signed off by : ko496

>From 07a84b16be6a4711614b49947bda0c65839dbe87 Mon Sep 17 00:00:00 2001
From: kartikohlan <kartik7ohlan at gmail.com>
Date: Tue, 31 Mar 2026 00:28:05 -0400
Subject: [PATCH] Adding SelectionDag and fix the format

---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  8 +++-
 .../AArch64/AArch64SelectionDAGTest.cpp       | 47 +++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index dd810a07c9aa8..ca975c27fc330 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6112,6 +6112,12 @@ KnownFPClass SelectionDAG::computeKnownFPClass(SDValue Op,
     }
     break;
   }
+
+  case ISD::SPLAT_VECTOR: {
+      Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
+      break;
+    }
+
   default:
     if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
         Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
@@ -6122,7 +6128,7 @@ KnownFPClass SelectionDAG::computeKnownFPClass(SDValue Op,
   }
 
   return Known;
-}
+ }
 
 bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN,
                                    unsigned Depth) const {
diff --git a/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp b/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
index 12b7763274f6c..9b79647066a0a 100644
--- a/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
+++ b/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
@@ -1701,4 +1701,51 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownFPClass_UndefAndPoison) {
   EXPECT_FALSE(*Known.SignBit);
 }
 
+TEST_F(AArch64SelectionDAGTest, ComputeKnownFPClass_SplatVector) {
+  SDLoc Loc;
+  EVT ScalableVT = EVT::getVectorVT(Context, MVT::f32, 4, /*Scalable=*/true);
+  KnownFPClass Known;
+
+  SDValue Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(1.0, Loc, MVT::f32));
+  ASSERT_EQ(Splat.getOpcode(), ISD::SPLAT_VECTOR);
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosNormal);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(-1.0, Loc, MVT::f32));
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcNegNormal);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_TRUE(*Known.SignBit);
+
+  Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(APFloat::getZero(APFloat::IEEEsingle()), Loc, MVT::f32));
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosZero);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(APFloat::getZero(APFloat::IEEEsingle(), true), Loc, MVT::f32));
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcNegZero);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_TRUE(*Known.SignBit);
+
+  Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(APFloat::getInf(APFloat::IEEEsingle()), Loc, MVT::f32));
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosInf);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  Splat = DAG->getSplatVector(ScalableVT, Loc,
+      DAG->getConstantFP(APFloat::getQNaN(APFloat::IEEEsingle()), Loc, MVT::f32));
+  Known = DAG->computeKnownFPClass(Splat, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcQNan);
+}
+
 } // end namespace llvm



More information about the llvm-commits mailing list