diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index 6067b3b29ea18..639e931197750 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -1678,6 +1678,7 @@ class ConstantSDNode : public SDNode { : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, 0, DebugLoc(), VTs), Value(val) { + assert(!isa(val->getType()) && "Unexpected vector type!"); ConstantSDNodeBits.IsOpaque = isOpaque; } @@ -1730,7 +1731,9 @@ class ConstantFPSDNode : public SDNode { ConstantFPSDNode(bool isTarget, const ConstantFP *val, SDVTList VTs) : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP, 0, DebugLoc(), VTs), - Value(val) {} + Value(val) { + assert(!isa(val->getType()) && "Unexpected vector type!"); + } public: const APFloat& getValueAPF() const { return Value->getValueAPF(); } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 498debf095598..ff4b2f409d7c3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1656,6 +1656,11 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, const SDLoc &DL, EVT EltVT = VT.getScalarType(); const ConstantInt *Elt = &Val; + // Vector splats are explicit within the DAG, with ConstantSDNode holding the + // to-be-splatted scalar ConstantInt. + if (isa(Elt->getType())) + Elt = ConstantInt::get(*getContext(), Elt->getValue()); + // In some cases the vector type is legal but the element type is illegal and // needs to be promoted, for example v8i8 on ARM. In this case, promote the // inserted value (the type does not need to match the vector element type). @@ -1809,6 +1814,12 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP &V, const SDLoc &DL, assert(VT.isFloatingPoint() && "Cannot create integer FP constant!"); EVT EltVT = VT.getScalarType(); + const ConstantFP *Elt = &V; + + // Vector splats are explicit within the DAG, with ConstantFPSDNode holding + // the to-be-splatted scalar ConstantFP. + if (isa(Elt->getType())) + Elt = ConstantFP::get(*getContext(), Elt->getValue()); // Do the map lookup using the actual bit pattern for the floating point // value, so that we don't have problems with 0.0 comparing equal to -0.0, and @@ -1817,7 +1828,7 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP &V, const SDLoc &DL, SDVTList VTs = getVTList(EltVT); FoldingSetNodeID ID; AddNodeIDNode(ID, Opc, VTs, {}); - ID.AddPointer(&V); + ID.AddPointer(Elt); void *IP = nullptr; SDNode *N = nullptr; if ((N = FindNodeOrInsertPos(ID, DL, IP))) @@ -1825,7 +1836,7 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP &V, const SDLoc &DL, return SDValue(N, 0); if (!N) { - N = newSDNode(isTarget, &V, VTs); + N = newSDNode(isTarget, Elt, VTs); CSEMap.InsertNode(N, IP); InsertNode(N); } diff --git a/llvm/test/CodeGen/AArch64/sve-fp-immediates-merging.ll b/llvm/test/CodeGen/AArch64/sve-fp-immediates-merging.ll index e1d883b0e7899..905d110e001c8 100644 --- a/llvm/test/CodeGen/AArch64/sve-fp-immediates-merging.ll +++ b/llvm/test/CodeGen/AArch64/sve-fp-immediates-merging.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s | FileCheck %s +; RUN: llc -use-constant-fp-for-scalable-splat < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" diff --git a/llvm/test/CodeGen/AArch64/sve-int-imm.ll b/llvm/test/CodeGen/AArch64/sve-int-imm.ll index 4be1abe842008..47f4f0181dfbd 100644 --- a/llvm/test/CodeGen/AArch64/sve-int-imm.ll +++ b/llvm/test/CodeGen/AArch64/sve-int-imm.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -use-constant-int-for-scalable-splat < %s | FileCheck %s ; ; SVE Arith Vector Immediate Unpredicated CodeGen