aboutsummaryrefslogtreecommitdiff
path: root/llvm/utils/TableGen/CodeGenIntrinsics.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen/CodeGenIntrinsics.h')
-rw-r--r--llvm/utils/TableGen/CodeGenIntrinsics.h64
1 files changed, 13 insertions, 51 deletions
diff --git a/llvm/utils/TableGen/CodeGenIntrinsics.h b/llvm/utils/TableGen/CodeGenIntrinsics.h
index 599795e3c065..0558918b3028 100644
--- a/llvm/utils/TableGen/CodeGenIntrinsics.h
+++ b/llvm/utils/TableGen/CodeGenIntrinsics.h
@@ -14,7 +14,9 @@
#define LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H
#include "SDNodeProperties.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/MachineValueType.h"
+#include "llvm/Support/ModRef.h"
#include <string>
#include <vector>
@@ -57,51 +59,8 @@ struct CodeGenIntrinsic {
IntrinsicSignature IS;
- /// Bit flags describing the type (ref/mod) and location of memory
- /// accesses that may be performed by the intrinsics. Analogous to
- /// \c FunctionModRefBehaviour.
- enum ModRefBits {
- /// The intrinsic may access memory that is otherwise inaccessible via
- /// LLVM IR.
- MR_InaccessibleMem = 1,
-
- /// The intrinsic may access memory through pointer arguments.
- /// LLVM IR.
- MR_ArgMem = 2,
-
- /// The intrinsic may access memory anywhere, i.e. it is not restricted
- /// to access through pointer arguments.
- MR_Anywhere = 4 | MR_ArgMem | MR_InaccessibleMem,
-
- /// The intrinsic may read memory.
- MR_Ref = 8,
-
- /// The intrinsic may write memory.
- MR_Mod = 16,
-
- /// The intrinsic may both read and write memory.
- MR_ModRef = MR_Ref | MR_Mod,
- };
-
- /// Memory mod/ref behavior of this intrinsic, corresponding to intrinsic
- /// properties (IntrReadMem, IntrArgMemOnly, etc.).
- enum ModRefBehavior {
- NoMem = 0,
- ReadArgMem = MR_Ref | MR_ArgMem,
- ReadInaccessibleMem = MR_Ref | MR_InaccessibleMem,
- ReadInaccessibleMemOrArgMem = MR_Ref | MR_ArgMem | MR_InaccessibleMem,
- ReadMem = MR_Ref | MR_Anywhere,
- WriteArgMem = MR_Mod | MR_ArgMem,
- WriteInaccessibleMem = MR_Mod | MR_InaccessibleMem,
- WriteInaccessibleMemOrArgMem = MR_Mod | MR_ArgMem | MR_InaccessibleMem,
- WriteMem = MR_Mod | MR_Anywhere,
- ReadWriteArgMem = MR_ModRef | MR_ArgMem,
- ReadWriteInaccessibleMem = MR_ModRef | MR_InaccessibleMem,
- ReadWriteInaccessibleMemOrArgMem = MR_ModRef | MR_ArgMem |
- MR_InaccessibleMem,
- ReadWriteMem = MR_ModRef | MR_Anywhere,
- };
- ModRefBehavior ModRef;
+ /// Memory effects of the intrinsic.
+ MemoryEffects ME = MemoryEffects::unknown();
/// SDPatternOperator Properties applied to the intrinsic.
unsigned Properties;
@@ -154,6 +113,7 @@ struct CodeGenIntrinsic {
NoCapture,
NoAlias,
NoUndef,
+ NonNull,
Returned,
ReadOnly,
WriteOnly,
@@ -163,20 +123,20 @@ struct CodeGenIntrinsic {
};
struct ArgAttribute {
- unsigned Index;
ArgAttrKind Kind;
uint64_t Value;
- ArgAttribute(unsigned Idx, ArgAttrKind K, uint64_t V)
- : Index(Idx), Kind(K), Value(V) {}
+ ArgAttribute(ArgAttrKind K, uint64_t V) : Kind(K), Value(V) {}
bool operator<(const ArgAttribute &Other) const {
- return std::tie(Index, Kind, Value) <
- std::tie(Other.Index, Other.Kind, Other.Value);
+ return std::tie(Kind, Value) < std::tie(Other.Kind, Other.Value);
}
};
- std::vector<ArgAttribute> ArgumentAttributes;
+ /// Vector of attributes for each argument.
+ SmallVector<SmallVector<ArgAttribute, 0>> ArgumentAttributes;
+
+ void addArgAttribute(unsigned Idx, ArgAttrKind AK, uint64_t V = 0);
bool hasProperty(enum SDNP Prop) const {
return Properties & (1 << Prop);
@@ -217,6 +177,8 @@ public:
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];