[llvm] [LLVM][SelectionDAG] Ensure Constant[FP]SDnode only store references to scalar Constant{Int,FP}. (PR #111005)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 10 09:20:55 PDT 2024
https://github.com/paulwalker-arm updated https://github.com/llvm/llvm-project/pull/111005
>From 43daf9c334557cd67eef0c025f88a173cddb5a97 Mon Sep 17 00:00:00 2001
From: Paul Walker <paul.walker at arm.com>
Date: Tue, 1 Oct 2024 14:57:27 +0100
Subject: [PATCH 1/2] [LLVM][SelectionDAG] Ensure Constant[FP]SDnode only store
references to scalar Constant{Int,FP}.
This fixes a failure path when the use-constant-##-for-###-splat
IR options are enabled.
---
llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 5 ++++-
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 15 +++++++++++++--
.../CodeGen/AArch64/sve-fp-immediates-merging.ll | 1 +
llvm/test/CodeGen/AArch64/sve-int-imm.ll | 1 +
4 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index 6067b3b29ea181..639e9311977502 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<VectorType>(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<VectorType>(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 498debf0955980..016d6990774549 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<VectorType>(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<VectorType>(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<ConstantFPSDNode>(isTarget, &V, VTs);
+ N = newSDNode<ConstantFPSDNode>(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 e1d883b0e78997..905d110e001c85 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 4be1abe8420081..47f4f0181dfbdf 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
>From 3f9b0bf67082e322b39faf55a9436a5b33397958 Mon Sep 17 00:00:00 2001
From: Paul Walker <paul.walker at arm.com>
Date: Thu, 10 Oct 2024 16:20:07 +0000
Subject: [PATCH 2/2] Update comment.
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 016d6990774549..ff4b2f409d7c33 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1657,7 +1657,7 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, const SDLoc &DL,
const ConstantInt *Elt = &Val;
// Vector splats are explicit within the DAG, with ConstantSDNode holding the
- // to be splatted scalar ConstantInt.
+ // to-be-splatted scalar ConstantInt.
if (isa<VectorType>(Elt->getType()))
Elt = ConstantInt::get(*getContext(), Elt->getValue());
@@ -1817,7 +1817,7 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP &V, const SDLoc &DL,
const ConstantFP *Elt = &V;
// Vector splats are explicit within the DAG, with ConstantFPSDNode holding
- // the to be splatted scalar ConstantFP.
+ // the to-be-splatted scalar ConstantFP.
if (isa<VectorType>(Elt->getType()))
Elt = ConstantFP::get(*getContext(), Elt->getValue());
More information about the llvm-commits
mailing list