[llvm] 13b28db - [TableGen] Add ArgMem memory location (#201597)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 9 06:09:25 PDT 2026
Author: CarolineConcatto
Date: 2026-06-09T14:09:19+01:00
New Revision: 13b28db64845fc9fe7431338d5dc8919b28a6022
URL: https://github.com/llvm/llvm-project/commit/13b28db64845fc9fe7431338d5dc8919b28a6022
DIFF: https://github.com/llvm/llvm-project/commit/13b28db64845fc9fe7431338d5dc8919b28a6022.diff
LOG: [TableGen] Add ArgMem memory location (#201597)
This will allow to use IntrRead/IntrWrite with ArgMem. So this:
```
[IntrWriteMem , IntrInaccessibleMemOrArgMemOnly]
```
could become this:
```
[IntrWriteMem, IntrWrite<[ArgMem, InaccessibleMem]>]
```
Added:
Modified:
llvm/include/llvm/IR/Intrinsics.td
llvm/test/TableGen/target-mem-intrinsic-attrs.td
llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 393dcb751a4a0..b1b2bb2a72c65 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -59,6 +59,7 @@ class IntrinsicMemoryLocation;
// TODO: Populate with all IRMemLocation enum values and update
// getValueAsIRMemLocation accordingly.
+def ArgMem : IntrinsicMemoryLocation;
def InaccessibleMem : IntrinsicMemoryLocation;
def TargetMem0 : IntrinsicMemoryLocation;
def TargetMem1 : IntrinsicMemoryLocation;
diff --git a/llvm/test/TableGen/target-mem-intrinsic-attrs.td b/llvm/test/TableGen/target-mem-intrinsic-attrs.td
index fc9c3321ad9e9..b3e1b5a8a55e2 100644
--- a/llvm/test/TableGen/target-mem-intrinsic-attrs.td
+++ b/llvm/test/TableGen/target-mem-intrinsic-attrs.td
@@ -14,65 +14,50 @@ def int_aarch64_set_inaccessible_mem : DefaultAttrsIntrinsic<[], [llvm_i64_ty]
def int_aarch64_set_target_mem0 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrWriteMem, IntrWrite<[TargetMem0]>]>;
-// CHECK: static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
-// CHECK-NEXT: switch (ID) {
-// CHECK-NEXT: default: llvm_unreachable("Invalid attribute set number");
-// CHECK-NEXT: case 0: // llvm.aarch64.get.target.mem0.mem1
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Ref
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1280)),
-// CHECK-NEXT: });
-// CHECK-NEXT: case 1: // llvm.aarch64.get.target.mem0.set.target.mem1
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Mod
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(2304)),
-// CHECK-NEXT: });
-// CHECK-NEXT: case 2: // llvm.aarch64.get.target.mem1
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: Ref
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1024)),
-// CHECK-NEXT: });
-// CHECK-NEXT: case 3: // llvm.aarch64.get.target.mem1.set.target.mem1
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: ModRef
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(3072)),
-// CHECK-NEXT: });
-// CHECK-NEXT: case 4: // llvm.aarch64.set.inaccessible.mem
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: Mod, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: NoModRef
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(8)),
-// CHECK-NEXT: });
-// CHECK-NEXT: case 5: // llvm.aarch64.set.target.mem0
-// CHECK-NEXT: return AttributeSet::get(C, {
-// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
-// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
-// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
-// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Mod, TargetMem1: NoModRef
-// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(512)),
+def int_aarch64_argmem_read_target_mem1_write : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[ArgMem]>, IntrWrite<[TargetMem1]>]>;
+
+def int_aarch64_argmem_target_mem1_read_target_mem1_write : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[ArgMem, TargetMem1]>, IntrWrite<[TargetMem1]>]>;
+
+def int_aarch64_target_mem1_read_argmem_write : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[TargetMem1]>, IntrWrite<[ArgMem]>]>;
+
+def int_aarch64_target_mem0_read_argmem_write : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[TargetMem0]>, IntrWrite<[ArgMem]>]>;
+
+// CHECK-LABEL: case 0: // llvm.aarch64.argmem.read.target.mem1.write
+// CHECK: // ArgMem: Ref, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: Mod
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(2049)),
+
+// CHECK-LABEL: case 1: // llvm.aarch64.argmem.target.mem1.read.target.mem1.write
+// CHECK: // ArgMem: Ref, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: ModRef
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(3073)),
+
+// CHECK-LABEL: case 2: // llvm.aarch64.get.target.mem0.mem1
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Ref
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1280)),
+
+// CHECK-LABEL: case 3: // llvm.aarch64.get.target.mem0.set.target.mem1
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Mod
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(2304)),
+
+// CHECK-LABEL: case 4: // llvm.aarch64.get.target.mem1
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: Ref
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1024)),
+
+// CHECK-LABEL: case 5: // llvm.aarch64.get.target.mem1.set.target.mem1
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: ModRef
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(3072)),
+
+// CHECK-LABEL: case 6: // llvm.aarch64.set.inaccessible.mem
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: Mod, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: NoModRef
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(8)),
+
+// CHECK-LABEL: case 7: // llvm.aarch64.set.target.mem0
+// CHECK: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Mod, TargetMem1: NoModRef
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(512)),
+
+// CHECK-LABEL: case 8: // llvm.aarch64.target.mem0.read.argmem.write
+// CHECK: // ArgMem: Mod, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: NoModRef
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(258)),
+
+// CHECK-LABEL: case 9: // llvm.aarch64.target.mem1.read.argmem.write
+// CHECK: // ArgMem: Mod, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: Ref
+// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1026)),
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
index 05ce7f22468c3..36898ae014e3a 100644
--- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
+++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
@@ -535,6 +535,7 @@ CodeGenIntrinsic::getValueAsIRMemLocation(const Record *R) const {
StringRef Name = R->getName();
IRMemLocation Loc =
StringSwitch<IRMemLocation>(Name)
+ .Case("ArgMem", IRMemLocation::ArgMem)
.Case("TargetMem0", IRMemLocation::TargetMem0)
.Case("TargetMem1", IRMemLocation::TargetMem1)
.Case("InaccessibleMem", IRMemLocation::InaccessibleMem)
More information about the llvm-commits
mailing list