[llvm] [SelectionDAG] Verify SPLAT_VECTOR nodes when they are created. (PR #88305)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 10 11:24:57 PDT 2024


https://github.com/topperc created https://github.com/llvm/llvm-project/pull/88305

This applies the same rules we have for the scalar operands of a BUILD_VECTOR where the scalar type must match the element type or for integer vectors we allow the scalar type to be larger than the element type. Hexagon uses i32 for an FP zero vector so we allow that as an exception.

>From f0913a81e6fadc30b59022614cb1b35416a52ac0 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 10 Apr 2024 11:20:42 -0700
Subject: [PATCH] [SelectionDAG] Verify SPLAT_VECTOR nodes when they are
 created.

This applies the same rules we have for the scalar operands of
a BUILD_VECTOR where the scalar type must match the element type
or for integer vectors we allow the scalar type to be larger than
the element type. Hexagon uses i32 for an FP zero vector so we allow
that as an exception.
---
 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 1dd0fa49a460f8..ec0250d15b2f9a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6020,6 +6020,17 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
     if (N1.getValueType().getScalarType() == MVT::i1)
       return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
     break;
+  case ISD::SPLAT_VECTOR:
+    assert(VT.isVector() && "Wrong return type!");
+    // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
+    // that for now.
+    assert((VT.getVectorElementType() == N1.getValueType() ||
+            (!VT.isInteger() && N1.getValueType() == MVT::i32) ||
+            (VT.getVectorElementType().isInteger() &&
+             N1.getValueType().isInteger() &&
+             VT.getVectorElementType().bitsLE(N1.getValueType()))) &&
+           "Wrong operand type!");
+    break;
   }
 
   SDNode *N;



More information about the llvm-commits mailing list