@@ -322,29 +322,42 @@ multiclass AttrEnum<string cppType_> {
322322/// Traits generally map to llvm::Attributes.
323323// ============================================================================
324324
325- class Trait;
325+ class TraitProperty;
326+ def FnTrait : TraitProperty;
327+ def ParamTrait : TraitProperty;
328+ def RetTrait : TraitProperty;
326329
327- class LlvmEnumAttributeTrait<string llvmEnum_> : Trait {
330+ class Trait<list<TraitProperty> P> {
331+ list<TraitProperty> Properties = P;
332+ }
333+
334+ class LlvmEnumAttributeTrait<string llvmEnum_, list<TraitProperty> P> : Trait<P> {
328335 string llvmEnum = llvmEnum_;
329336}
330337
331- def NoUnwind : LlvmEnumAttributeTrait<"NoUnwind">;
332- def WillReturn : LlvmEnumAttributeTrait<"WillReturn">;
333- def NoReturn : LlvmEnumAttributeTrait<"NoReturn">;
334- def NoRecurse : LlvmEnumAttributeTrait<"NoRecurse">;
335- def NoSync : LlvmEnumAttributeTrait<"NoSync">;
336- def NoFree : LlvmEnumAttributeTrait<"NoFree">;
337- def MustProgress : LlvmEnumAttributeTrait<"MustProgress">;
338- def NoCallback : LlvmEnumAttributeTrait<"NoCallback">;
339- def NoDuplicate : LlvmEnumAttributeTrait<"NoDuplicate">;
340- def NoBuiltin : LlvmEnumAttributeTrait<"NoBuiltin">;
341- def Builtin : LlvmEnumAttributeTrait<"Builtin">;
342- def InlineHint : LlvmEnumAttributeTrait<"InlineHint">;
343- def AlwaysInline : LlvmEnumAttributeTrait<"AlwaysInline">;
344- def Cold : LlvmEnumAttributeTrait<"Cold">;
345- def Hot : LlvmEnumAttributeTrait<"Hot">;
346- def Convergent : LlvmEnumAttributeTrait<"Convergent">;
347- def Speculatable : LlvmEnumAttributeTrait<"Speculatable">;
338+ def NoUnwind : LlvmEnumAttributeTrait<"NoUnwind", [FnTrait]>;
339+ def WillReturn : LlvmEnumAttributeTrait<"WillReturn", [FnTrait]>;
340+ def NoReturn : LlvmEnumAttributeTrait<"NoReturn", [FnTrait]>;
341+ def NoRecurse : LlvmEnumAttributeTrait<"NoRecurse", [FnTrait]>;
342+ def NoSync : LlvmEnumAttributeTrait<"NoSync", [FnTrait]>;
343+ def NoFree : LlvmEnumAttributeTrait<"NoFree", [FnTrait]>;
344+ def MustProgress : LlvmEnumAttributeTrait<"MustProgress", [FnTrait]>;
345+ def NoCallback : LlvmEnumAttributeTrait<"NoCallback", [FnTrait]>;
346+ def NoDuplicate : LlvmEnumAttributeTrait<"NoDuplicate", [FnTrait]>;
347+ def NoBuiltin : LlvmEnumAttributeTrait<"NoBuiltin", [FnTrait]>;
348+ def Builtin : LlvmEnumAttributeTrait<"Builtin", [FnTrait]>;
349+ def InlineHint : LlvmEnumAttributeTrait<"InlineHint", [FnTrait]>;
350+ def AlwaysInline : LlvmEnumAttributeTrait<"AlwaysInline", [FnTrait]>;
351+ def Cold : LlvmEnumAttributeTrait<"Cold", [FnTrait]>;
352+ def Hot : LlvmEnumAttributeTrait<"Hot", [FnTrait]>;
353+ def Convergent : LlvmEnumAttributeTrait<"Convergent", [FnTrait]>;
354+ def Speculatable : LlvmEnumAttributeTrait<"Speculatable", [FnTrait]>;
355+
356+ def NoCapture : LlvmEnumAttributeTrait<"NoCapture", [ParamTrait]>;
357+ def ReadOnly : LlvmEnumAttributeTrait<"ReadOnly", [ParamTrait]>;
358+
359+ def NoUndef : LlvmEnumAttributeTrait<"NoUndef", [ParamTrait, RetTrait]>;
360+ def NonNull : LlvmEnumAttributeTrait<"NonNull", [ParamTrait, RetTrait]>;
348361
349362/// Represent the LLVM `memory(...)` attribute as the OR (or union) of memory
350363/// effects. An empty effects list means the operation does not access memory
@@ -358,7 +371,7 @@ def Speculatable : LlvmEnumAttributeTrait<"Speculatable">;
358371/// Example: `Memory<[(ref), (mod ArgMem, InaccessibleMem)]>` means the
359372/// operation may read from any kind of memory and write to argument and
360373/// inaccessible memory.
361- class Memory<list<dag> effects_> : Trait {
374+ class Memory<list<dag> effects_> : Trait<[FnTrait]> {
362375 list<dag> effects = effects_;
363376}
364377
@@ -394,6 +407,8 @@ class OpClass<Dialect dialect_> : OpClassBase {
394407
395408 dag arguments = ?;
396409
410+ list<dag> value_traits = [];
411+
397412 string summary = ?;
398413 string description = ?;
399414}
@@ -412,6 +427,8 @@ class Op<Dialect dialect_, string mnemonic_, list<Trait> traits_> {
412427 dag arguments = ?;
413428 dag results = ?;
414429
430+ list<dag> value_traits = [];
431+
415432 list<dag> verifier = [];
416433
417434 string summary = ?;
0 commit comments