@@ -351,6 +351,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
351351 UnitAttr:$volatile_,
352352 UnitAttr:$nontemporal,
353353 UnitAttr:$invariant,
354+ UnitAttr:$invariantGroup,
354355 DefaultValuedAttr<
355356 AtomicOrdering, "AtomicOrdering::not_atomic">:$ordering,
356357 OptionalAttr<StrAttr>:$syncscope);
@@ -386,6 +387,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
386387 (`volatile` $volatile_^)? $addr
387388 (`atomic` (`syncscope` `(` $syncscope^ `)`)? $ordering^)?
388389 (`invariant` $invariant^)?
390+ (`invariant_group` $invariantGroup^)?
389391 attr-dict `:` qualified(type($addr)) `->` type($res)
390392 }];
391393 string llvmBuilder = [{
@@ -399,6 +401,7 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
399401 # setSyncScopeCode
400402 # setAlignmentCode
401403 # setNonTemporalMetadataCode
404+ # setInvariantGroupCode
402405 # setAccessGroupsMetadataCode
403406 # setAliasAnalysisMetadataCode;
404407 string mlirBuilder = [{
@@ -408,13 +411,15 @@ def LLVM_LoadOp : LLVM_MemAccessOpBase<"load",
408411 alignment, loadInst->isVolatile(),
409412 loadInst->hasMetadata(llvm::LLVMContext::MD_nontemporal),
410413 loadInst->hasMetadata(llvm::LLVMContext::MD_invariant_load),
414+ loadInst->hasMetadata(llvm::LLVMContext::MD_invariant_group),
411415 convertAtomicOrderingFromLLVM(loadInst->getOrdering()),
412416 getLLVMSyncScope(loadInst));
413417 }];
414418 let builders = [
415419 OpBuilder<(ins "Type":$type, "Value":$addr,
416420 CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
417421 CArg<"bool", "false">:$isNonTemporal, CArg<"bool", "false">:$isInvariant,
422+ CArg<"bool", "false">:$isInvariantGroup,
418423 CArg<"AtomicOrdering", "AtomicOrdering::not_atomic">:$ordering,
419424 CArg<"StringRef", "StringRef()">:$syncscope)>
420425 ];
@@ -431,6 +436,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
431436 OptionalAttr<I64Attr>:$alignment,
432437 UnitAttr:$volatile_,
433438 UnitAttr:$nontemporal,
439+ UnitAttr:$invariantGroup,
434440 DefaultValuedAttr<
435441 AtomicOrdering, "AtomicOrdering::not_atomic">:$ordering,
436442 OptionalAttr<StrAttr>:$syncscope);
@@ -464,6 +470,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
464470 let assemblyFormat = [{
465471 (`volatile` $volatile_^)? $value `,` $addr
466472 (`atomic` (`syncscope` `(` $syncscope^ `)`)? $ordering^)?
473+ (`invariant_group` $invariantGroup^)?
467474 attr-dict `:` type($value) `,` qualified(type($addr))
468475 }];
469476 string llvmBuilder = [{
@@ -472,6 +479,7 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
472479 # setSyncScopeCode
473480 # setAlignmentCode
474481 # setNonTemporalMetadataCode
482+ # setInvariantGroupCode
475483 # setAccessGroupsMetadataCode
476484 # setAliasAnalysisMetadataCode;
477485 string mlirBuilder = [{
@@ -480,13 +488,15 @@ def LLVM_StoreOp : LLVM_MemAccessOpBase<"store",
480488 $_op = $_builder.create<LLVM::StoreOp>($_location, $value, $addr,
481489 alignment, storeInst->isVolatile(),
482490 storeInst->hasMetadata(llvm::LLVMContext::MD_nontemporal),
491+ storeInst->hasMetadata(llvm::LLVMContext::MD_invariant_group),
483492 convertAtomicOrderingFromLLVM(storeInst->getOrdering()),
484493 getLLVMSyncScope(storeInst));
485494 }];
486495 let builders = [
487496 OpBuilder<(ins "Value":$value, "Value":$addr,
488497 CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
489498 CArg<"bool", "false">:$isNonTemporal,
499+ CArg<"bool", "false">:$isInvariantGroup,
490500 CArg<"AtomicOrdering", "AtomicOrdering::not_atomic">:$ordering,
491501 CArg<"StringRef", "StringRef()">:$syncscope)>
492502 ];
0 commit comments