Skip to content

[TableGen] Add ArgMem memory location#201597

Open
CarolineConcatto wants to merge 1 commit into
llvm:mainfrom
CarolineConcatto:arg_mem_location
Open

[TableGen] Add ArgMem memory location#201597
CarolineConcatto wants to merge 1 commit into
llvm:mainfrom
CarolineConcatto:arg_mem_location

Conversation

@CarolineConcatto

@CarolineConcatto CarolineConcatto commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

This will allow to use IntrRead/IntrWrite with ArgMem. So this:

[IntrWriteMem , IntrInaccessibleMemOrArgMemOnly]

could become this:

[IntrWriteMem, IntrWrite<[ArgMem, InaccessibleMem]>] 

This will allow to use IntrRead/IntrWrite with ArgMem.
So this:

'''
[IntrWriteMem , IntrInaccessibleMemOrArgMemOnly]
'''

could become this:

'''
[IntrWriteMem, IntrWrite<[ArgMem, InaccessibleMem]>]
'''
@llvmorg-github-actions

llvmorg-github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown

@llvm/pr-subscribers-llvm-ir

@llvm/pr-subscribers-tablegen

Author: CarolineConcatto

Changes

This will allow to use IntrRead/IntrWrite with ArgMem. So this:

[IntrWriteMem , IntrInaccessibleMemOrArgMemOnly]

could become this:

[IntrWriteMem, IntrWrite&lt;[ArgMem, InaccessibleMem]&gt;] 

Full diff: https://github.com/llvm/llvm-project/pull/201597.diff

3 Files Affected:

  • (modified) llvm/include/llvm/IR/Intrinsics.td (+1)
  • (modified) llvm/test/TableGen/target-mem-intrinsic-attrs.td (+47-62)
  • (modified) llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp (+1)
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 993ddd7e33701..a196c8a3967ba 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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants