Skip to content

Commit 87d4c4d

Browse files
committed
[CHERIoT] Expand small atomics inline when XCheriot is enabled.
1 parent ea8b0f6 commit 87d4c4d

File tree

2 files changed

+13
-16
lines changed

2 files changed

+13
-16
lines changed

clang/lib/Basic/Targets/RISCV.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,9 @@ class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo {
293293

294294
if (ISAInfo->hasExtension("a"))
295295
MaxAtomicInlineWidth = 32;
296+
else if (ISAInfo->hasExtension("xcheriot"))
297+
// XCheriot implies atomic libcalls up to cap size.
298+
MaxAtomicInlineWidth = 8;
296299
}
297300

298301
uint64_t getPointerRangeForCHERICapability() const override { return 32; }

clang/test/CodeGen/cheri/riscv/cheriot-atomic-uintptr.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,18 @@
77
// CHECK-SAME: ) local_unnamed_addr addrspace(200) #[[ATTR0:[0-9]+]] {
88
// CHECK-NEXT: [[ENTRY:.*]]:
99
// CHECK-NEXT: [[P:%.*]] = alloca ptr addrspace(200), align 8, addrspace(200)
10-
// CHECK-NEXT: [[ATOMIC_TEMP:%.*]] = alloca ptr addrspace(200), align 8, addrspace(200)
11-
// CHECK-NEXT: [[ATOMIC_TEMP1:%.*]] = alloca ptr addrspace(200), align 8, addrspace(200)
12-
// CHECK-NEXT: [[ATOMIC_TEMP2:%.*]] = alloca ptr addrspace(200), align 8, addrspace(200)
13-
// CHECK-NEXT: call void @llvm.lifetime.start.p200(i64 8, ptr addrspace(200) nonnull [[P]]) #[[ATTR4:[0-9]+]]
14-
// CHECK-NEXT: call cherilibcallcc void @__atomic_load(i32 noundef 8, ptr addrspace(200) noundef nonnull [[P]], ptr addrspace(200) noundef nonnull [[ATOMIC_TEMP]], i32 noundef 5) #[[ATTR5:[0-9]+]]
10+
// CHECK-NEXT: call void @llvm.lifetime.start.p200(i64 8, ptr addrspace(200) nonnull [[P]]) #[[ATTR2:[0-9]+]]
11+
// CHECK-NEXT: [[ATOMIC_LOAD:%.*]] = load atomic ptr addrspace(200), ptr addrspace(200) [[P]] seq_cst, align 8, !tbaa [[TBAA7:![0-9]+]]
1512
// CHECK-NEXT: br label %[[ATOMIC_OP:.*]]
1613
// CHECK: [[ATOMIC_OP]]:
17-
// CHECK-NEXT: [[DOTIN:%.*]] = phi ptr addrspace(200) [ [[ATOMIC_TEMP]], %[[ENTRY]] ], [ [[ATOMIC_TEMP1]], %[[ATOMIC_OP]] ]
18-
// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[DOTIN]], align 8, !tbaa [[TBAA7:![0-9]+]]
14+
// CHECK-NEXT: [[TMP0:%.*]] = phi ptr addrspace(200) [ [[ATOMIC_LOAD]], %[[ENTRY]] ], [ [[TMP3:%.*]], %[[ATOMIC_OP]] ]
1915
// CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr addrspace(200) [[TMP0]], i32 1
20-
// CHECK-NEXT: store ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[ATOMIC_TEMP1]], align 8, !tbaa [[TBAA11:![0-9]+]]
21-
// CHECK-NEXT: store ptr addrspace(200) [[TMP1]], ptr addrspace(200) [[ATOMIC_TEMP2]], align 8, !tbaa [[TBAA11]]
22-
// CHECK-NEXT: [[CALL:%.*]] = call cherilibcallcc zeroext i1 @__atomic_compare_exchange(i32 noundef 8, ptr addrspace(200) noundef nonnull [[P]], ptr addrspace(200) noundef nonnull [[ATOMIC_TEMP1]], ptr addrspace(200) noundef nonnull [[ATOMIC_TEMP2]], i32 noundef 5, i32 noundef 5) #[[ATTR5]]
23-
// CHECK-NEXT: br i1 [[CALL]], label %[[ATOMIC_CONT:.*]], label %[[ATOMIC_OP]]
16+
// CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(200) [[P]], ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[TMP1]] seq_cst seq_cst, align 8
17+
// CHECK-NEXT: [[TMP3]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 0
18+
// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 1
19+
// CHECK-NEXT: br i1 [[TMP4]], label %[[ATOMIC_CONT:.*]], label %[[ATOMIC_OP]]
2420
// CHECK: [[ATOMIC_CONT]]:
25-
// CHECK-NEXT: call void @llvm.lifetime.end.p200(i64 8, ptr addrspace(200) nonnull [[P]]) #[[ATTR4]]
21+
// CHECK-NEXT: call void @llvm.lifetime.end.p200(i64 8, ptr addrspace(200) nonnull [[P]]) #[[ATTR2]]
2622
// CHECK-NEXT: ret void
2723
//
2824
void test1() {
@@ -31,8 +27,6 @@ void test1() {
3127
}
3228
//.
3329
// CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
34-
// CHECK: [[META8]] = !{!"unsigned __intcap", [[META9:![0-9]+]], i64 0}
35-
// CHECK: [[META9]] = !{!"omnipotent char", [[META10:![0-9]+]], i64 0}
36-
// CHECK: [[META10]] = !{!"Simple C/C++ TBAA"}
37-
// CHECK: [[TBAA11]] = !{[[META9]], [[META9]], i64 0}
30+
// CHECK: [[META8]] = !{!"omnipotent char", [[META9:![0-9]+]], i64 0}
31+
// CHECK: [[META9]] = !{!"Simple C/C++ TBAA"}
3832
//.

0 commit comments

Comments
 (0)