Skip to content

Commit 6e2a807

Browse files
committed
[mlir][LLVMIR] Add operand bundle support for llvm.intr.assume
1 parent 8e010ac commit 6e2a807

File tree

17 files changed

+250
-75
lines changed

17 files changed

+250
-75
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ class LLVM_ConstrainedIntr<string mnem, int numArgs,
365365
SmallVector<Value> mlirOperands;
366366
SmallVector<NamedAttribute> mlirAttrs;
367367
if (failed(moduleImport.convertIntrinsicArguments(
368-
llvmOperands.take_front( }] # numArgs # [{),
369-
{}, {}, mlirOperands, mlirAttrs))) {
368+
llvmOperands.take_front( }] # numArgs # [{), {}, {}, {},
369+
StringLiteral(""), StringLiteral(""), mlirOperands, mlirAttrs))) {
370370
return failure();
371371
}
372372

@@ -426,7 +426,31 @@ def LLVM_USHLSat : LLVM_BinarySameArgsIntrOpI<"ushl.sat">;
426426
//
427427

428428
def LLVM_AssumeOp
429-
: LLVM_ZeroResultIntrOp<"assume", []>, Arguments<(ins I1:$cond)>;
429+
: LLVM_ZeroResultIntrOp<"assume", /*overloadedOperands=*/[], /*traits=*/[],
430+
/*requiresAccessGroup=*/0,
431+
/*requiresAliasAnalysis=*/0,
432+
/*immArgPositions=*/[], /*immArgAttrNames=*/[],
433+
/*opBundleSizesAttrName=*/"op_bundle_sizes",
434+
/*opBundleTagsAttrName=*/"op_bundle_tags"> {
435+
let arguments = (ins I1:$cond,
436+
VariadicOfVariadic<LLVM_Type,
437+
"op_bundle_sizes">:$op_bundle_operands,
438+
DenseI32ArrayAttr:$op_bundle_sizes,
439+
OptionalAttr<ArrayAttr>:$op_bundle_tags);
440+
441+
let assemblyFormat = [{
442+
$cond
443+
( custom<OpBundles>($op_bundle_operands, type($op_bundle_operands),
444+
$op_bundle_tags)^ )?
445+
`:` `(` type($cond) `)` `->` `(` `)` attr-dict
446+
}];
447+
448+
let builders = [
449+
OpBuilder<(ins "Value":$cond)>
450+
];
451+
452+
let hasVerifier = 1;
453+
}
430454

431455
def LLVM_SSACopyOp : LLVM_OneResultIntrOp<"ssa.copy", [], [0],
432456
[Pure, SameOperandsAndResultType]> {

mlir/include/mlir/Dialect/LLVMIR/LLVMOpBase.td

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
293293
bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
294294
bit requiresFastmath = 0,
295295
list<int> immArgPositions = [],
296-
list<string> immArgAttrNames = []>
296+
list<string> immArgAttrNames = [],
297+
string opBundleSizesAttrName = "",
298+
string opBundleTagsAttrName = "">
297299
: LLVM_OpBase<dialect, opName, !listconcat(
298300
!if(!gt(requiresAccessGroup, 0),
299301
[DeclareOpInterfaceMethods<AccessGroupOpInterface>], []),
@@ -319,11 +321,14 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
319321
string immArgPositionsCpp = "{" # !interleave(immArgPositions, ", ") # "}";
320322
string immArgAttrNamesCpp = "{" # !interleave(!foreach(name, immArgAttrNames,
321323
"StringLiteral(\"" # name # "\")"), ", ") # "}";
324+
string opBundleSizesAttrNameCpp = "StringLiteral(\"" # opBundleSizesAttrName # "\")";
325+
string opBundleTagsAttrNameCpp = "StringLiteral(\"" # opBundleTagsAttrName # "\")";
322326
string baseLlvmBuilder = [{
323327
auto *inst = LLVM::detail::createIntrinsicCall(
324328
builder, moduleTranslation, &opInst, llvm::Intrinsic::}] # !interleave([
325329
enumName, "" # numResults, overloadedResultsCpp, overloadedOperandsCpp,
326-
immArgPositionsCpp, immArgAttrNamesCpp], ",") # [{);
330+
immArgPositionsCpp, immArgAttrNamesCpp, opBundleSizesAttrNameCpp], ",")
331+
# ", " # opBundleTagsAttrNameCpp # [{);
327332
(void) inst;
328333
}];
329334
string baseLlvmBuilderCoda = !if(!gt(numResults, 0), "$res = inst;", "");
@@ -336,8 +341,11 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
336341
SmallVector<NamedAttribute> mlirAttrs;
337342
if (failed(moduleImport.convertIntrinsicArguments(
338343
llvmOperands,
344+
opBundles,
339345
}] # immArgPositionsCpp # [{,
340346
}] # immArgAttrNamesCpp # [{,
347+
}] # opBundleSizesAttrNameCpp # [{,
348+
}] # opBundleTagsAttrNameCpp # [{,
341349
mlirOperands,
342350
mlirAttrs))
343351
) {
@@ -382,11 +390,14 @@ class LLVM_IntrOp<string mnem, list<int> overloadedResults,
382390
int numResults, bit requiresAccessGroup = 0,
383391
bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
384392
list<int> immArgPositions = [],
385-
list<string> immArgAttrNames = []>
393+
list<string> immArgAttrNames = [],
394+
string opBundleSizesAttrName = "",
395+
string opBundleTagsAttrName = "">
386396
: LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
387397
overloadedResults, overloadedOperands, traits,
388398
numResults, requiresAccessGroup, requiresAliasAnalysis,
389-
requiresFastmath, immArgPositions, immArgAttrNames>;
399+
requiresFastmath, immArgPositions, immArgAttrNames,
400+
opBundleSizesAttrName, opBundleTagsAttrName>;
390401

391402
// Base class for LLVM intrinsic operations returning no results. Places the
392403
// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -407,10 +418,13 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
407418
bit requiresAccessGroup = 0,
408419
bit requiresAliasAnalysis = 0,
409420
list<int> immArgPositions = [],
410-
list<string> immArgAttrNames = []>
421+
list<string> immArgAttrNames = [],
422+
string opBundleSizesAttrName = "",
423+
string opBundleTagsAttrName = "">
411424
: LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
412425
requiresAccessGroup, requiresAliasAnalysis,
413-
/*requiresFastMath=*/0, immArgPositions, immArgAttrNames>;
426+
/*requiresFastMath=*/0, immArgPositions, immArgAttrNames,
427+
opBundleSizesAttrName, opBundleTagsAttrName>;
414428

415429
// Base class for LLVM intrinsic operations returning one result. Places the
416430
// intrinsic into the LLVM dialect and prefixes its name with "intr.". This is

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -559,11 +559,7 @@ def LLVM_InvokeOp : LLVM_Op<"invoke", [
559559
VariadicOfVariadic<LLVM_Type,
560560
"op_bundle_sizes">:$op_bundle_operands,
561561
DenseI32ArrayAttr:$op_bundle_sizes,
562-
DefaultValuedProperty<
563-
ArrayProperty<StringProperty, "operand bundle tags">,
564-
"ArrayRef<std::string>{}",
565-
"SmallVector<std::string>{}"
566-
>:$op_bundle_tags);
562+
OptionalAttr<ArrayAttr>:$op_bundle_tags);
567563
let results = (outs Optional<LLVM_Type>:$result);
568564
let successors = (successor AnySuccessor:$normalDest,
569565
AnySuccessor:$unwindDest);
@@ -678,11 +674,7 @@ def LLVM_CallOp : LLVM_MemAccessOpBase<"call",
678674
VariadicOfVariadic<LLVM_Type,
679675
"op_bundle_sizes">:$op_bundle_operands,
680676
DenseI32ArrayAttr:$op_bundle_sizes,
681-
DefaultValuedProperty<
682-
ArrayProperty<StringProperty, "operand bundle tags">,
683-
"ArrayRef<std::string>{}",
684-
"SmallVector<std::string>{}"
685-
>:$op_bundle_tags);
677+
OptionalAttr<ArrayAttr>:$op_bundle_tags);
686678
// Append the aliasing related attributes defined in LLVM_MemAccessOpBase.
687679
let arguments = !con(args, aliasAttrs);
688680
let results = (outs Optional<LLVM_Type>:$result);
@@ -1930,11 +1922,7 @@ def LLVM_CallIntrinsicOp
19301922
VariadicOfVariadic<LLVM_Type,
19311923
"op_bundle_sizes">:$op_bundle_operands,
19321924
DenseI32ArrayAttr:$op_bundle_sizes,
1933-
DefaultValuedProperty<
1934-
ArrayProperty<StringProperty, "operand bundle tags">,
1935-
"ArrayRef<std::string>{}",
1936-
"SmallVector<std::string>{}"
1937-
>:$op_bundle_tags);
1925+
OptionalAttr<ArrayAttr>:$op_bundle_tags);
19381926
let results = (outs Optional<LLVM_Type>:$results);
19391927
let llvmBuilder = [{
19401928
return convertCallLLVMIntrinsicOp(op, builder, moduleTranslation);

mlir/include/mlir/Target/LLVMIR/ModuleImport.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,11 @@ class ModuleImport {
239239
/// corresponding MLIR attribute names.
240240
LogicalResult
241241
convertIntrinsicArguments(ArrayRef<llvm::Value *> values,
242+
ArrayRef<llvm::OperandBundleUse> opBundles,
242243
ArrayRef<unsigned> immArgPositions,
243244
ArrayRef<StringLiteral> immArgAttrNames,
245+
StringLiteral opBundleSizesAttrName,
246+
StringLiteral opBundleTagsAttrName,
244247
SmallVectorImpl<Value> &valuesOut,
245248
SmallVectorImpl<NamedAttribute> &attrsOut);
246249

mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,8 @@ llvm::CallInst *createIntrinsicCall(
431431
llvm::IRBuilderBase &builder, ModuleTranslation &moduleTranslation,
432432
Operation *intrOp, llvm::Intrinsic::ID intrinsic, unsigned numResults,
433433
ArrayRef<unsigned> overloadedResults, ArrayRef<unsigned> overloadedOperands,
434-
ArrayRef<unsigned> immArgPositions,
435-
ArrayRef<StringLiteral> immArgAttrNames);
434+
ArrayRef<unsigned> immArgPositions, ArrayRef<StringLiteral> immArgAttrNames,
435+
StringLiteral opBundleSizesAttrName, StringLiteral opBundleTagsAttrName);
436436

437437
} // namespace detail
438438

0 commit comments

Comments
 (0)