Skip to content

Commit 85a89f2

Browse files
Address comments about tablegen
1 parent 231bc7c commit 85a89f2

File tree

5 files changed

+67
-32
lines changed

5 files changed

+67
-32
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,14 @@ class IntrinsicMemoryLocation;
5656
def TargetMem0 : IntrinsicMemoryLocation;
5757
def TargetMem1 : IntrinsicMemoryLocation;
5858
// IntrInaccessible{Read|Write}MemOnly needs to set Location
59-
class IntrInaccessibleReadMemOnly<IntrinsicMemoryLocation idx> : IntrinsicProperty{IntrinsicMemoryLocation Loc=idx;}
60-
class IntrInaccessibleWriteMemOnly<IntrinsicMemoryLocation idx> : IntrinsicProperty{IntrinsicMemoryLocation Loc=idx;}
59+
class IntrRead<list<IntrinsicMemoryLocation> idx> : IntrinsicProperty {
60+
list<IntrinsicMemoryLocation> Loc=idx;
61+
}
62+
63+
class IntrWrite<list<IntrinsicMemoryLocation> idx> : IntrinsicProperty {
64+
list<IntrinsicMemoryLocation> Loc=idx;
65+
}
66+
6167

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

llvm/test/TableGen/target-mem-intrinsic-attrs.td

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,49 @@
22

33
include "llvm/IR/Intrinsics.td"
44

5-
def int_aarch64_set_target_mem0 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleWriteMemOnly<TargetMem0>]>;
5+
def int_aarch64_set_target_mem0 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrWriteMem, IntrWrite<[TargetMem0]>]>;
66

7-
def int_aarch64_get_target_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadMemOnly<TargetMem1>]>;
7+
def int_aarch64_get_target_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrReadMem, IntrRead<[TargetMem1]>]>;
88

9-
def int_aarch64_get_target_mem0_set_target_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrInaccessibleReadMemOnly<TargetMem0>, IntrInaccessibleWriteMemOnly<TargetMem1>]>;
9+
def int_aarch64_get_target_mem0_set_target_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[TargetMem0]>, IntrWrite<[TargetMem1]>]>;
10+
11+
def int_aarch64_get_target_mem1_set_target_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrRead<[TargetMem1]>, IntrWrite<[TargetMem1]>]>;
12+
13+
def int_aarch64_get_target_mem0_mem1 : DefaultAttrsIntrinsic<[], [llvm_i64_ty], [IntrReadMem, IntrRead<[TargetMem0, TargetMem1]>]>;
1014

1115
// CHECK: static constexpr unsigned IntrinsicNameOffsetTable[] = {
1216
// CHECK-NEXT: 1, // not_intrinsic
13-
// CHECK-NEXT: 15, // llvm.aarch64.get.target.mem0.set.target.mem1
14-
// CHECK-NEXT: 60, // llvm.aarch64.get.target.mem1
15-
// CHECK-NEXT: 89, // llvm.aarch64.set.target.mem0
17+
// CHECK-NEXT: 15, // llvm.aarch64.get.target.mem0.mem1
18+
// CHECK-NEXT: 49, // llvm.aarch64.get.target.mem0.set.target.mem1
19+
// CHECK-NEXT: 94, // llvm.aarch64.get.target.mem1
20+
// CHECK-NEXT: 123, // llvm.aarch64.get.target.mem1.set.target.mem1
21+
// CHECK-NEXT: 168, // llvm.aarch64.set.target.mem0
22+
1623

1724
// CHECK: static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
1825
// CHECK-NEXT: switch (ID) {
1926
// CHECK-NEXT: default: llvm_unreachable("Invalid attribute set number");
20-
// CHECK-NEXT: case 0:
27+
// CHECK-NEXT: case 0: // llvm.aarch64.get.target.mem0.mem1
2128
// CHECK-NEXT: return AttributeSet::get(C, {
2229
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
2330
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
2431
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
2532
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
2633
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
34+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Ref
35+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1280)),
36+
// CHECK-NEXT: });
37+
// CHECK-NEXT: case 1: // llvm.aarch64.get.target.mem0.set.target.mem1
38+
// CHECK-NEXT: return AttributeSet::get(C, {
39+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
40+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
41+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
42+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
43+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
2744
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: Ref, TargetMem1: Mod
2845
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(2304)),
2946
// CHECK-NEXT: });
30-
// CHECK-NEXT: case 1:
47+
// CHECK-NEXT: case 2: // llvm.aarch64.get.target.mem1
3148
// CHECK-NEXT: return AttributeSet::get(C, {
3249
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
3350
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
@@ -37,7 +54,17 @@ def int_aarch64_get_target_mem0_set_target_mem1 : DefaultAttrsIntrinsic<[], [l
3754
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: Ref
3855
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(1024)),
3956
// CHECK-NEXT: });
40-
// CHECK-NEXT: case 2:
57+
// CHECK-NEXT: case 3: // llvm.aarch64.get.target.mem1.set.target.mem1
58+
// CHECK-NEXT: return AttributeSet::get(C, {
59+
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
60+
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),
61+
// CHECK-NEXT: Attribute::get(C, Attribute::NoSync),
62+
// CHECK-NEXT: Attribute::get(C, Attribute::NoFree),
63+
// CHECK-NEXT: Attribute::get(C, Attribute::WillReturn),
64+
// CHECK-NEXT: // ArgMem: NoModRef, InaccessibleMem: NoModRef, ErrnoMem: NoModRef, Other: NoModRef, TargetMem0: NoModRef, TargetMem1: ModRef
65+
// CHECK-NEXT: Attribute::getWithMemoryEffects(C, MemoryEffects::createFromIntValue(3072)),
66+
// CHECK-NEXT: });
67+
// CHECK-NEXT: case 4: // llvm.aarch64.set.target.mem0
4168
// CHECK-NEXT: return AttributeSet::get(C, {
4269
// CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
4370
// CHECK-NEXT: Attribute::get(C, Attribute::NoCallback),

llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -378,18 +378,20 @@ void CodeGenIntrinsic::setProperty(const Record *R) {
378378
ME &= MemoryEffects::argMemOnly();
379379
else if (R->getName() == "IntrInaccessibleMemOnly")
380380
ME &= MemoryEffects::inaccessibleMemOnly();
381-
else if (R->isSubClassOf("IntrInaccessibleReadMemOnly")) {
382-
llvm::IRMemLocation Loc = getValueAsIRMemLocation(R, "Loc");
383-
if (ME.onlyAccessTargetMemoryLocation())
384-
ME = ME.getWithModRef(Loc, ModRefInfo::Ref);
385-
else
386-
ME &= MemoryEffects::inaccessibleReadMemOnly(Loc);
387-
} else if (R->isSubClassOf("IntrInaccessibleWriteMemOnly")) {
388-
llvm::IRMemLocation Loc = getValueAsIRMemLocation(R, "Loc");
389-
if (ME.onlyAccessTargetMemoryLocation())
390-
ME = ME.getWithModRef(Loc, ModRefInfo::Mod);
391-
else
392-
ME &= MemoryEffects::inaccessibleWriteMemOnly(Loc);
381+
else if (R->isSubClassOf("IntrRead")) {
382+
MemoryEffects ReadMask = MemoryEffects::writeOnly();
383+
for (const Record *RLoc : R->getValueAsListOfDefs("Loc"))
384+
ReadMask = ReadMask.getWithModRef(getValueAsIRMemLocation(RLoc),
385+
ModRefInfo::ModRef);
386+
ME &= ReadMask;
387+
388+
} else if (R->isSubClassOf("IntrWrite")) {
389+
MemoryEffects WriteMask = MemoryEffects::readOnly();
390+
for (const Record *RLoc : R->getValueAsListOfDefs("Loc"))
391+
WriteMask = WriteMask.getWithModRef(getValueAsIRMemLocation(RLoc),
392+
ModRefInfo::ModRef);
393+
ME &= WriteMask;
394+
393395
} else if (R->getName() == "IntrInaccessibleMemOrArgMemOnly")
394396
ME &= MemoryEffects::inaccessibleOrArgMemOnly();
395397
else if (R->getName() == "Commutative")
@@ -466,11 +468,8 @@ void CodeGenIntrinsic::setProperty(const Record *R) {
466468
}
467469

468470
llvm::IRMemLocation
469-
CodeGenIntrinsic::getValueAsIRMemLocation(const Record *R,
470-
StringRef FieldName) const {
471-
const Record *LocRec = R->getValueAsDef(FieldName);
472-
StringRef Name = LocRec->getName();
473-
471+
CodeGenIntrinsic::getValueAsIRMemLocation(const Record *R) const {
472+
StringRef Name = R->getName();
474473
IRMemLocation Loc =
475474
StringSwitch<IRMemLocation>(Name)
476475
.Case("TargetMem0", IRMemLocation::TargetMem0)
@@ -482,6 +481,10 @@ CodeGenIntrinsic::getValueAsIRMemLocation(const Record *R,
482481
PrintFatalError(R->getLoc(), "unknown Target IRMemLocation: " + Name);
483482

484483
return Loc;
484+
if (Loc == IRMemLocation::Other)
485+
PrintFatalError(R->getLoc(), "unknown Target IRMemLocation: " + Name);
486+
487+
return Loc;
485488
}
486489

487490
bool CodeGenIntrinsic::isParamAPointer(unsigned ParamIdx) const {

llvm/utils/TableGen/Basic/CodeGenIntrinsics.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,7 @@ struct CodeGenIntrinsic {
167167

168168
bool isParamImmArg(unsigned ParamIdx) const;
169169

170-
llvm::IRMemLocation getValueAsIRMemLocation(const Record *R,
171-
StringRef FieldName) const;
170+
llvm::IRMemLocation getValueAsIRMemLocation(const Record *R) const;
172171

173172
CodeGenIntrinsic(const Record *R, const CodeGenIntrinsicContext &Ctx);
174173
};

llvm/utils/TableGen/Basic/IntrinsicEmitter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,10 +574,10 @@ static AttributeSet getIntrinsicFnAttributeSet(LLVMContext &C, unsigned ID) {
574574
if (!UniqFnAttributes.try_emplace(&Int, ID).second)
575575
continue;
576576
OS << formatv(R"(
577-
case {}:
577+
case {}: // {}
578578
return AttributeSet::get(C, {{
579579
)",
580-
ID);
580+
ID, Int.Name);
581581
auto addAttribute = [&OS](StringRef Attr) {
582582
OS << formatv(" Attribute::get(C, Attribute::{}),\n", Attr);
583583
};

0 commit comments

Comments
 (0)