Skip to content

Commit 33651ca

Browse files
committed
[CHERI] Prefer to lower subobject bounds calculations as cap_top - cap_addr.
This is more efficient on CHERIoT, and is the direction big CHERI is heading as well.
1 parent 3fcf44f commit 33651ca

File tree

8 files changed

+82
-83
lines changed

8 files changed

+82
-83
lines changed

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -755,13 +755,15 @@ tightenCHERIBounds(CodeGenFunction &CGF, SubObjectBoundsKind Kind,
755755
SizeStr = TBR.Size ? ("min(" + Twine(*TBR.Size) + ", remaining)").str()
756756
: "remaining";
757757
auto SrcAsI8 = CGF.Builder.CreateBitCast(ValueToBound, CGF.Int8CheriCapTy);
758-
auto Offset = CGF.Builder.CreateIntrinsic(
759-
llvm::Intrinsic::cheri_cap_offset_get, CGF.PtrDiffTy, SrcAsI8, nullptr,
760-
"cur_offset");
761-
SrcLength =
762-
CGF.Builder.CreateIntrinsic(llvm::Intrinsic::cheri_cap_length_get,
763-
CGF.PtrDiffTy, SrcAsI8, nullptr, "cur_len");
764-
SetBoundsSize = CGF.Builder.CreateSub(SrcLength, Offset, "remaining_bytes");
758+
// CHERIoT does not directly implement cheri_cap_offset_get, so it's better
759+
// to lower the bounds in terms of cheri_cap_top_get / cheri_cap_addr_get.
760+
auto Top =
761+
CGF.Builder.CreateIntrinsic(llvm::Intrinsic::cheri_cap_top_get,
762+
CGF.PtrDiffTy, SrcAsI8, nullptr, "cur_top");
763+
auto Addr = CGF.Builder.CreateIntrinsic(
764+
llvm::Intrinsic::cheri_cap_address_get, CGF.PtrDiffTy, SrcAsI8, nullptr,
765+
"cur_addr");
766+
SetBoundsSize = CGF.Builder.CreateSub(Top, Addr, "remaining_bytes");
765767
if (TBR.Size) {
766768
auto MaxConst = llvm::ConstantInt::get(CGF.PtrDiffTy, *TBR.Size);
767769
auto LessThanMax = CGF.Builder.CreateICmpULT(SetBoundsSize, MaxConst,

clang/test/CodeGen/cheri/subobject-bounds-addrof-array.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -436,23 +436,23 @@ extern int bhnd_sprom_layouts[];
436436

437437
// AGGRESSIVE-OR-LESS-LABEL: @test_unsized_global_array(
438438
// AGGRESSIVE-OR-LESS-NEXT: entry:
439-
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_OFFSET:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
440-
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_LEN:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
441-
// AGGRESSIVE-OR-LESS-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
439+
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_TOP:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
440+
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_ADDR:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
441+
// AGGRESSIVE-OR-LESS-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
442442
// AGGRESSIVE-OR-LESS-NEXT: [[TMP0:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) @bhnd_sprom_layouts, i64 [[REMAINING_BYTES]])
443443
// AGGRESSIVE-OR-LESS-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [0 x i32], ptr addrspace(200) [[TMP0]], i64 0, i64 0
444-
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_OFFSET1:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) [[ARRAYIDX]])
445-
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_LEN2:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) [[ARRAYIDX]])
446-
// AGGRESSIVE-OR-LESS-NEXT: [[REMAINING_BYTES3:%.*]] = sub i64 [[CUR_LEN2]], [[CUR_OFFSET1]]
444+
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_TOP1:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) [[ARRAYIDX]])
445+
// AGGRESSIVE-OR-LESS-NEXT: [[CUR_ADDR1:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) [[ARRAYIDX]])
446+
// AGGRESSIVE-OR-LESS-NEXT: [[REMAINING_BYTES3:%.*]] = sub i64 [[CUR_TOP1]], [[CUR_ADDR1]]
447447
// AGGRESSIVE-OR-LESS-NEXT: [[TMP1:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) [[ARRAYIDX]], i64 [[REMAINING_BYTES3]])
448448
// AGGRESSIVE-OR-LESS-NEXT: call void @do_stuff_untyped(ptr addrspace(200) noundef [[TMP1]])
449449
// AGGRESSIVE-OR-LESS-NEXT: ret void
450450
//
451451
// VERY-AGGRESSIVE-LABEL: @test_unsized_global_array(
452452
// VERY-AGGRESSIVE-NEXT: entry:
453-
// VERY-AGGRESSIVE-NEXT: [[CUR_OFFSET:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
454-
// VERY-AGGRESSIVE-NEXT: [[CUR_LEN:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
455-
// VERY-AGGRESSIVE-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
453+
// VERY-AGGRESSIVE-NEXT: [[CUR_TOP:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
454+
// VERY-AGGRESSIVE-NEXT: [[CUR_ADDR:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) @bhnd_sprom_layouts)
455+
// VERY-AGGRESSIVE-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
456456
// VERY-AGGRESSIVE-NEXT: [[TMP0:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) @bhnd_sprom_layouts, i64 [[REMAINING_BYTES]])
457457
// VERY-AGGRESSIVE-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [0 x i32], ptr addrspace(200) [[TMP0]], i64 0, i64 0
458458
// VERY-AGGRESSIVE-NEXT: [[TMP1:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) [[ARRAYIDX]], i64 4)

clang/test/CodeGen/cheri/subobject-bounds-array-to-pointer-decay.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ void test_global_struct_array_decay(struct_with_array *s, long index) {
9393
// CHECK-SAME: (ptr addrspace(200) nocapture noundef readnone [[S:%.*]], i64 noundef signext [[SIZE:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
9494
// CHECK-NEXT: entry:
9595
// CHECK-NEXT: [[VLA:%.*]] = alloca i32, i64 [[SIZE]], align 4, addrspace(200)
96-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[VLA]])
97-
// CHECK-NEXT: [[CUR_LEN:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[VLA]])
98-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
96+
// CHECK-NEXT: [[CUR_TOP:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[VLA]])
97+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[VLA]])
98+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
9999
// CHECK-NEXT: [[TMP0:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[VLA]], i64 [[REMAINING_BYTES]])
100100
// CHECK-NEXT: call void @overflow_buffer(ptr addrspace(200) noundef [[TMP0]]) #[[ATTR5]]
101101
// CHECK-NEXT: ret void
@@ -115,9 +115,9 @@ struct vla_struct {
115115
// CHECK-SAME: (ptr addrspace(200) noundef [[S:%.*]], i64 noundef signext [[INDEX:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
116116
// CHECK-NEXT: entry:
117117
// CHECK-NEXT: [[VLA:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[S]], i64 4
118-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[VLA]])
119-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[VLA]])
120-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
118+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[VLA]])
119+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[VLA]])
120+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
121121
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[VLA]], i64 [[REMAINING_BYTES]])
122122
// CHECK-NEXT: tail call void @overflow_buffer(ptr addrspace(200) noundef [[TMP0]]) #[[ATTR5]]
123123
// CHECK-NEXT: ret void
@@ -135,9 +135,9 @@ struct fake_vla_struct {
135135
// CHECK-SAME: (ptr addrspace(200) noundef [[S:%.*]], i64 noundef signext [[INDEX:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
136136
// CHECK-NEXT: entry:
137137
// CHECK-NEXT: [[FAKE_VLA:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[S]], i64 4
138-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA]])
139-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA]])
140-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
138+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA]])
139+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA]])
140+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
141141
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[FAKE_VLA]], i64 [[REMAINING_BYTES]])
142142
// CHECK-NEXT: tail call void @overflow_buffer(ptr addrspace(200) noundef [[TMP0]]) #[[ATTR5]]
143143
// CHECK-NEXT: ret void
@@ -155,9 +155,9 @@ struct fake_vla_struct2 {
155155
// CHECK-SAME: (ptr addrspace(200) noundef [[S:%.*]], i64 noundef signext [[INDEX:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] {
156156
// CHECK-NEXT: entry:
157157
// CHECK-NEXT: [[FAKE_VLA2:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[S]], i64 4
158-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA2]])
159-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA2]])
160-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
158+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA2]])
159+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[FAKE_VLA2]])
160+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
161161
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[FAKE_VLA2]], i64 [[REMAINING_BYTES]])
162162
// CHECK-NEXT: tail call void @overflow_buffer(ptr addrspace(200) noundef [[TMP0]]) #[[ATTR5]]
163163
// CHECK-NEXT: ret void
@@ -171,9 +171,9 @@ extern int bhnd_sprom_layouts[];
171171
// CHECK-LABEL: define {{[^@]+}}@test_unsized_global_decay
172172
// CHECK-SAME: () local_unnamed_addr addrspace(200) #[[ATTR0]] {
173173
// CHECK-NEXT: entry:
174-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull @bhnd_sprom_layouts)
175-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull @bhnd_sprom_layouts)
176-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
174+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull @bhnd_sprom_layouts)
175+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull @bhnd_sprom_layouts)
176+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
177177
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull @bhnd_sprom_layouts, i64 [[REMAINING_BYTES]])
178178
// CHECK-NEXT: tail call void @overflow_buffer(ptr addrspace(200) noundef [[TMP0]]) #[[ATTR5]]
179179
// CHECK-NEXT: ret void

clang/test/CodeGen/cheri/subobject-bounds-pointer-container.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ char *test_SA(struct SA *sa) {
5959
// CHECK-LABEL: @test_TA(
6060
// CHECK-NEXT: entry:
6161
// CHECK-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_TA:%.*]], ptr addrspace(200) [[TA:%.*]], i32 0, i32 0
62-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) [[A]])
63-
// CHECK-NEXT: [[CUR_LEN:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) [[A]])
64-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
62+
// CHECK-NEXT: [[CUR_TOP:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) [[A]])
63+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) [[A]])
64+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
6565
// CHECK-NEXT: [[TMP0:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) [[A]], i64 [[REMAINING_BYTES]])
6666
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i8], ptr addrspace(200) [[TMP0]], i64 0, i64 1
67-
// CHECK-NEXT: [[CUR_OFFSET1:%.*]] = call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) [[ARRAYIDX]])
68-
// CHECK-NEXT: [[CUR_LEN2:%.*]] = call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) [[ARRAYIDX]])
69-
// CHECK-NEXT: [[REMAINING_BYTES3:%.*]] = sub i64 [[CUR_LEN2]], [[CUR_OFFSET1]]
67+
// CHECK-NEXT: [[CUR_TOP1:%.*]] = call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) [[ARRAYIDX]])
68+
// CHECK-NEXT: [[CUR_ADDR1:%.*]] = call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) [[ARRAYIDX]])
69+
// CHECK-NEXT: [[REMAINING_BYTES3:%.*]] = sub i64 [[CUR_TOP1]], [[CUR_ADDR1]]
7070
// CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) [[ARRAYIDX]], i64 [[REMAINING_BYTES3]])
7171
// CHECK-NEXT: ret ptr addrspace(200) [[TMP1]]
7272
//

clang/test/CodeGen/cheri/subobject-bounds-remaining-size-attribute.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ void *test_opt_out(void *data, long index) {
3838
// CHECK-LABEL: @test_remaining_size(
3939
// CHECK-NEXT: entry:
4040
// CHECK-NEXT: [[DATA1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[DATA:%.*]], i64 4
41-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[DATA1]])
42-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[DATA1]])
43-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
41+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[DATA1]])
42+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[DATA1]])
43+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
4444
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[DATA1]], i64 [[REMAINING_BYTES]])
4545
// CHECK-NEXT: ret ptr addrspace(200) [[TMP0]]
4646
//
@@ -56,9 +56,9 @@ void *test_remaining_size(void *data, long index) {
5656
// CHECK-LABEL: @test_remaining_size_not_array(
5757
// CHECK-NEXT: entry:
5858
// CHECK-NEXT: [[F:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[DATA:%.*]], i64 4
59-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[F]])
60-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[F]])
61-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
59+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[F]])
60+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[F]])
61+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
6262
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[F]], i64 [[REMAINING_BYTES]])
6363
// CHECK-NEXT: ret ptr addrspace(200) [[TMP0]]
6464
//
@@ -79,9 +79,9 @@ void *test_remaining_size_not_array(void *data, long index) {
7979
// CHECK-LABEL: @test_remaining_size_on_type(
8080
// CHECK-NEXT: entry:
8181
// CHECK-NEXT: [[DATA1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[DATA:%.*]], i64 4
82-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[DATA1]])
83-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[DATA1]])
84-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
82+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[DATA1]])
83+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[DATA1]])
84+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
8585
// CHECK-NEXT: [[BOUNDED_REMAINING_SIZE:%.*]] = tail call i64 @llvm.umin.i64(i64 [[REMAINING_BYTES]], i64 16)
8686
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[DATA1]], i64 [[BOUNDED_REMAINING_SIZE]])
8787
// CHECK-NEXT: ret ptr addrspace(200) [[TMP0]]
@@ -124,9 +124,9 @@ void *test_remaining_size_ignored_on_typedef(void *data, long index) {
124124
// CHECK-LABEL: @test_remaining_size_maximum(
125125
// CHECK-NEXT: entry:
126126
// CHECK-NEXT: [[DATA1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[DATA:%.*]], i64 4
127-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[DATA1]])
128-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[DATA1]])
129-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
127+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[DATA1]])
128+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[DATA1]])
129+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
130130
// CHECK-NEXT: [[BOUNDED_REMAINING_SIZE:%.*]] = tail call i64 @llvm.umin.i64(i64 [[REMAINING_BYTES]], i64 127)
131131
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[DATA1]], i64 [[BOUNDED_REMAINING_SIZE]])
132132
// CHECK-NEXT: ret ptr addrspace(200) [[TMP0]]
@@ -143,9 +143,9 @@ void *test_remaining_size_maximum(void *data, long index) {
143143
// CHECK-LABEL: @test_vla(
144144
// CHECK-NEXT: entry:
145145
// CHECK-NEXT: [[VLA:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(200) [[DATA:%.*]], i64 4
146-
// CHECK-NEXT: [[CUR_OFFSET:%.*]] = tail call i64 @llvm.cheri.cap.offset.get.i64(ptr addrspace(200) nonnull [[VLA]])
147-
// CHECK-NEXT: [[CUR_LEN:%.*]] = tail call i64 @llvm.cheri.cap.length.get.i64(ptr addrspace(200) nonnull [[VLA]])
148-
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_LEN]], [[CUR_OFFSET]]
146+
// CHECK-NEXT: [[CUR_TOP:%.*]] = tail call i64 @llvm.cheri.cap.top.get.i64(ptr addrspace(200) nonnull [[VLA]])
147+
// CHECK-NEXT: [[CUR_ADDR:%.*]] = tail call i64 @llvm.cheri.cap.address.get.i64(ptr addrspace(200) nonnull [[VLA]])
148+
// CHECK-NEXT: [[REMAINING_BYTES:%.*]] = sub i64 [[CUR_TOP]], [[CUR_ADDR]]
149149
// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(200) @llvm.cheri.cap.bounds.set.i64(ptr addrspace(200) nonnull [[VLA]], i64 [[REMAINING_BYTES]])
150150
// CHECK-NEXT: ret ptr addrspace(200) [[TMP0]]
151151
//

0 commit comments

Comments
 (0)