@@ -18,7 +18,6 @@ include "mlir/Dialect/LLVMIR/LLVMAttrDefs.td"
1818include "mlir/Dialect/LLVMIR/LLVMInterfaces.td"
1919include "mlir/IR/OpBase.td"
2020include "mlir/Interfaces/SideEffectInterfaces.td"
21- include "mlir/Interfaces/CallInterfaces.td"
2221
2322//===----------------------------------------------------------------------===//
2423// LLVM dialect type constraints.
@@ -287,26 +286,22 @@ class LLVM_MemAccessOpBase<string mnemonic, list<Trait> traits = []> :
287286// intrinsic and "enumName" contains the name of the intrinsic as appears in
288287// `llvm::Intrinsic` enum; one usually wants these to be related. Additionally,
289288// 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.
304300class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
305301 list<int> overloadedResults, list<int> overloadedOperands,
306302 list<Trait> traits, int numResults,
307303 bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
308- bit requiresFastmath = 0, bit requiresArgAndResultAttrs = 0,
309- bit requiresOpBundles = 0,
304+ bit requiresFastmath = 0, bit requiresOpBundles = 0,
310305 list<int> immArgPositions = [],
311306 list<string> immArgAttrNames = []>
312307 : LLVM_OpBase<dialect, opName, !listconcat(
@@ -316,30 +311,24 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
316311 [DeclareOpInterfaceMethods<AliasAnalysisOpInterface>], []),
317312 !if(!gt(requiresFastmath, 0),
318313 [DeclareOpInterfaceMethods<FastmathFlagsInterface>], []),
319- !if(!gt(requiresArgAndResultAttrs, 0),
320- [DeclareOpInterfaceMethods<ArgAndResultAttrsOpInterface>], []),
321314 traits)>,
322315 LLVM_MemOpPatterns,
323316 Results<!if(!gt(numResults, 0), (outs LLVM_Type:$res), (outs))> {
324- dag baseArgs = !con(
317+ dag aliasAttrs = !con(
325318 !if(!gt(requiresAccessGroup, 0),
326319 (ins OptionalAttr<LLVM_AccessGroupArrayAttr>:$access_groups),
327320 (ins )),
328321 !if(!gt(requiresAliasAnalysis, 0),
329322 (ins OptionalAttr<LLVM_AliasScopeArrayAttr>:$alias_scopes,
330323 OptionalAttr<LLVM_AliasScopeArrayAttr>:$noalias_scopes,
331324 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),
342325 (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 ));
343332 string llvmEnumName = enumName;
344333 string overloadedResultsCpp = "{" # !interleave(overloadedResults, ", ") # "}";
345334 string overloadedOperandsCpp = "{" # !interleave(overloadedOperands, ", ") # "}";
@@ -353,52 +342,33 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
353342 immArgPositionsCpp, immArgAttrNamesCpp], ",") # [{);
354343 (void) inst;
355344 }];
356- string baseLlvmBuilderArgAndResultAttrs = [{
357- if (failed(moduleTranslation.convertArgAndResultAttrs(
358- op,
359- inst,
360- }] # immArgPositionsCpp # [{))) {
361- return failure();
362- }
363- }];
364345 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;
373349
374350 string baseMlirBuilder = [{
375351 SmallVector<Value> mlirOperands;
376352 SmallVector<NamedAttribute> mlirAttrs;
377353 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+ ) {
385362 return failure();
386363 }
387364 SmallVector<Type> resultTypes =
388365 }] # !if(!gt(numResults, 0), "{$_resultType};", "{};") # [{
389366 auto op = $_qualCppClassName::create($_builder,
390367 $_location, resultTypes, mlirOperands, mlirAttrs);
391368 }];
392- string baseMlirBuilderArgAndResultAttrs = [{
393- moduleImport.convertArgAndResultAttrs(
394- inst, op, }] # immArgPositionsCpp # [{);
395- }];
396369 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),
399371 "moduleImport.setFastmathFlagsAttr(inst, op);", "")
400- # !if(!gt(requiresArgAndResultAttrs, 0),
401- baseMlirBuilderArgAndResultAttrs, "")
402372 # baseMlirBuilderCoda;
403373
404374 // 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,
429399 list<int> overloadedOperands, list<Trait> traits,
430400 int numResults, bit requiresAccessGroup = 0,
431401 bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
432- bit requiresArgAndResultAttrs = 0, bit requiresOpBundles = 0,
402+ bit requiresOpBundles = 0,
433403 list<int> immArgPositions = [],
434404 list<string> immArgAttrNames = []>
435405 : LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
436406 overloadedResults, overloadedOperands, traits,
437407 numResults, requiresAccessGroup, requiresAliasAnalysis,
438- requiresFastmath, requiresArgAndResultAttrs ,
439- requiresOpBundles, immArgPositions, immArgAttrNames>;
408+ requiresFastmath, requiresOpBundles, immArgPositions ,
409+ immArgAttrNames>;
440410
441411// Base class for LLVM intrinsic operations returning no results. Places the
442412// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -456,14 +426,13 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
456426 list<Trait> traits = [],
457427 bit requiresAccessGroup = 0,
458428 bit requiresAliasAnalysis = 0,
459- bit requiresArgAndResultAttrs = 0,
460429 bit requiresOpBundles = 0,
461430 list<int> immArgPositions = [],
462431 list<string> immArgAttrNames = []>
463432 : LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
464433 requiresAccessGroup, requiresAliasAnalysis,
465- /*requiresFastMath=*/0, requiresArgAndResultAttrs ,
466- requiresOpBundles, immArgPositions, immArgAttrNames>;
434+ /*requiresFastMath=*/0, requiresOpBundles, immArgPositions ,
435+ immArgAttrNames>;
467436
468437// Base class for LLVM intrinsic operations returning one result. Places the
469438// 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 = [],
479448 list<string> immArgAttrNames = []>
480449 : LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 1,
481450 /*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
482- requiresFastmath, /*requiresArgAndResultAttrs=*/0,
483- /*requiresOpBundles=*/0, immArgPositions,
451+ requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
484452 immArgAttrNames>;
485453
486454// Base class for LLVM intrinsic operations returning two results. Places the
@@ -497,8 +465,7 @@ class LLVM_TwoResultIntrOp<string mnem, list<int> overloadedResults = [],
497465 list<string> immArgAttrNames = []>
498466 : LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 2,
499467 /*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
500- requiresFastmath, /*requiresArgAndResultAttrs=*/0,
501- /*requiresOpBundles=*/0, immArgPositions,
468+ requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
502469 immArgAttrNames>;
503470
504471def LLVM_OneResultOpBuilder :
0 commit comments