@@ -290,10 +290,12 @@ class LLVM_MemAccessOpBase<string mnemonic, list<Trait> traits = []> :
290290class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
291291 list<int> overloadedResults, list<int> overloadedOperands,
292292 list<Trait> traits, int numResults,
293- bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
294- bit requiresFastmath = 0, bit requiresOpBundles = 0,
295- list<int> immArgPositions = [],
296- list<string> immArgAttrNames = []>
293+ bit enableMlirBuilder = 1, bit requiresAccessGroup = 0,
294+ bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
295+ bit requiresOpBundles = 0, list<int> immArgPositions = [],
296+ list<string> immArgAttrNames = [],
297+ list<list<int>> opBundleOperandPositions = [],
298+ list<string> opBundleTags = []>
297299 : LLVM_OpBase<dialect, opName, !listconcat(
298300 !if(!gt(requiresAccessGroup, 0),
299301 [DeclareOpInterfaceMethods<AccessGroupOpInterface>], []),
@@ -325,11 +327,18 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
325327 string immArgPositionsCpp = "{" # !interleave(immArgPositions, ", ") # "}";
326328 string immArgAttrNamesCpp = "{" # !interleave(!foreach(name, immArgAttrNames,
327329 "StringLiteral(\"" # name # "\")"), ", ") # "}";
330+ string opBundleOperandPositionsCpp = "{" # !interleave(
331+ !foreach(positions, opBundleOperandPositions,
332+ "ArrayRef<unsigned>{" # !interleave(positions, ", ") # "}"
333+ ), ", ") # "}";
334+ string opBundleTagsCpp = "{" # !interleave(!foreach(tag, opBundleTags,
335+ "StringLiteral(\"" # tag # "\")"), ", ") # "}";
328336 string baseLlvmBuilder = [{
329337 auto *inst = LLVM::detail::createIntrinsicCall(
330338 builder, moduleTranslation, &opInst, llvm::Intrinsic::}] # !interleave([
331339 enumName, "" # numResults, overloadedResultsCpp, overloadedOperandsCpp,
332- immArgPositionsCpp, immArgAttrNamesCpp], ",") # [{);
340+ immArgPositionsCpp, immArgAttrNamesCpp, opBundleOperandPositionsCpp,
341+ opBundleTagsCpp], ",") # [{);
333342 (void) inst;
334343 }];
335344 string baseLlvmBuilderCoda = !if(!gt(numResults, 0), "$res = inst;", "");
@@ -357,9 +366,10 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
357366 $_location, resultTypes, mlirOperands, mlirAttrs);
358367 }];
359368 string baseMlirBuilderCoda = !if(!gt(numResults, 0), "$res = op;", "$_op = op;");
360- let mlirBuilder = baseMlirBuilder # !if(!gt(requiresFastmath, 0),
369+ let mlirBuilder = !if(enableMlirBuilder,
370+ baseMlirBuilder # !if(!gt(requiresFastmath, 0),
361371 "moduleImport.setFastmathFlagsAttr(inst, op);", "")
362- # baseMlirBuilderCoda;
372+ # baseMlirBuilderCoda, "") ;
363373
364374 // Code for handling a `range` attribute that holds the constant range of the
365375 // intrinsic's result (if one is specified at the call site). This is intended
@@ -387,16 +397,20 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
387397// the intrinsic into the LLVM dialect and prefixes its name with "intr.".
388398class LLVM_IntrOp<string mnem, list<int> overloadedResults,
389399 list<int> overloadedOperands, list<Trait> traits,
390- int numResults, bit requiresAccessGroup = 0,
400+ int numResults, string enumName = "",
401+ bit enableMlirBuilder = 1, bit requiresAccessGroup = 0,
391402 bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
392- bit requiresOpBundles = 0,
393- list<int> immArgPositions = [],
394- list<string> immArgAttrNames = []>
395- : LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
403+ bit requiresOpBundles = 0, list<int> immArgPositions = [],
404+ list<string> immArgAttrNames = [],
405+ list<list<int>> opBundleOperandPositions = [],
406+ list<string> opBundleTags = []>
407+ : LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem,
408+ !if(!empty(enumName), !subst(".", "_", mnem), enumName),
396409 overloadedResults, overloadedOperands, traits,
397- numResults, requiresAccessGroup, requiresAliasAnalysis,
398- requiresFastmath, requiresOpBundles, immArgPositions,
399- immArgAttrNames>;
410+ numResults, enableMlirBuilder, requiresAccessGroup,
411+ requiresAliasAnalysis, requiresFastmath,
412+ requiresOpBundles, immArgPositions, immArgAttrNames,
413+ opBundleOperandPositions, opBundleTags>;
400414
401415// Base class for LLVM intrinsic operations returning no results. Places the
402416// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -418,11 +432,14 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
418432 bit requiresAliasAnalysis = 0,
419433 bit requiresOpBundles = 0,
420434 list<int> immArgPositions = [],
421- list<string> immArgAttrNames = []>
435+ list<string> immArgAttrNames = [],
436+ list<list<int>> opBundleOperandPositions = [],
437+ list<string> opBundleTags = []>
422438 : LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
439+ /*enumName=*/"", /*enableMlirBuilder=*/1,
423440 requiresAccessGroup, requiresAliasAnalysis,
424441 /*requiresFastMath=*/0, requiresOpBundles, immArgPositions,
425- immArgAttrNames>;
442+ immArgAttrNames, opBundleOperandPositions, opBundleTags >;
426443
427444// Base class for LLVM intrinsic operations returning one result. Places the
428445// intrinsic into the LLVM dialect and prefixes its name with "intr.". This is
@@ -437,6 +454,7 @@ class LLVM_OneResultIntrOp<string mnem, list<int> overloadedResults = [],
437454 list<int> immArgPositions = [],
438455 list<string> immArgAttrNames = []>
439456 : LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 1,
457+ /*enumName=*/"", /*enableMlirBuilder=*/1,
440458 /*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
441459 requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
442460 immArgAttrNames>;
0 commit comments