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