@@ -350,6 +350,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
350350 UnitAttr:$volatile_,
351351 UnitAttr:$nontemporal,
352352 UnitAttr:$invariant,
353+ UnitAttr:$invariantGroup,
353354 DefaultValuedAttr<
354355 AtomicOrdering, "AtomicOrdering::not_atomic">:$ordering,
355356 OptionalAttr<StrAttr>:$syncscope);
@@ -385,6 +386,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
385386 (`volatile` $volatile_^)? $addr
386387 (`atomic` (`syncscope` `(` $syncscope^ `)`)? $ordering^)?
387388 (`invariant` $invariant^)?
389+ (`invariant_group` $invariantGroup^)?
388390 attr-dict `:` qualified(type($addr)) `->` type($res)
389391 }];
390392 string llvmBuilder = [{
@@ -398,6 +400,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
398400 # setSyncScopeCode
399401 # setAlignmentCode
400402 # setNonTemporalMetadataCode
403+ # setInvariantGroupCode
401404 # setAccessGroupsMetadataCode
402405 # setAliasAnalysisMetadataCode;
403406 string mlirBuilder = [{
@@ -407,13 +410,15 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
407410 alignment, loadInst->isVolatile(),
408411 loadInst->hasMetadata(llvm::LLVMContext::MD_nontemporal),
409412 loadInst->hasMetadata(llvm::LLVMContext::MD_invariant_load),
413+ loadInst->hasMetadata(llvm::LLVMContext::MD_invariant_group),
410414 convertAtomicOrderingFromLLVM(loadInst->getOrdering()),
411415 getLLVMSyncScope(loadInst));
412416 }];
413417 let builders = [
414418 OpBuilder<(ins "Type":$type, "Value":$addr,
415419 CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
416420 CArg<"bool", "false">:$isNonTemporal, CArg<"bool", "false">:$isInvariant,
421+ CArg<"bool", "false">:$isInvariantGroup,
417422 CArg<"AtomicOrdering", "AtomicOrdering::not_atomic">:$ordering,
418423 CArg<"StringRef", "StringRef()">:$syncscope)>
419424 ];
@@ -430,6 +435,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
430435 OptionalAttr<I64Attr>:$alignment,
431436 UnitAttr:$volatile_,
432437 UnitAttr:$nontemporal,
438+ UnitAttr:$invariantGroup,
433439 DefaultValuedAttr<
434440 AtomicOrdering, "AtomicOrdering::not_atomic">:$ordering,
435441 OptionalAttr<StrAttr>:$syncscope);
@@ -463,6 +469,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
463469 let assemblyFormat = [{
464470 (`volatile` $volatile_^)? $value `,` $addr
465471 (`atomic` (`syncscope` `(` $syncscope^ `)`)? $ordering^)?
472+ (`invariant_group` $invariantGroup^)?
466473 attr-dict `:` type($value) `,` qualified(type($addr))
467474 }];
468475 string llvmBuilder = [{
@@ -471,6 +478,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
471478 # setSyncScopeCode
472479 # setAlignmentCode
473480 # setNonTemporalMetadataCode
481+ # setInvariantGroupCode
474482 # setAccessGroupsMetadataCode
475483 # setAliasAnalysisMetadataCode;
476484 string mlirBuilder = [{
@@ -479,13 +487,15 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
479487 $_op = $_builder.create<LLVM::StoreOp>($_location, $value, $addr,
480488 alignment, storeInst->isVolatile(),
481489 storeInst->hasMetadata(llvm::LLVMContext::MD_nontemporal),
490+ storeInst->hasMetadata(llvm::LLVMContext::MD_invariant_group),
482491 convertAtomicOrderingFromLLVM(storeInst->getOrdering()),
483492 getLLVMSyncScope(storeInst));
484493 }];
485494 let builders = [
486495 OpBuilder<(ins "Value":$value, "Value":$addr,
487496 CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
488497 CArg<"bool", "false">:$isNonTemporal,
498+ CArg<"bool", "false">:$isInvariantGroup,
489499 CArg<"AtomicOrdering", "AtomicOrdering::not_atomic">:$ordering,
490500 CArg<"StringRef", "StringRef()">:$syncscope)>
491501 ];
0 commit comments