-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LLVM][SelectionDAG] Ensure Constant[FP]SDnode only store references to scalar Constant{Int,FP}. #111005
[LLVM][SelectionDAG] Ensure Constant[FP]SDnode only store references to scalar Constant{Int,FP}. #111005
Conversation
…to scalar Constant{Int,FP}. This fixes a failure path when the use-constant-##-for-###-splat IR options are enabled.
@llvm/pr-subscribers-backend-aarch64 @llvm/pr-subscribers-llvm-selectiondag Author: Paul Walker (paulwalker-arm) ChangesThis fixes a failure path when the use-constant-##-for-###-splat IR options are enabled. Full diff: https://github.com/llvm/llvm-project/pull/111005.diff 4 Files Affected:
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
|
@@ -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!"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is just a thought, but is it worth tying these asserts down even further, i.e.
assert(val->getType()->isIntegerTy() && "Unexpected type!");
and similarly for the FP node? At the moment, these nodes still won't assert for any other unusual types.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's handled as part of ConstantInt
construction and thus here we can safely assume val
has a valid type for its class.
@@ -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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: to-be-splatted?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Beautiful, just beautiful!
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/73/builds/7074 Here is the relevant piece of the build log for the reference
|
…to scalar Constant{Int,FP}. (llvm#111005) This fixes a failure path when the use-constant-##-for-###-splat IR options are enabled.
…to scalar Constant{Int,FP}. (llvm#111005) This fixes a failure path when the use-constant-##-for-###-splat IR options are enabled.
…to scalar Constant{Int,FP}. (llvm#111005) This fixes a failure path when the use-constant-##-for-###-splat IR options are enabled.
This fixes a failure path when the use-constant-##-for-###-splat IR options are enabled.