@@ -18,6 +18,7 @@ include "mlir/Dialect/LLVMIR/LLVMAttrDefs.td"
18
18
include "mlir/Dialect/LLVMIR/LLVMInterfaces.td"
19
19
include "mlir/IR/OpBase.td"
20
20
include "mlir/Interfaces/SideEffectInterfaces.td"
21
+ include "mlir/Interfaces/CallInterfaces.td"
21
22
22
23
//===----------------------------------------------------------------------===//
23
24
// LLVM dialect type constraints.
@@ -286,22 +287,26 @@ class LLVM_MemAccessOpBase<string mnemonic, list<Trait> traits = []> :
286
287
// intrinsic and "enumName" contains the name of the intrinsic as appears in
287
288
// `llvm::Intrinsic` enum; one usually wants these to be related. Additionally,
288
289
// 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.
300
304
class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
301
305
list<int> overloadedResults, list<int> overloadedOperands,
302
306
list<Trait> traits, int numResults,
303
307
bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
304
- bit requiresFastmath = 0, bit requiresOpBundles = 0,
308
+ bit requiresFastmath = 0, bit requiresArgAndResultAttrs = 0,
309
+ bit requiresOpBundles = 0,
305
310
list<int> immArgPositions = [],
306
311
list<string> immArgAttrNames = []>
307
312
: LLVM_OpBase<dialect, opName, !listconcat(
@@ -311,24 +316,30 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
311
316
[DeclareOpInterfaceMethods<AliasAnalysisOpInterface>], []),
312
317
!if(!gt(requiresFastmath, 0),
313
318
[DeclareOpInterfaceMethods<FastmathFlagsInterface>], []),
319
+ !if(!gt(requiresArgAndResultAttrs, 0),
320
+ [DeclareOpInterfaceMethods<ArgAndResultAttrsOpInterface>], []),
314
321
traits)>,
315
322
LLVM_MemOpPatterns,
316
323
Results<!if(!gt(numResults, 0), (outs LLVM_Type:$res), (outs))> {
317
- dag aliasAttrs = !con(
324
+ dag baseArgs = !con(
318
325
!if(!gt(requiresAccessGroup, 0),
319
326
(ins OptionalAttr<LLVM_AccessGroupArrayAttr>:$access_groups),
320
327
(ins )),
321
328
!if(!gt(requiresAliasAnalysis, 0),
322
329
(ins OptionalAttr<LLVM_AliasScopeArrayAttr>:$alias_scopes,
323
330
OptionalAttr<LLVM_AliasScopeArrayAttr>:$noalias_scopes,
324
331
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),
325
342
(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 ));
332
343
string llvmEnumName = enumName;
333
344
string overloadedResultsCpp = "{" # !interleave(overloadedResults, ", ") # "}";
334
345
string overloadedOperandsCpp = "{" # !interleave(overloadedOperands, ", ") # "}";
@@ -342,33 +353,52 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
342
353
immArgPositionsCpp, immArgAttrNamesCpp], ",") # [{);
343
354
(void) inst;
344
355
}];
356
+ string baseLlvmBuilderArgAndResultAttrs = [{
357
+ if (failed(moduleTranslation.convertArgAndResultAttrs(
358
+ op,
359
+ inst,
360
+ }] # immArgPositionsCpp # [{))) {
361
+ return failure();
362
+ }
363
+ }];
345
364
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;
349
373
350
374
string baseMlirBuilder = [{
351
375
SmallVector<Value> mlirOperands;
352
376
SmallVector<NamedAttribute> mlirAttrs;
353
377
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))) {
362
385
return failure();
363
386
}
364
387
SmallVector<Type> resultTypes =
365
388
}] # !if(!gt(numResults, 0), "{$_resultType};", "{};") # [{
366
389
auto op = $_qualCppClassName::create($_builder,
367
390
$_location, resultTypes, mlirOperands, mlirAttrs);
368
391
}];
392
+ string baseMlirBuilderArgAndResultAttrs = [{
393
+ moduleImport.convertArgAndResultAttrs(
394
+ inst, op, }] # immArgPositionsCpp # [{);
395
+ }];
369
396
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),
371
399
"moduleImport.setFastmathFlagsAttr(inst, op);", "")
400
+ # !if(!gt(requiresArgAndResultAttrs, 0),
401
+ baseMlirBuilderArgAndResultAttrs, "")
372
402
# baseMlirBuilderCoda;
373
403
374
404
// 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,
399
429
list<int> overloadedOperands, list<Trait> traits,
400
430
int numResults, bit requiresAccessGroup = 0,
401
431
bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
402
- bit requiresOpBundles = 0,
432
+ bit requiresArgAndResultAttrs = 0, bit requiresOpBundles = 0,
403
433
list<int> immArgPositions = [],
404
434
list<string> immArgAttrNames = []>
405
435
: LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
406
436
overloadedResults, overloadedOperands, traits,
407
437
numResults, requiresAccessGroup, requiresAliasAnalysis,
408
- requiresFastmath, requiresOpBundles, immArgPositions ,
409
- immArgAttrNames>;
438
+ requiresFastmath, requiresArgAndResultAttrs ,
439
+ requiresOpBundles, immArgPositions, immArgAttrNames>;
410
440
411
441
// Base class for LLVM intrinsic operations returning no results. Places the
412
442
// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -426,13 +456,14 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
426
456
list<Trait> traits = [],
427
457
bit requiresAccessGroup = 0,
428
458
bit requiresAliasAnalysis = 0,
459
+ bit requiresArgAndResultAttrs = 0,
429
460
bit requiresOpBundles = 0,
430
461
list<int> immArgPositions = [],
431
462
list<string> immArgAttrNames = []>
432
463
: LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
433
464
requiresAccessGroup, requiresAliasAnalysis,
434
- /*requiresFastMath=*/0, requiresOpBundles, immArgPositions ,
435
- immArgAttrNames>;
465
+ /*requiresFastMath=*/0, requiresArgAndResultAttrs ,
466
+ requiresOpBundles, immArgPositions, immArgAttrNames>;
436
467
437
468
// Base class for LLVM intrinsic operations returning one result. Places the
438
469
// 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 = [],
448
479
list<string> immArgAttrNames = []>
449
480
: LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 1,
450
481
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
451
- requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
482
+ requiresFastmath, /*requiresArgAndResultAttrs=*/0,
483
+ /*requiresOpBundles=*/0, immArgPositions,
452
484
immArgAttrNames>;
453
485
454
486
// Base class for LLVM intrinsic operations returning two results. Places the
@@ -465,7 +497,8 @@ class LLVM_TwoResultIntrOp<string mnem, list<int> overloadedResults = [],
465
497
list<string> immArgAttrNames = []>
466
498
: LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 2,
467
499
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
468
- requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
500
+ requiresFastmath, /*requiresArgAndResultAttrs=*/0,
501
+ /*requiresOpBundles=*/0, immArgPositions,
469
502
immArgAttrNames>;
470
503
471
504
def LLVM_OneResultOpBuilder :
0 commit comments