aboutsummaryrefslogtreecommitdiff
path: root/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen/Basic/CodeGenIntrinsics.h')
-rw-r--r--llvm/utils/TableGen/Basic/CodeGenIntrinsics.h104
1 files changed, 66 insertions, 38 deletions
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
index 403706407fdb..8428d09a9400 100644
--- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
+++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
@@ -10,11 +10,12 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H
-#define LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H
+#ifndef LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H
+#define LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H
#include "SDNodeProperties.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/ModRef.h"
#include <string>
@@ -25,13 +26,22 @@ namespace llvm {
class Record;
class RecordKeeper;
+// Global information needed to build intrinsics.
+struct CodeGenIntrinsicContext {
+ explicit CodeGenIntrinsicContext(const RecordKeeper &RC);
+ std::vector<const Record *> DefaultProperties;
+
+ // Maximum number of values an intrinsic can return.
+ unsigned MaxNumReturn;
+};
+
struct CodeGenIntrinsic {
- Record *TheDef; // The actual record defining this intrinsic.
+ const Record *TheDef; // The actual record defining this intrinsic.
std::string Name; // The name of the LLVM function "llvm.bswap.i32"
- std::string EnumName; // The name of the enum "bswap_i32"
- std::string ClangBuiltinName; // Name of the corresponding GCC builtin, or "".
- std::string MSBuiltinName; // Name of the corresponding MS builtin, or "".
- std::string TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics.
+ StringRef EnumName; // The name of the enum "bswap_i32"
+ StringRef ClangBuiltinName; // Name of the corresponding GCC builtin, or "".
+ StringRef MSBuiltinName; // Name of the corresponding MS builtin, or "".
+ StringRef TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics.
/// This structure holds the return values and parameter values of an
/// intrinsic. If the number of return values is > 1, then the intrinsic
@@ -43,13 +53,13 @@ struct CodeGenIntrinsic {
/// only populated when in the context of a target .td file. When building
/// Intrinsics.td, this isn't available, because we don't know the target
/// pointer size.
- std::vector<Record *> RetTys;
+ std::vector<const Record *> RetTys;
/// The MVT::SimpleValueType for each parameter type. Note that this list is
/// only populated when in the context of a target .td file. When building
/// Intrinsics.td, this isn't available, because we don't know the target
/// pointer size.
- std::vector<Record *> ParamTys;
+ std::vector<const Record *> ParamTys;
};
IntrinsicSignature IS;
@@ -58,54 +68,54 @@ struct CodeGenIntrinsic {
MemoryEffects ME = MemoryEffects::unknown();
/// SDPatternOperator Properties applied to the intrinsic.
- unsigned Properties;
+ unsigned Properties = 0;
/// This is set to true if the intrinsic is overloaded by its argument
/// types.
- bool isOverloaded;
+ bool isOverloaded = false;
/// True if the intrinsic is commutative.
- bool isCommutative;
+ bool isCommutative = false;
/// True if the intrinsic can throw.
- bool canThrow;
+ bool canThrow = false;
/// True if the intrinsic is marked as noduplicate.
- bool isNoDuplicate;
+ bool isNoDuplicate = false;
/// True if the intrinsic is marked as nomerge.
- bool isNoMerge;
+ bool isNoMerge = false;
/// True if the intrinsic is no-return.
- bool isNoReturn;
+ bool isNoReturn = false;
/// True if the intrinsic is no-callback.
- bool isNoCallback;
+ bool isNoCallback = false;
/// True if the intrinsic is no-sync.
- bool isNoSync;
+ bool isNoSync = false;
/// True if the intrinsic is no-free.
- bool isNoFree;
+ bool isNoFree = false;
/// True if the intrinsic is will-return.
- bool isWillReturn;
+ bool isWillReturn = false;
/// True if the intrinsic is cold.
- bool isCold;
+ bool isCold = false;
/// True if the intrinsic is marked as convergent.
- bool isConvergent;
+ bool isConvergent = false;
/// True if the intrinsic has side effects that aren't captured by any
/// of the other flags.
- bool hasSideEffects;
+ bool hasSideEffects = false;
// True if the intrinsic is marked as speculatable.
- bool isSpeculatable;
+ bool isSpeculatable = false;
// True if the intrinsic is marked as strictfp.
- bool isStrictFP;
+ bool isStrictFP = false;
enum ArgAttrKind {
NoCapture,
@@ -139,12 +149,12 @@ struct CodeGenIntrinsic {
bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); }
- /// Goes through all IntrProperties that have IsDefault
- /// value set and sets the property.
- void setDefaultProperties(Record *R, ArrayRef<Record *> DefaultProperties);
+ /// Goes through all IntrProperties that have IsDefault value set and sets
+ /// the property.
+ void setDefaultProperties(ArrayRef<const Record *> DefaultProperties);
- /// Helper function to set property \p Name to true;
- void setProperty(Record *R);
+ /// Helper function to set property \p Name to true.
+ void setProperty(const Record *R);
/// Returns true if the parameter at \p ParamIdx is a pointer type. Returns
/// false if the parameter is not a pointer, or \p ParamIdx is greater than
@@ -155,32 +165,50 @@ struct CodeGenIntrinsic {
bool isParamImmArg(unsigned ParamIdx) const;
- CodeGenIntrinsic(Record *R, ArrayRef<Record *> DefaultProperties);
+ CodeGenIntrinsic(const Record *R, const CodeGenIntrinsicContext &Ctx);
};
class CodeGenIntrinsicTable {
- std::vector<CodeGenIntrinsic> Intrinsics;
-
public:
struct TargetSet {
- std::string Name;
+ StringRef Name;
size_t Offset;
size_t Count;
};
- std::vector<TargetSet> Targets;
explicit CodeGenIntrinsicTable(const RecordKeeper &RC);
- CodeGenIntrinsicTable() = default;
bool empty() const { return Intrinsics.empty(); }
size_t size() const { return Intrinsics.size(); }
auto begin() const { return Intrinsics.begin(); }
auto end() const { return Intrinsics.end(); }
- CodeGenIntrinsic &operator[](size_t Pos) { return Intrinsics[Pos]; }
const CodeGenIntrinsic &operator[](size_t Pos) const {
return Intrinsics[Pos];
}
+ ArrayRef<CodeGenIntrinsic> operator[](const TargetSet &Set) const {
+ return ArrayRef(&Intrinsics[Set.Offset], Set.Count);
+ }
+ ArrayRef<TargetSet> getTargets() const { return Targets; }
+
+private:
+ void CheckDuplicateIntrinsics() const;
+ void CheckTargetIndependentIntrinsics() const;
+ void CheckOverloadSuffixConflicts() const;
+
+ std::vector<CodeGenIntrinsic> Intrinsics;
+ std::vector<TargetSet> Targets;
+};
+
+// This class builds `CodeGenIntrinsic` on demand for a given Def.
+class CodeGenIntrinsicMap {
+ DenseMap<const Record *, std::unique_ptr<CodeGenIntrinsic>> Map;
+ const CodeGenIntrinsicContext Ctx;
+
+public:
+ explicit CodeGenIntrinsicMap(const RecordKeeper &RC) : Ctx(RC) {}
+ const CodeGenIntrinsic &operator[](const Record *Def);
};
+
} // namespace llvm
-#endif
+#endif // LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H