Skip to content

Commit b7bfbc0

Browse files
authored
Reland "[mlir][llvm] Add intrinsic arg and result attribute support (… (#151125)
…… (#151099) This reverts commit 2780b8f to reland 59013d4. In addition to the original commit this one includes: - This includes a bazel fix - Use `let methods` instead of `list<InterfaceMethod> methods` The original commit message was: This patch extends the LLVM dialect's intrinsic infra to support argument and result attributes. Initial support is added for the memory intrinsics llvm.intr.memcpy, llvm.intr.memmove, and llvm.intr.memset. Additionally, an ArgAndResultAttrsOpInterface is factored out of CallOpInterface and CallableOpInterface, enabling operations to have argument and result attributes without requiring them to be a call or a callable operation.
1 parent 4562b55 commit b7bfbc0

File tree

16 files changed

+264
-210
lines changed

16 files changed

+264
-210
lines changed

mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEIntrinsicOps.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class ArmSME_IntrOp<string mnemonic,
7171
/*bit requiresAccessGroup=*/0,
7272
/*bit requiresAliasAnalysis=*/0,
7373
/*bit requiresFastmath=*/0,
74+
/*bit requiresArgAndResultAttrs=*/0,
7475
/*bit requiresOpBundles=*/0,
7576
/*list<int> immArgPositions=*/immArgPositions,
7677
/*list<string> immArgAttrNames=*/immArgAttrNames>;

mlir/include/mlir/Dialect/ArmSVE/IR/ArmSVE.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class ArmSVE_IntrOp<string mnemonic,
9292
/*bit requiresAccessGroup=*/0,
9393
/*bit requiresAliasAnalysis=*/0,
9494
/*bit requiresFastmath=*/0,
95+
/*bit requiresArgAndResultAttrs=*/0,
9596
/*bit requiresOpBundles=*/0,
9697
/*list<int> immArgPositions=*/immArgPositions,
9798
/*list<string> immArgAttrNames=*/immArgAttrNames>;

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ def LLVM_Log2Op : LLVM_UnaryIntrOpF<"log2">;
140140
def LLVM_LogOp : LLVM_UnaryIntrOpF<"log">;
141141
def LLVM_Prefetch : LLVM_ZeroResultIntrOp<"prefetch", [0],
142142
/*traits=*/[], /*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
143-
/*requiresOpBundles=*/0, /*immArgPositions=*/[1, 2, 3],
144-
/*immArgAttrNames=*/["rw", "hint", "cache"]
143+
/*requiresArgAndResultAttrs=*/0, /*requiresOpBundles=*/0,
144+
/*immArgPositions=*/[1, 2, 3], /*immArgAttrNames=*/["rw", "hint", "cache"]
145145
> {
146146
let arguments = (ins LLVM_AnyPointer:$addr, I32Attr:$rw, I32Attr:$hint, I32Attr:$cache);
147147
}
@@ -200,13 +200,13 @@ class LLVM_MemcpyIntrOpBase<string name> :
200200
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
201201
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
202202
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
203-
/*requiresOpBundles=*/0, /*immArgPositions=*/[3],
204-
/*immArgAttrNames=*/["isVolatile"]> {
203+
/*requiresArgAndResultAttrs=*/1, /*requiresOpBundles=*/0,
204+
/*immArgPositions=*/[3], /*immArgAttrNames=*/["isVolatile"]> {
205205
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
206206
Arg<LLVM_AnyPointer,"",[MemRead]>:$src,
207207
AnySignlessInteger:$len, I1Attr:$isVolatile);
208-
// Append the alias attributes defined by LLVM_IntrOpBase.
209-
let arguments = !con(args, aliasAttrs);
208+
// Append the arguments defined by LLVM_IntrOpBase.
209+
let arguments = !con(args, baseArgs);
210210
let builders = [
211211
OpBuilder<(ins "Value":$dst, "Value":$src, "Value":$len,
212212
"bool":$isVolatile), [{
@@ -217,7 +217,8 @@ class LLVM_MemcpyIntrOpBase<string name> :
217217
"IntegerAttr":$isVolatile), [{
218218
build($_builder, $_state, dst, src, len, isVolatile,
219219
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
220-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
220+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
221+
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr);
221222
}]>
222223
];
223224
}
@@ -231,13 +232,13 @@ def LLVM_MemcpyInlineOp :
231232
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
232233
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
233234
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
234-
/*requiresOpBundles=*/0, /*immArgPositions=*/[2, 3],
235-
/*immArgAttrNames=*/["len", "isVolatile"]> {
235+
/*requiresArgAndResultAttrs=*/1, /*requiresOpBundles=*/0,
236+
/*immArgPositions=*/[2, 3], /*immArgAttrNames=*/["len", "isVolatile"]> {
236237
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
237238
Arg<LLVM_AnyPointer,"",[MemRead]>:$src,
238239
APIntAttr:$len, I1Attr:$isVolatile);
239-
// Append the alias attributes defined by LLVM_IntrOpBase.
240-
let arguments = !con(args, aliasAttrs);
240+
// Append the arguments defined by LLVM_IntrOpBase.
241+
let arguments = !con(args, baseArgs);
241242
let builders = [
242243
OpBuilder<(ins "Value":$dst, "Value":$src, "IntegerAttr":$len,
243244
"bool":$isVolatile), [{
@@ -248,7 +249,8 @@ def LLVM_MemcpyInlineOp :
248249
"IntegerAttr":$isVolatile), [{
249250
build($_builder, $_state, dst, src, len, isVolatile,
250251
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
251-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
252+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
253+
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr);
252254
}]>
253255
];
254256
}
@@ -258,12 +260,12 @@ def LLVM_MemsetOp : LLVM_ZeroResultIntrOp<"memset", [0, 2],
258260
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
259261
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
260262
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
261-
/*requiresOpBundles=*/0, /*immArgPositions=*/[3],
262-
/*immArgAttrNames=*/["isVolatile"]> {
263+
/*requiresArgAndResultAttrs=*/1, /*requiresOpBundles=*/0,
264+
/*immArgPositions=*/[3], /*immArgAttrNames=*/["isVolatile"]> {
263265
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
264266
I8:$val, AnySignlessInteger:$len, I1Attr:$isVolatile);
265-
// Append the alias attributes defined by LLVM_IntrOpBase.
266-
let arguments = !con(args, aliasAttrs);
267+
// Append the arguments defined by LLVM_IntrOpBase.
268+
let arguments = !con(args, baseArgs);
267269
let builders = [
268270
OpBuilder<(ins "Value":$dst, "Value":$val, "Value":$len,
269271
"bool":$isVolatile), [{
@@ -274,7 +276,8 @@ def LLVM_MemsetOp : LLVM_ZeroResultIntrOp<"memset", [0, 2],
274276
"IntegerAttr":$isVolatile), [{
275277
build($_builder, $_state, dst, val, len, isVolatile,
276278
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
277-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
279+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
280+
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr);
278281
}]>
279282
];
280283
}
@@ -284,12 +287,12 @@ def LLVM_MemsetInlineOp : LLVM_ZeroResultIntrOp<"memset.inline", [0, 2],
284287
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
285288
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
286289
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
287-
/*requiresOpBundles=*/0, /*immArgPositions=*/[2, 3],
288-
/*immArgAttrNames=*/["len", "isVolatile"]> {
290+
/*requiresArgAndResultAttrs=*/1, /*requiresOpBundles=*/0,
291+
/*immArgPositions=*/[2, 3], /*immArgAttrNames=*/["len", "isVolatile"]> {
289292
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
290293
I8:$val, APIntAttr:$len, I1Attr:$isVolatile);
291-
// Append the alias attributes defined by LLVM_IntrOpBase.
292-
let arguments = !con(args, aliasAttrs);
294+
// Append the arguments defined by LLVM_IntrOpBase.
295+
let arguments = !con(args, baseArgs);
293296
let builders = [
294297
OpBuilder<(ins "Value":$dst, "Value":$val, "IntegerAttr":$len,
295298
"bool":$isVolatile), [{
@@ -300,7 +303,8 @@ def LLVM_MemsetInlineOp : LLVM_ZeroResultIntrOp<"memset.inline", [0, 2],
300303
"IntegerAttr":$isVolatile), [{
301304
build($_builder, $_state, dst, val, len, isVolatile,
302305
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
303-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
306+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
307+
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr);
304308
}]>
305309
];
306310
}
@@ -349,8 +353,8 @@ def LLVM_PtrMaskOp
349353
class LLVM_LifetimeBaseOp<string opName> : LLVM_ZeroResultIntrOp<opName, [1],
350354
[DeclareOpInterfaceMethods<PromotableOpInterface>],
351355
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
352-
/*requiresOpBundles=*/0, /*immArgPositions=*/[0],
353-
/*immArgAttrNames=*/["size"]> {
356+
/*requiresArgAndResultAttrs=*/0, /*requiresOpBundles=*/0,
357+
/*immArgPositions=*/[0], /*immArgAttrNames=*/["size"]> {
354358
let arguments = (ins I64Attr:$size, LLVM_AnyPointer:$ptr);
355359
let assemblyFormat = "$size `,` $ptr attr-dict `:` qualified(type($ptr))";
356360
}
@@ -370,8 +374,8 @@ def LLVM_InvariantStartOp : LLVM_OneResultIntrOp<"invariant.start", [], [1],
370374
def LLVM_InvariantEndOp : LLVM_ZeroResultIntrOp<"invariant.end", [2],
371375
[DeclareOpInterfaceMethods<PromotableOpInterface>],
372376
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
373-
/*requiresOpBundles=*/0, /*immArgPositions=*/[1],
374-
/*immArgAttrNames=*/["size"]> {
377+
/*requiresArgAndResultAttrs=*/0, /*requiresOpBundles=*/0,
378+
/*immArgPositions=*/[1], /*immArgAttrNames=*/["size"]> {
375379
let arguments = (ins LLVM_DefaultPointer:$start,
376380
I64Attr:$size,
377381
LLVM_AnyPointer:$ptr);
@@ -542,9 +546,10 @@ def LLVM_AssumeOp
542546
: LLVM_ZeroResultIntrOp<"assume", /*overloadedOperands=*/[], /*traits=*/[],
543547
/*requiresAccessGroup=*/0,
544548
/*requiresAliasAnalysis=*/0,
549+
/*requiresArgAndResultAttrs=*/0,
545550
/*requiresOpBundles=*/1> {
546551
dag args = (ins I1:$cond);
547-
let arguments = !con(args, opBundleArgs);
552+
let arguments = !con(args, baseArgs);
548553

549554
let assemblyFormat = [{
550555
$cond
@@ -1126,8 +1131,8 @@ def LLVM_DebugTrap : LLVM_ZeroResultIntrOp<"debugtrap">;
11261131
def LLVM_UBSanTrap : LLVM_ZeroResultIntrOp<"ubsantrap",
11271132
/*overloadedOperands=*/[], /*traits=*/[],
11281133
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
1129-
/*requiresOpBundles=*/0, /*immArgPositions=*/[0],
1130-
/*immArgAttrNames=*/["failureKind"]> {
1134+
/*requiresArgAndResultAttrs=*/0, /*requiresOpBundles=*/0,
1135+
/*immArgPositions=*/[0], /*immArgAttrNames=*/["failureKind"]> {
11311136
let arguments = (ins I8Attr:$failureKind);
11321137
}
11331138

mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td

Lines changed: 71 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ include "mlir/Dialect/LLVMIR/LLVMAttrDefs.td"
1818
include "mlir/Dialect/LLVMIR/LLVMInterfaces.td"
1919
include "mlir/IR/OpBase.td"
2020
include "mlir/Interfaces/SideEffectInterfaces.td"
21+
include "mlir/Interfaces/CallInterfaces.td"
2122

2223
//===----------------------------------------------------------------------===//
2324
// LLVM dialect type constraints.
@@ -286,22 +287,26 @@ class LLVM_MemAccessOpBase<string mnemonic, list<Trait> traits = []> :
286287
// intrinsic and "enumName" contains the name of the intrinsic as appears in
287288
// `llvm::Intrinsic` enum; one usually wants these to be related. Additionally,
288289
// the base class also defines the "mlirBuilder" field to support the inverse
289-
// translation starting from an LLVM IR intrinsic. The "requiresAccessGroup",
290-
// "requiresAliasAnalysis", and "requiresFastmath" flags specify which
291-
// interfaces the intrinsic implements. If the corresponding flags are set, the
292-
// "aliasAttrs" list contains the arguments required by the access group and
293-
// alias analysis interfaces. Derived intrinsics should append the "aliasAttrs"
294-
// to their argument list if they set one of the flags. LLVM `immargs` can be
295-
// represented as MLIR attributes by providing both the `immArgPositions` and
296-
// `immArgAttrNames` lists. These two lists should have equal length, with
297-
// `immArgPositions` containing the argument positions on the LLVM IR attribute
298-
// that are `immargs`, and `immArgAttrNames` mapping these to corresponding
299-
// MLIR attributes.
290+
// translation starting from an LLVM IR intrinsic.
291+
//
292+
// The flags "requiresAccessGroup", "requiresAliasAnalysis",
293+
// "requiresFastmath", and "requiresArgAndResultAttrs" indicate which
294+
// interfaces the intrinsic implements. When a flag is set, the "baseArgs"
295+
// list includes the arguments required by the corresponding interface.
296+
// Derived intrinsics must append "baseArgs" to their argument list if they
297+
// enable any of these flags.
298+
//
299+
// LLVM `immargs` can be represented as MLIR attributes by providing both
300+
// the `immArgPositions` and `immArgAttrNames` lists. These two lists should
301+
// have equal length, with `immArgPositions` containing the argument
302+
// positions on the LLVM IR attribute that are `immargs`, and
303+
// `immArgAttrNames` mapping these to corresponding MLIR attributes.
300304
class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
301305
list<int> overloadedResults, list<int> overloadedOperands,
302306
list<Trait> traits, int numResults,
303307
bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
304-
bit requiresFastmath = 0, bit requiresOpBundles = 0,
308+
bit requiresFastmath = 0, bit requiresArgAndResultAttrs = 0,
309+
bit requiresOpBundles = 0,
305310
list<int> immArgPositions = [],
306311
list<string> immArgAttrNames = []>
307312
: LLVM_OpBase<dialect, opName, !listconcat(
@@ -311,24 +316,30 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
311316
[DeclareOpInterfaceMethods<AliasAnalysisOpInterface>], []),
312317
!if(!gt(requiresFastmath, 0),
313318
[DeclareOpInterfaceMethods<FastmathFlagsInterface>], []),
319+
!if(!gt(requiresArgAndResultAttrs, 0),
320+
[DeclareOpInterfaceMethods<ArgAndResultAttrsOpInterface>], []),
314321
traits)>,
315322
LLVM_MemOpPatterns,
316323
Results<!if(!gt(numResults, 0), (outs LLVM_Type:$res), (outs))> {
317-
dag aliasAttrs = !con(
324+
dag baseArgs = !con(
318325
!if(!gt(requiresAccessGroup, 0),
319326
(ins OptionalAttr<LLVM_AccessGroupArrayAttr>:$access_groups),
320327
(ins )),
321328
!if(!gt(requiresAliasAnalysis, 0),
322329
(ins OptionalAttr<LLVM_AliasScopeArrayAttr>:$alias_scopes,
323330
OptionalAttr<LLVM_AliasScopeArrayAttr>:$noalias_scopes,
324331
OptionalAttr<LLVM_TBAATagArrayAttr>:$tbaa),
332+
(ins )),
333+
!if(!gt(requiresArgAndResultAttrs, 0),
334+
(ins OptionalAttr<DictArrayAttr>:$arg_attrs,
335+
OptionalAttr<DictArrayAttr>:$res_attrs),
336+
(ins )),
337+
!if(!gt(requiresOpBundles, 0),
338+
(ins VariadicOfVariadic<LLVM_Type,
339+
"op_bundle_sizes">:$op_bundle_operands,
340+
DenseI32ArrayAttr:$op_bundle_sizes,
341+
OptionalAttr<ArrayAttr>:$op_bundle_tags),
325342
(ins )));
326-
dag opBundleArgs = !if(!gt(requiresOpBundles, 0),
327-
(ins VariadicOfVariadic<LLVM_Type,
328-
"op_bundle_sizes">:$op_bundle_operands,
329-
DenseI32ArrayAttr:$op_bundle_sizes,
330-
OptionalAttr<ArrayAttr>:$op_bundle_tags),
331-
(ins ));
332343
string llvmEnumName = enumName;
333344
string overloadedResultsCpp = "{" # !interleave(overloadedResults, ", ") # "}";
334345
string overloadedOperandsCpp = "{" # !interleave(overloadedOperands, ", ") # "}";
@@ -342,33 +353,52 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
342353
immArgPositionsCpp, immArgAttrNamesCpp], ",") # [{);
343354
(void) inst;
344355
}];
356+
string baseLlvmBuilderArgAndResultAttrs = [{
357+
if (failed(moduleTranslation.convertArgAndResultAttrs(
358+
op,
359+
inst,
360+
}] # immArgPositionsCpp # [{))) {
361+
return failure();
362+
}
363+
}];
345364
string baseLlvmBuilderCoda = !if(!gt(numResults, 0), "$res = inst;", "");
346-
let llvmBuilder = baseLlvmBuilder # !if(!gt(requiresAccessGroup, 0), setAccessGroupsMetadataCode, "")
347-
# !if(!gt(requiresAliasAnalysis, 0), setAliasAnalysisMetadataCode, "")
348-
# baseLlvmBuilderCoda;
365+
let llvmBuilder = baseLlvmBuilder
366+
# !if(!gt(requiresAccessGroup, 0),
367+
setAccessGroupsMetadataCode, "")
368+
# !if(!gt(requiresAliasAnalysis, 0),
369+
setAliasAnalysisMetadataCode, "")
370+
# !if(!gt(requiresArgAndResultAttrs, 0),
371+
baseLlvmBuilderArgAndResultAttrs, "")
372+
# baseLlvmBuilderCoda;
349373

350374
string baseMlirBuilder = [{
351375
SmallVector<Value> mlirOperands;
352376
SmallVector<NamedAttribute> mlirAttrs;
353377
if (failed(moduleImport.convertIntrinsicArguments(
354-
llvmOperands,
355-
llvmOpBundles,
356-
}] # !if(!gt(requiresOpBundles, 0), "true", "false") # [{,
357-
}] # immArgPositionsCpp # [{,
358-
}] # immArgAttrNamesCpp # [{,
359-
mlirOperands,
360-
mlirAttrs))
361-
) {
378+
llvmOperands,
379+
llvmOpBundles,
380+
}] # !if(!gt(requiresOpBundles, 0), "true", "false") # [{,
381+
}] # immArgPositionsCpp # [{,
382+
}] # immArgAttrNamesCpp # [{,
383+
mlirOperands,
384+
mlirAttrs))) {
362385
return failure();
363386
}
364387
SmallVector<Type> resultTypes =
365388
}] # !if(!gt(numResults, 0), "{$_resultType};", "{};") # [{
366389
auto op = $_qualCppClassName::create($_builder,
367390
$_location, resultTypes, mlirOperands, mlirAttrs);
368391
}];
392+
string baseMlirBuilderArgAndResultAttrs = [{
393+
moduleImport.convertArgAndResultAttrs(
394+
inst, op, }] # immArgPositionsCpp # [{);
395+
}];
369396
string baseMlirBuilderCoda = !if(!gt(numResults, 0), "$res = op;", "$_op = op;");
370-
let mlirBuilder = baseMlirBuilder # !if(!gt(requiresFastmath, 0),
397+
let mlirBuilder = baseMlirBuilder
398+
# !if(!gt(requiresFastmath, 0),
371399
"moduleImport.setFastmathFlagsAttr(inst, op);", "")
400+
# !if(!gt(requiresArgAndResultAttrs, 0),
401+
baseMlirBuilderArgAndResultAttrs, "")
372402
# baseMlirBuilderCoda;
373403

374404
// Code for handling a `range` attribute that holds the constant range of the
@@ -399,14 +429,14 @@ class LLVM_IntrOp<string mnem, list<int> overloadedResults,
399429
list<int> overloadedOperands, list<Trait> traits,
400430
int numResults, bit requiresAccessGroup = 0,
401431
bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
402-
bit requiresOpBundles = 0,
432+
bit requiresArgAndResultAttrs = 0, bit requiresOpBundles = 0,
403433
list<int> immArgPositions = [],
404434
list<string> immArgAttrNames = []>
405435
: LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
406436
overloadedResults, overloadedOperands, traits,
407437
numResults, requiresAccessGroup, requiresAliasAnalysis,
408-
requiresFastmath, requiresOpBundles, immArgPositions,
409-
immArgAttrNames>;
438+
requiresFastmath, requiresArgAndResultAttrs,
439+
requiresOpBundles, immArgPositions, immArgAttrNames>;
410440

411441
// Base class for LLVM intrinsic operations returning no results. Places the
412442
// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -426,13 +456,14 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
426456
list<Trait> traits = [],
427457
bit requiresAccessGroup = 0,
428458
bit requiresAliasAnalysis = 0,
459+
bit requiresArgAndResultAttrs = 0,
429460
bit requiresOpBundles = 0,
430461
list<int> immArgPositions = [],
431462
list<string> immArgAttrNames = []>
432463
: LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
433464
requiresAccessGroup, requiresAliasAnalysis,
434-
/*requiresFastMath=*/0, requiresOpBundles, immArgPositions,
435-
immArgAttrNames>;
465+
/*requiresFastMath=*/0, requiresArgAndResultAttrs,
466+
requiresOpBundles, immArgPositions, immArgAttrNames>;
436467

437468
// Base class for LLVM intrinsic operations returning one result. Places the
438469
// intrinsic into the LLVM dialect and prefixes its name with "intr.". This is
@@ -448,7 +479,8 @@ class LLVM_OneResultIntrOp<string mnem, list<int> overloadedResults = [],
448479
list<string> immArgAttrNames = []>
449480
: LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 1,
450481
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
451-
requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
482+
requiresFastmath, /*requiresArgAndResultAttrs=*/0,
483+
/*requiresOpBundles=*/0, immArgPositions,
452484
immArgAttrNames>;
453485

454486
// Base class for LLVM intrinsic operations returning two results. Places the
@@ -465,7 +497,8 @@ class LLVM_TwoResultIntrOp<string mnem, list<int> overloadedResults = [],
465497
list<string> immArgAttrNames = []>
466498
: LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 2,
467499
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
468-
requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
500+
requiresFastmath, /*requiresArgAndResultAttrs=*/0,
501+
/*requiresOpBundles=*/0, immArgPositions,
469502
immArgAttrNames>;
470503

471504
def LLVM_OneResultOpBuilder :

0 commit comments

Comments
 (0)