Skip to content

Commit 59013d4

Browse files
authored
[mlir][llvm] Add intrinsic arg and result attribute support (#150783)
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 144ae25 commit 59013d4

File tree

15 files changed

+262
-209
lines changed

15 files changed

+262
-209
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)