Skip to content

Commit 57d749d

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

20 files changed

+276
-77
lines changed

mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEIntrinsicOps.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class ArmSME_IntrOp<string mnemonic,
7171
/*bit requiresAccessGroup=*/0,
7272
/*bit requiresAliasAnalysis=*/0,
7373
/*bit requiresFastmath=*/0,
74+
/*bit requiresOpBundles=*/0,
7475
/*list<int> immArgPositions=*/immArgPositions,
7576
/*list<string> immArgAttrNames=*/immArgAttrNames>;
7677

mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ def LLVM_Dialect : Dialect {
5858
static StringRef getStructRetAttrName() { return "llvm.sret"; }
5959
static StringRef getWriteOnlyAttrName() { return "llvm.writeonly"; }
6060
static StringRef getZExtAttrName() { return "llvm.zeroext"; }
61+
static StringRef getOpBundleSizesAttrName() { return "op_bundle_sizes"; }
62+
static StringRef getOpBundleTagsAttrName() { return "op_bundle_tags"; }
6163
// TODO Restrict the usage of this to parameter attributes once there is an
6264
// alternative way of modeling memory effects on FunctionOpInterface.
6365
/// Name of the attribute that will cause the creation of a readnone memory

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

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ def LLVM_Log2Op : LLVM_UnaryIntrOpF<"log2">;
120120
def LLVM_LogOp : LLVM_UnaryIntrOpF<"log">;
121121
def LLVM_Prefetch : LLVM_ZeroResultIntrOp<"prefetch", [0],
122122
/*traits=*/[], /*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
123-
/*immArgPositions=*/[1, 2, 3], /*immArgAttrNames=*/["rw", "hint", "cache"]
123+
/*requiresOpBundles=*/0, /*immArgPositions=*/[1, 2, 3],
124+
/*immArgAttrNames=*/["rw", "hint", "cache"]
124125
> {
125126
let arguments = (ins LLVM_AnyPointer:$addr, I32Attr:$rw, I32Attr:$hint, I32Attr:$cache);
126127
}
@@ -173,7 +174,8 @@ class LLVM_MemcpyIntrOpBase<string name> :
173174
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
174175
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
175176
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
176-
/*immArgPositions=*/[3], /*immArgAttrNames=*/["isVolatile"]> {
177+
/*requiresOpBundles=*/0, /*immArgPositions=*/[3],
178+
/*immArgAttrNames=*/["isVolatile"]> {
177179
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
178180
Arg<LLVM_AnyPointer,"",[MemRead]>:$src,
179181
AnySignlessInteger:$len, I1Attr:$isVolatile);
@@ -203,7 +205,8 @@ def LLVM_MemcpyInlineOp :
203205
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
204206
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
205207
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
206-
/*immArgPositions=*/[2, 3], /*immArgAttrNames=*/["len", "isVolatile"]> {
208+
/*requiresOpBundles=*/0, /*immArgPositions=*/[2, 3],
209+
/*immArgAttrNames=*/["len", "isVolatile"]> {
207210
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
208211
Arg<LLVM_AnyPointer,"",[MemRead]>:$src,
209212
APIntAttr:$len, I1Attr:$isVolatile);
@@ -229,7 +232,8 @@ def LLVM_MemsetOp : LLVM_ZeroResultIntrOp<"memset", [0, 2],
229232
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
230233
DeclareOpInterfaceMethods<SafeMemorySlotAccessOpInterface>],
231234
/*requiresAccessGroup=*/1, /*requiresAliasAnalysis=*/1,
232-
/*immArgPositions=*/[3], /*immArgAttrNames=*/["isVolatile"]> {
235+
/*requiresOpBundles=*/0, /*immArgPositions=*/[3],
236+
/*immArgAttrNames=*/["isVolatile"]> {
233237
dag args = (ins Arg<LLVM_AnyPointer,"",[MemWrite]>:$dst,
234238
I8:$val, AnySignlessInteger:$len, I1Attr:$isVolatile);
235239
// Append the alias attributes defined by LLVM_IntrOpBase.
@@ -283,7 +287,8 @@ def LLVM_NoAliasScopeDeclOp
283287
class LLVM_LifetimeBaseOp<string opName> : LLVM_ZeroResultIntrOp<opName, [1],
284288
[DeclareOpInterfaceMethods<PromotableOpInterface>],
285289
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
286-
/*immArgPositions=*/[0], /*immArgAttrNames=*/["size"]> {
290+
/*requiresOpBundles=*/0, /*immArgPositions=*/[0],
291+
/*immArgAttrNames=*/["size"]> {
287292
let arguments = (ins I64Attr:$size, LLVM_AnyPointer:$ptr);
288293
let assemblyFormat = "$size `,` $ptr attr-dict `:` qualified(type($ptr))";
289294
}
@@ -303,7 +308,8 @@ def LLVM_InvariantStartOp : LLVM_OneResultIntrOp<"invariant.start", [], [1],
303308
def LLVM_InvariantEndOp : LLVM_ZeroResultIntrOp<"invariant.end", [2],
304309
[DeclareOpInterfaceMethods<PromotableOpInterface>],
305310
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
306-
/*immArgPositions=*/[1], /*immArgAttrNames=*/["size"]> {
311+
/*requiresOpBundles=*/0, /*immArgPositions=*/[1],
312+
/*immArgAttrNames=*/["size"]> {
307313
let arguments = (ins LLVM_DefaultPointer:$start,
308314
I64Attr:$size,
309315
LLVM_AnyPointer:$ptr);
@@ -365,7 +371,7 @@ class LLVM_ConstrainedIntr<string mnem, int numArgs,
365371
SmallVector<Value> mlirOperands;
366372
SmallVector<NamedAttribute> mlirAttrs;
367373
if (failed(moduleImport.convertIntrinsicArguments(
368-
llvmOperands.take_front( }] # numArgs # [{),
374+
llvmOperands.take_front( }] # numArgs # [{), {}, false,
369375
{}, {}, mlirOperands, mlirAttrs))) {
370376
return failure();
371377
}
@@ -426,7 +432,26 @@ def LLVM_USHLSat : LLVM_BinarySameArgsIntrOpI<"ushl.sat">;
426432
//
427433

428434
def LLVM_AssumeOp
429-
: LLVM_ZeroResultIntrOp<"assume", []>, Arguments<(ins I1:$cond)>;
435+
: LLVM_ZeroResultIntrOp<"assume", /*overloadedOperands=*/[], /*traits=*/[],
436+
/*requiresAccessGroup=*/0,
437+
/*requiresAliasAnalysis=*/0,
438+
/*requiresOpBundles=*/1> {
439+
dag args = (ins I1:$cond);
440+
let arguments = !con(args, opBundleArgs);
441+
442+
let assemblyFormat = [{
443+
$cond
444+
( custom<OpBundles>($op_bundle_operands, type($op_bundle_operands),
445+
$op_bundle_tags)^ )?
446+
`:` type($cond) attr-dict
447+
}];
448+
449+
let builders = [
450+
OpBuilder<(ins "Value":$cond)>
451+
];
452+
453+
let hasVerifier = 1;
454+
}
430455

431456
def LLVM_SSACopyOp : LLVM_OneResultIntrOp<"ssa.copy", [], [0],
432457
[Pure, SameOperandsAndResultType]> {
@@ -989,7 +1014,8 @@ def LLVM_DebugTrap : LLVM_ZeroResultIntrOp<"debugtrap">;
9891014
def LLVM_UBSanTrap : LLVM_ZeroResultIntrOp<"ubsantrap",
9901015
/*overloadedOperands=*/[], /*traits=*/[],
9911016
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
992-
/*immArgPositions=*/[0], /*immArgAttrNames=*/["failureKind"]> {
1017+
/*requiresOpBundles=*/0, /*immArgPositions=*/[0],
1018+
/*immArgAttrNames=*/["failureKind"]> {
9931019
let arguments = (ins I8Attr:$failureKind);
9941020
}
9951021

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
291291
list<int> overloadedResults, list<int> overloadedOperands,
292292
list<Trait> traits, int numResults,
293293
bit requiresAccessGroup = 0, bit requiresAliasAnalysis = 0,
294-
bit requiresFastmath = 0,
294+
bit requiresFastmath = 0, bit requiresOpBundles = 0,
295295
list<int> immArgPositions = [],
296296
list<string> immArgAttrNames = []>
297297
: LLVM_OpBase<dialect, opName, !listconcat(
@@ -313,6 +313,12 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
313313
OptionalAttr<LLVM_AliasScopeArrayAttr>:$noalias_scopes,
314314
OptionalAttr<LLVM_TBAATagArrayAttr>:$tbaa),
315315
(ins )));
316+
dag opBundleArgs = !if(!gt(requiresOpBundles, 0),
317+
(ins VariadicOfVariadic<LLVM_Type,
318+
"op_bundle_sizes">:$op_bundle_operands,
319+
DenseI32ArrayAttr:$op_bundle_sizes,
320+
OptionalAttr<ArrayAttr>:$op_bundle_tags),
321+
(ins ));
316322
string llvmEnumName = enumName;
317323
string overloadedResultsCpp = "{" # !interleave(overloadedResults, ", ") # "}";
318324
string overloadedOperandsCpp = "{" # !interleave(overloadedOperands, ", ") # "}";
@@ -336,6 +342,8 @@ class LLVM_IntrOpBase<Dialect dialect, string opName, string enumName,
336342
SmallVector<NamedAttribute> mlirAttrs;
337343
if (failed(moduleImport.convertIntrinsicArguments(
338344
llvmOperands,
345+
llvmOpBundles,
346+
}] # !if(!gt(requiresOpBundles, 0), "true", "false") # [{,
339347
}] # immArgPositionsCpp # [{,
340348
}] # immArgAttrNamesCpp # [{,
341349
mlirOperands,
@@ -381,12 +389,14 @@ class LLVM_IntrOp<string mnem, list<int> overloadedResults,
381389
list<int> overloadedOperands, list<Trait> traits,
382390
int numResults, bit requiresAccessGroup = 0,
383391
bit requiresAliasAnalysis = 0, bit requiresFastmath = 0,
392+
bit requiresOpBundles = 0,
384393
list<int> immArgPositions = [],
385394
list<string> immArgAttrNames = []>
386395
: LLVM_IntrOpBase<LLVM_Dialect, "intr." # mnem, !subst(".", "_", mnem),
387396
overloadedResults, overloadedOperands, traits,
388397
numResults, requiresAccessGroup, requiresAliasAnalysis,
389-
requiresFastmath, immArgPositions, immArgAttrNames>;
398+
requiresFastmath, requiresOpBundles, immArgPositions,
399+
immArgAttrNames>;
390400

391401
// Base class for LLVM intrinsic operations returning no results. Places the
392402
// intrinsic into the LLVM dialect and prefixes its name with "intr.".
@@ -406,11 +416,13 @@ class LLVM_ZeroResultIntrOp<string mnem, list<int> overloadedOperands = [],
406416
list<Trait> traits = [],
407417
bit requiresAccessGroup = 0,
408418
bit requiresAliasAnalysis = 0,
419+
bit requiresOpBundles = 0,
409420
list<int> immArgPositions = [],
410421
list<string> immArgAttrNames = []>
411422
: LLVM_IntrOp<mnem, [], overloadedOperands, traits, /*numResults=*/0,
412423
requiresAccessGroup, requiresAliasAnalysis,
413-
/*requiresFastMath=*/0, immArgPositions, immArgAttrNames>;
424+
/*requiresFastMath=*/0, requiresOpBundles, immArgPositions,
425+
immArgAttrNames>;
414426

415427
// Base class for LLVM intrinsic operations returning one result. Places the
416428
// intrinsic into the LLVM dialect and prefixes its name with "intr.". This is
@@ -422,11 +434,12 @@ class LLVM_OneResultIntrOp<string mnem, list<int> overloadedResults = [],
422434
list<int> overloadedOperands = [],
423435
list<Trait> traits = [],
424436
bit requiresFastmath = 0,
425-
list<int> immArgPositions = [],
426-
list<string> immArgAttrNames = []>
437+
list<int> immArgPositions = [],
438+
list<string> immArgAttrNames = []>
427439
: LLVM_IntrOp<mnem, overloadedResults, overloadedOperands, traits, 1,
428440
/*requiresAccessGroup=*/0, /*requiresAliasAnalysis=*/0,
429-
requiresFastmath, immArgPositions, immArgAttrNames>;
441+
requiresFastmath, /*requiresOpBundles=*/0, immArgPositions,
442+
immArgAttrNames>;
430443

431444
def LLVM_OneResultOpBuilder :
432445
OpBuilder<(ins "Type":$resultType, "ValueRange":$operands,

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/Dialect/LLVMIR/ROCDLOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class ROCDL_IntrOp<string mnemonic, list<int> overloadedResults,
9898
LLVM_IntrOpBase<ROCDL_Dialect, mnemonic,
9999
"amdgcn_" # !subst(".", "_", mnemonic), overloadedResults,
100100
overloadedOperands, traits, numResults, requiresAccessGroup,
101-
requiresAliasAnalysis, 0, immArgPositions, immArgAttrNames>;
101+
requiresAliasAnalysis, 0, 0, immArgPositions, immArgAttrNames>;
102102

103103
//===----------------------------------------------------------------------===//
104104
// ROCDL special register op definitions

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ class ModuleImport {
239239
/// corresponding MLIR attribute names.
240240
LogicalResult
241241
convertIntrinsicArguments(ArrayRef<llvm::Value *> values,
242+
ArrayRef<llvm::OperandBundleUse> opBundles,
243+
bool requiresOpBundles,
242244
ArrayRef<unsigned> immArgPositions,
243245
ArrayRef<StringLiteral> immArgAttrNames,
244246
SmallVectorImpl<Value> &valuesOut,

0 commit comments

Comments
 (0)