[llvm] 73925b3 - [TableGen] Use PointerUnion for Operator and Val in TreePatternNode.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 16 20:19:14 PDT 2023
Author: Craig Topper
Date: 2023-04-16T20:10:51-07:00
New Revision: 73925b3a0c1dabc094ae38a712df34e95dd08446
URL: https://github.com/llvm/llvm-project/commit/73925b3a0c1dabc094ae38a712df34e95dd08446
DIFF: https://github.com/llvm/llvm-project/commit/73925b3a0c1dabc094ae38a712df34e95dd08446.diff
LOG: [TableGen] Use PointerUnion for Operator and Val in TreePatternNode.
These fields are never set at the same time so we can store them
using a single PointerUnion.
Added:
Modified:
llvm/utils/TableGen/CodeGenDAGPatterns.cpp
llvm/utils/TableGen/CodeGenDAGPatterns.h
Removed:
################################################################################
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
index d8ec427b2f35..7246da8feb45 100644
--- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -2397,10 +2397,10 @@ bool TreePatternNode::NodeHasProperty(SDNP Property,
return Int->hasProperty(Property);
}
- if (!Operator->isSubClassOf("SDPatternOperator"))
+ if (!getOperator()->isSubClassOf("SDPatternOperator"))
return false;
- return CGP.getSDNodeInfo(Operator).hasProperty(Property);
+ return CGP.getSDNodeInfo(getOperator()).hasProperty(Property);
}
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.h b/llvm/utils/TableGen/CodeGenDAGPatterns.h
index 0dd99a4a51fa..998ba968f072 100644
--- a/llvm/utils/TableGen/CodeGenDAGPatterns.h
+++ b/llvm/utils/TableGen/CodeGenDAGPatterns.h
@@ -19,6 +19,7 @@
#include "SDNodeProperties.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/MapVector.h"
+#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringSet.h"
@@ -633,13 +634,10 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
/// The index of each result in results of the pattern.
std::vector<unsigned> ResultPerm;
- /// Operator - The Record for the operator if this is an interior node (not
- /// a leaf).
- Record *Operator;
-
- /// Val - The init value (e.g. the "GPRC" record, or "7") for a leaf.
- ///
- Init *Val;
+ /// OperatorOrVal - The Record for the operator if this is an interior node
+ /// (not a leaf) or the init value (e.g. the "GPRC" record, or "7") for a
+ /// leaf.
+ PointerUnion<Record *, Init *> OperatorOrVal;
/// Name - The name given to this node with the :$foo notation.
///
@@ -664,14 +662,13 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
public:
TreePatternNode(Record *Op, std::vector<TreePatternNodePtr> Ch,
unsigned NumResults)
- : Operator(Op), Val(nullptr), TransformFn(nullptr),
- Children(std::move(Ch)) {
+ : OperatorOrVal(Op), TransformFn(nullptr), Children(std::move(Ch)) {
Types.resize(NumResults);
ResultPerm.resize(NumResults);
std::iota(ResultPerm.begin(), ResultPerm.end(), 0);
}
- TreePatternNode(Init *val, unsigned NumResults) // leaf ctor
- : Operator(nullptr), Val(val), TransformFn(nullptr) {
+ TreePatternNode(Init *val, unsigned NumResults) // leaf ctor
+ : OperatorOrVal(val), TransformFn(nullptr) {
Types.resize(NumResults);
ResultPerm.resize(NumResults);
std::iota(ResultPerm.begin(), ResultPerm.end(), 0);
@@ -691,7 +688,7 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
NamesAsPredicateArg.push_back(N);
}
- bool isLeaf() const { return Val != nullptr; }
+ bool isLeaf() const { return isa<Init *>(OperatorOrVal); }
// Type accessors.
unsigned getNumTypes() const { return Types.size(); }
@@ -719,8 +716,14 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
unsigned getResultIndex(unsigned ResNo) const { return ResultPerm[ResNo]; }
void setResultIndex(unsigned ResNo, unsigned RI) { ResultPerm[ResNo] = RI; }
- Init *getLeafValue() const { assert(isLeaf()); return Val; }
- Record *getOperator() const { assert(!isLeaf()); return Operator; }
+ Init *getLeafValue() const {
+ assert(isLeaf());
+ return cast<Init *>(OperatorOrVal);
+ }
+ Record *getOperator() const {
+ assert(!isLeaf());
+ return cast<Record *>(OperatorOrVal);
+ }
unsigned getNumChildren() const { return Children.size(); }
TreePatternNode *getChild(unsigned N) const { return Children[N].get(); }
More information about the llvm-commits
mailing list