diff options
Diffstat (limited to 'llvm/utils/TableGen/CodeGenIntrinsics.h')
-rw-r--r-- | llvm/utils/TableGen/CodeGenIntrinsics.h | 64 |
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]; |