Skip to content

Commit d926bf7

Browse files
[LLVM]Add read and write inaccessible memory metadata
This patch adds IntrInaccessibleReadWriteMem metadata to allow to set ModRef at the same time for a Location. This patch depends on how we implement PR#148650.
1 parent 4366ac7 commit d926bf7

File tree

4 files changed

+78
-9
lines changed

4 files changed

+78
-9
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def AArch64_ZA: IntrinsicMemoryLocation;
5959
// IntrInaccessible{Read|Write}MemOnly needs to set Location
6060
class IntrInaccessibleReadMemOnly<IntrinsicMemoryLocation idx> : IntrinsicProperty{IntrinsicMemoryLocation Loc=idx;}
6161
class IntrInaccessibleWriteMemOnly<IntrinsicMemoryLocation idx> : IntrinsicProperty{IntrinsicMemoryLocation Loc=idx;}
62+
class IntrInaccessibleReadWriteMem<IntrinsicMemoryLocation idx> : IntrinsicProperty{IntrinsicMemoryLocation Loc=idx;}
6263

6364
// IntrInaccessibleMemOrArgMemOnly -- This intrinsic only accesses memory that
6465
// its pointer-typed arguments point to or memory that is not accessible

llvm/include/llvm/Support/ModRef.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ template <typename LocationEnum> class MemoryEffectsBase {
169169
return MemoryEffectsBase(Loc, ModRefInfo::Mod);
170170
}
171171

172+
/// Create MemoryEffectsBase that can read write inaccessible memory.
173+
static MemoryEffectsBase
174+
inaccessibleReadWriteMem(Location Loc = Location::InaccessibleMem) {
175+
return MemoryEffectsBase(Loc, ModRefInfo::ModRef);
176+
}
177+
172178
/// Checks if only target-specific memory locations are set.
173179
/// Ignores standard locations like ArgMem or InaccessibleMem.
174180
/// Needed because `Data` may be non-zero by default unless explicitly

llvm/test/TableGen/intrinsic-attrs-fp8.td

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,23 @@ def int_aarch64_get_za_2 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInacc
88

99
def int_aarch64_get_fpmr_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadMemOnly<AArch64_FPMR>, IntrInaccessibleWriteMemOnly<AArch64_ZA>]>;
1010

11+
def int_aarch64_get_set_fpmr : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadWriteMem<AArch64_FPMR>]>;
12+
13+
def int_aarch64_get_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadWriteMem<AArch64_ZA>]>;
14+
15+
def int_aarch64_get_set_fpmr_get_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadWriteMem<AArch64_FPMR>, IntrInaccessibleReadMemOnly<AArch64_ZA>]>;
16+
17+
def int_aarch64_get_fpmr_get_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadMemOnly<AArch64_FPMR>, IntrInaccessibleReadWriteMem<AArch64_ZA>]>;
18+
1119
// CHECK: static constexpr unsigned IntrinsicNameOffsetTable[] = {
1220
// CHECK-NEXT: 1, // not_intrinsic
13-
// CHECK-NEXT: 15, // llvm.aarch64.get.fpmr.set.za
14-
// CHECK-NEXT: 44, // llvm.aarch64.get.za.2
15-
// CHECK-NEXT: 66, // llvm.aarch64.set.fpmr.2
21+
// CHECK-NEXT: 15, // llvm.aarch64.get.fpmr.get.set.za
22+
// CHECK-NEXT: 48, // llvm.aarch64.get.fpmr.set.za
23+
// CHECK-NEXT: 77, // llvm.aarch64.get.set.fpmr
24+
// CHECK-NEXT: 103, // llvm.aarch64.get.set.fpmr.get.za
25+
// CHECK-NEXT: 136, // llvm.aarch64.get.set.za
26+
// CHECK-NEXT: 160, // llvm.aarch64.get.za.2
27+
// CHECK-NEXT: 182, // llvm.aarch64.set.fpmr.2
1628

1729
// CHECK: static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
1830
// CHECK-NEXT: switch (ID) {
@@ -24,10 +36,50 @@ def int_aarch64_get_fpmr_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [In
2436
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
2537
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
2638
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
39+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: Ref, AARCH64_ZA: ModRef, Other: NoModRef
40+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(832)),
41+
// CHECK-NEXT: });
42+
// CHECK-NEXT: case 1:
43+
// CHECK-NEXT: return AttributeSet::get(C, {
44+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
45+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
46+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
47+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
48+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
2749
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: Ref, AARCH64_ZA: Mod, Other: NoModRef
2850
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(576)),
2951
// CHECK-NEXT: });
30-
// CHECK-NEXT: case 1:
52+
// CHECK-NEXT: case 2:
53+
// CHECK-NEXT: return AttributeSet::get(C, {
54+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
55+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
56+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
57+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
58+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
59+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: ModRef, AARCH64_ZA: NoModRef, Other: NoModRef
60+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(192)),
61+
// CHECK-NEXT: });
62+
// CHECK-NEXT: case 3:
63+
// CHECK-NEXT: return AttributeSet::get(C, {
64+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
65+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
66+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
67+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
68+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
69+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: ModRef, AARCH64_ZA: Ref, Other: NoModRef
70+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(448)),
71+
// CHECK-NEXT: });
72+
// CHECK-NEXT: case 4:
73+
// CHECK-NEXT: return AttributeSet::get(C, {
74+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
75+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
76+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
77+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
78+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
79+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: NoModRef, AARCH64_ZA: ModRef, Other: NoModRef
80+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(768)),
81+
// CHECK-NEXT: });
82+
// CHECK-NEXT: case 5:
3183
// CHECK-NEXT: return AttributeSet::get(C, {
3284
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
3385
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
@@ -37,7 +89,7 @@ def int_aarch64_get_fpmr_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [In
3789
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, AARCH64_FPMR: NoModRef, AARCH64_ZA: Ref, Other: NoModRef
3890
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(256)),
3991
// CHECK-NEXT: });
40-
// CHECK-NEXT: case 2:
92+
// CHECK-NEXT: case 6:
4193
// CHECK-NEXT: return AttributeSet::get(C, {
4294
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
4395
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
@@ -48,7 +100,11 @@ def int_aarch64_get_fpmr_set_za : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [In
48100
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(128)),
49101

50102
// CHECK: static constexpr uint16_t IntrinsicsToAttributesMap[] = {
51-
// CHECK-NEXT: 0 << 8 | 0, // llvm.aarch64.get.fpmr.set.za
52-
// CHECK-NEXT: 1 << 8 | 0, // llvm.aarch64.get.za.2
53-
// CHECK-NEXT: 2 << 8 | 0, // llvm.aarch64.set.fpmr.2
103+
// CHECK-NEXT: 0 << 8 | 0, // llvm.aarch64.get.fpmr.get.set.za
104+
// CHECK-NEXT: 1 << 8 | 0, // llvm.aarch64.get.fpmr.set.za
105+
// CHECK-NEXT: 2 << 8 | 0, // llvm.aarch64.get.set.fpmr
106+
// CHECK-NEXT: 3 << 8 | 0, // llvm.aarch64.get.set.fpmr.get.za
107+
// CHECK-NEXT: 4 << 8 | 0, // llvm.aarch64.get.set.za
108+
// CHECK-NEXT: 5 << 8 | 0, // llvm.aarch64.get.za.2
109+
// CHECK-NEXT: 6 << 8 | 0, // llvm.aarch64.set.fpmr.2
54110
// CHECK-NEXT:};

llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,13 @@ void CodeGenIntrinsic::setProperty(const Record *R) {
374374
ME &= MemoryEffects::argMemOnly();
375375
else if (R->getName() == "IntrInaccessibleMemOnly")
376376
ME &= MemoryEffects::inaccessibleMemOnly();
377-
else if (R->isSubClassOf("IntrInaccessibleReadMemOnly")) {
377+
else if (R->isSubClassOf("IntrInaccessibleReadWriteMem")) {
378+
llvm::IRMemLocation Loc = R->getLocationTypeAsInt("Loc");
379+
if (ME.onlyAccessTargetMemoryLocation())
380+
ME = ME.getWithModRef(Loc, ModRefInfo::ModRef);
381+
else
382+
ME &= MemoryEffects::inaccessibleReadWriteMem(Loc);
383+
} else if (R->isSubClassOf("IntrInaccessibleReadMemOnly")) {
378384
llvm::IRMemLocation Loc = R->getLocationTypeAsInt("Loc");
379385
if (ME.onlyAccessTargetMemoryLocation())
380386
ME = ME.getWithModRef(Loc, ModRefInfo::Ref);

0 commit comments

Comments
 (0)