Skip to content

Commit 517c19d

Browse files
committed
[BoundsSafety] Unbreak several codegen tests
This commit (and its corresponding merge commit) broke several codegen tests. ``` commit 4b59b95 Merge: c5ca745 c37b254 Author: git apple-llvm automerger <am@git-apple-llvm> Date: Fri May 2 23:22:29 2025 -0700 Merge commit 'c37b2549ff01' from llvm.org/main into next commit c37b254 error: cannot run gpg: No such file or directory Author: Yingwei Zheng <[email protected]> Date: Fri May 2 05:21:59 2025 +0800 Revert "[InstSimplify] Fold getelementptr inbounds null, idx -> null (llvm#130742)" (llvm#138168) Revert llvm#130742 for now to avoid breaking glibc failures until the workaround patches are landed. ``` This commit re-generates the failing codegen tests. rdar://150697626
1 parent 60ef745 commit 517c19d

File tree

4 files changed

+64
-30
lines changed

4 files changed

+64
-30
lines changed

clang/test/BoundsSafety-legacy-checks/CodeGen/nested-struct-member-count-O2.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,24 @@ char access(struct Outer *bar, int index) {
4242

4343

4444

45-
// CHECK-LABEL: define dso_local noundef nonnull ptr @assign(
45+
// CHECK-LABEL: define dso_local ptr @assign(
4646
// CHECK-SAME: ptr noundef readonly captures(none) [[BAR:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0]] {
4747
// CHECK-NEXT: entry:
48-
// CHECK-NEXT: [[AGG_TEMP1_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[BAR]], align 8, !nonnull {{![0-9]+}}, !noundef {{![0-9]+}}
48+
// CHECK-NEXT: [[AGG_TEMP1_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[BAR]], align 8
4949
// CHECK-NEXT: [[AGG_TEMP1_SROA_2_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 8
5050
// CHECK-NEXT: [[AGG_TEMP1_SROA_2_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_2_0_BAR_SROA_IDX]], align 8
51+
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 16
52+
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX]], align 8, !tbaa {{![0-9]+}}
53+
// CHECK-NEXT: [[FLEX_BASE_NULL_CHECK_NOT:%.*]] = icmp eq ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], null, !annotation {{![0-9]+}}
54+
// CHECK-NEXT: br i1 [[FLEX_BASE_NULL_CHECK_NOT]], label [[BOUNDSCHECK_CONT_THREAD:%.*]], label [[FLEX_BASE_NONNULL:%.*]], !annotation {{![0-9]+}}
55+
// CHECK: flex.base.nonnull:
5156
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], i64 8
5257
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp ugt ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], [[TMP0]], !annotation {{![0-9]+}}
5358
// CHECK-NEXT: br i1 [[DOTNOT]], label [[TRAP:%.*]], label [[CONT:%.*]], !prof {{![0-9]+}}, !annotation {{![0-9]+}}
5459
// CHECK: trap:
5560
// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR2]], !annotation {{![0-9]+}}
5661
// CHECK-NEXT: unreachable, !annotation {{![0-9]+}}
5762
// CHECK: cont:
58-
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 16
59-
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX]], align 8, !tbaa {{![0-9]+}}
6063
// CHECK-NEXT: [[TMP1:%.*]] = icmp ule ptr [[TMP0]], [[AGG_TEMP1_SROA_2_0_COPYLOAD]], !annotation {{![0-9]+}}
6164
// CHECK-NEXT: [[TMP2:%.*]] = icmp ule ptr [[AGG_TEMP1_SROA_3_0_COPYLOAD]], [[AGG_TEMP1_SROA_0_0_COPYLOAD]], !annotation {{![0-9]+}}
6265
// CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false, !annotation {{![0-9]+}}
@@ -72,9 +75,14 @@ char access(struct Outer *bar, int index) {
7275
// CHECK-NEXT: [[TMP3:%.*]] = icmp ult ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], [[AGG_TEMP1_SROA_2_0_COPYLOAD]], !annotation {{![0-9]+}}
7376
// CHECK-NEXT: [[OR_COND60:%.*]] = select i1 [[OR_COND49]], i1 [[TMP3]], i1 false, !annotation {{![0-9]+}}
7477
// CHECK-NEXT: br i1 [[OR_COND60]], label [[BOUNDSCHECK_CONT:%.*]], label [[TRAP]], !prof {{![0-9]+}}, !annotation {{![0-9]+}}
78+
// CHECK: boundscheck.cont.thread:
79+
// CHECK-NEXT: store i32 [[LEN]], ptr inttoptr (i64 4 to ptr), align 4, !tbaa {{![0-9]+}}
80+
// CHECK-NEXT: br label [[CONT46:%.*]]
7581
// CHECK: boundscheck.cont:
7682
// CHECK-NEXT: [[LEN31:%.*]] = getelementptr inbounds nuw i8, ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], i64 4
7783
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN31]], align 4, !tbaa {{![0-9]+}}
84+
// CHECK-NEXT: br label [[CONT46]], !annotation {{![0-9]+}}
85+
// CHECK: cont46:
7886
// CHECK-NEXT: ret ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]]
7987
//
8088
struct Outer * assign(void * __bidi_indexable bar, int len) {

clang/test/BoundsSafety/CodeGen/bounds-attributed-in-return-null-system-header-O2.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ void consume(int* __bidi_indexable);
2525
// LEGACY-SAME: i32 noundef [[COUNT:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
2626
// LEGACY-NEXT: [[ENTRY:.*:]]
2727
// LEGACY-NEXT: [[BYVAL_TEMP:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
28-
// LEGACY-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR4:[0-9]+]]
29-
// LEGACY-NEXT: call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) [[BYVAL_TEMP]], i8 0, i64 24, i1 false)
30-
// LEGACY-NEXT: call void @consume(ptr noundef nonnull [[BYVAL_TEMP]]) #[[ATTR4]]
31-
// LEGACY-NEXT: call void @llvm.lifetime.end.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR4]]
28+
// LEGACY-NEXT: [[IDX_EXT:%.*]] = sext i32 [[COUNT]] to i64
29+
// LEGACY-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr null, i64 [[IDX_EXT]]
30+
// LEGACY-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR3:[0-9]+]]
31+
// LEGACY-NEXT: store ptr null, ptr [[BYVAL_TEMP]], align 8
32+
// LEGACY-NEXT: [[PTR_SROA_4_0_BYVAL_TEMP_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 8
33+
// LEGACY-NEXT: store ptr [[ADD_PTR]], ptr [[PTR_SROA_4_0_BYVAL_TEMP_SROA_IDX]], align 8
34+
// LEGACY-NEXT: [[PTR_SROA_5_0_BYVAL_TEMP_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 16
35+
// LEGACY-NEXT: store ptr null, ptr [[PTR_SROA_5_0_BYVAL_TEMP_SROA_IDX]], align 8, !tbaa [[TBAA2:![0-9]+]]
36+
// LEGACY-NEXT: call void @consume(ptr noundef nonnull [[BYVAL_TEMP]]) #[[ATTR3]]
37+
// LEGACY-NEXT: call void @llvm.lifetime.end.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR3]]
3238
// LEGACY-NEXT: ret void
3339
//
3440
void use_inline_header_func_unspecified_ptr(int count) {
@@ -56,10 +62,16 @@ void use_inline_header_func_unspecified_ptr(int count) {
5662
// LEGACY-SAME: i32 noundef [[COUNT:%.*]]) local_unnamed_addr #[[ATTR0]] {
5763
// LEGACY-NEXT: [[ENTRY:.*:]]
5864
// LEGACY-NEXT: [[BYVAL_TEMP:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
59-
// LEGACY-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR4]]
60-
// LEGACY-NEXT: call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) [[BYVAL_TEMP]], i8 0, i64 24, i1 false)
61-
// LEGACY-NEXT: call void @consume(ptr noundef nonnull [[BYVAL_TEMP]]) #[[ATTR4]]
62-
// LEGACY-NEXT: call void @llvm.lifetime.end.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR4]]
65+
// LEGACY-NEXT: [[IDX_EXT:%.*]] = sext i32 [[COUNT]] to i64
66+
// LEGACY-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr null, i64 [[IDX_EXT]]
67+
// LEGACY-NEXT: call void @llvm.lifetime.start.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR3]]
68+
// LEGACY-NEXT: store ptr null, ptr [[BYVAL_TEMP]], align 8
69+
// LEGACY-NEXT: [[PTR_SROA_4_0_BYVAL_TEMP_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 8
70+
// LEGACY-NEXT: store ptr [[ADD_PTR]], ptr [[PTR_SROA_4_0_BYVAL_TEMP_SROA_IDX]], align 8
71+
// LEGACY-NEXT: [[PTR_SROA_5_0_BYVAL_TEMP_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BYVAL_TEMP]], i64 16
72+
// LEGACY-NEXT: store ptr null, ptr [[PTR_SROA_5_0_BYVAL_TEMP_SROA_IDX]], align 8, !tbaa [[TBAA2]]
73+
// LEGACY-NEXT: call void @consume(ptr noundef nonnull [[BYVAL_TEMP]]) #[[ATTR3]]
74+
// LEGACY-NEXT: call void @llvm.lifetime.end.p0(i64 24, ptr nonnull [[BYVAL_TEMP]]) #[[ATTR3]]
6375
// LEGACY-NEXT: ret void
6476
//
6577
void use_inline_header_func_unsafe_indexable_ptr(int count) {
@@ -70,3 +82,9 @@ void use_inline_header_func_unsafe_indexable_ptr(int count) {
7082
// CHECK: [[META2]] = !{!"bounds-safety-generic"}
7183
// CHECK: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
7284
//.
85+
// LEGACY: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
86+
// LEGACY: [[META3]] = !{!"p1 int", [[META4:![0-9]+]], i64 0}
87+
// LEGACY: [[META4]] = !{!"any pointer", [[META5:![0-9]+]], i64 0}
88+
// LEGACY: [[META5]] = !{!"omnipotent char", [[META6:![0-9]+]], i64 0}
89+
// LEGACY: [[META6]] = !{!"Simple C/C++ TBAA"}
90+
//.

clang/test/BoundsSafety/CodeGen/nested-struct-member-count-O2.c

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,24 @@ char access(struct Outer *bar, int index) {
4141

4242

4343

44-
// CHECK-LABEL: define dso_local noundef nonnull ptr @assign(
44+
// CHECK-LABEL: define dso_local ptr @assign(
4545
// CHECK-SAME: ptr noundef readonly captures(none) [[BAR:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0]] {
4646
// CHECK-NEXT: entry:
47-
// CHECK-NEXT: [[AGG_TEMP1_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[BAR]], align 8, !nonnull [[META12:![0-9]+]], !noundef [[META12]]
47+
// CHECK-NEXT: [[AGG_TEMP1_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[BAR]], align 8
4848
// CHECK-NEXT: [[AGG_TEMP1_SROA_2_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 8
4949
// CHECK-NEXT: [[AGG_TEMP1_SROA_2_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_2_0_BAR_SROA_IDX]], align 8
50+
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 16
51+
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX]], align 8, !tbaa [[TBAA12:![0-9]+]]
52+
// CHECK-NEXT: [[FLEX_BASE_NULL_CHECK_NOT:%.*]] = icmp eq ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], null, !annotation [[META14:![0-9]+]]
53+
// CHECK-NEXT: br i1 [[FLEX_BASE_NULL_CHECK_NOT]], label [[BOUNDSCHECK_CONT_THREAD:%.*]], label [[FLEX_BASE_NONNULL:%.*]], !annotation [[META14]]
54+
// CHECK: flex.base.nonnull:
5055
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], i64 8
51-
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp ugt ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], [[TMP0]], !annotation [[META13:![0-9]+]]
52-
// CHECK-NEXT: br i1 [[DOTNOT]], label [[TRAP:%.*]], label [[CONT:%.*]], !prof [[PROF14:![0-9]+]], !annotation [[META13]]
56+
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp ugt ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], [[TMP0]], !annotation [[META15:![0-9]+]]
57+
// CHECK-NEXT: br i1 [[DOTNOT]], label [[TRAP:%.*]], label [[CONT:%.*]], !prof [[PROF16:![0-9]+]], !annotation [[META15]]
5358
// CHECK: trap:
54-
// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR2]], !annotation [[META15:![0-9]+]]
55-
// CHECK-NEXT: unreachable, !annotation [[META15]]
59+
// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR2]], !annotation [[META17:![0-9]+]]
60+
// CHECK-NEXT: unreachable, !annotation [[META17]]
5661
// CHECK: cont:
57-
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[BAR]], i64 16
58-
// CHECK-NEXT: [[AGG_TEMP1_SROA_3_0_COPYLOAD:%.*]] = load ptr, ptr [[AGG_TEMP1_SROA_3_0_BAR_SROA_IDX]], align 8, !tbaa [[TBAA16:![0-9]+]]
5962
// CHECK-NEXT: [[TMP1:%.*]] = icmp ule ptr [[TMP0]], [[AGG_TEMP1_SROA_2_0_COPYLOAD]], !annotation [[META7]]
6063
// CHECK-NEXT: [[TMP2:%.*]] = icmp ule ptr [[AGG_TEMP1_SROA_3_0_COPYLOAD]], [[AGG_TEMP1_SROA_0_0_COPYLOAD]], !annotation [[META8]]
6164
// CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false, !annotation [[META8]]
@@ -69,9 +72,14 @@ char access(struct Outer *bar, int index) {
6972
// CHECK-NEXT: [[FLEX_COUNT_CHECK:%.*]] = icmp uge i64 [[FLEX_AVAIL_COUNT]], [[FLEX_COUNT_INTPTR]], !annotation [[META19]]
7073
// CHECK-NEXT: [[OR_COND51:%.*]] = select i1 [[FLEX_COUNT_MINUS]], i1 [[FLEX_COUNT_CHECK]], i1 false, !annotation [[META19]]
7174
// CHECK-NEXT: br i1 [[OR_COND51]], label [[BOUNDSCHECK_NOTNULL45:%.*]], label [[TRAP]], !prof [[PROF20:![0-9]+]], !annotation [[META18]]
75+
// CHECK: boundscheck.cont.thread:
76+
// CHECK-NEXT: store i32 [[LEN]], ptr inttoptr (i64 4 to ptr), align 4, !tbaa [[TBAA2]]
77+
// CHECK-NEXT: br label [[CONT48:%.*]]
7278
// CHECK: boundscheck.notnull45:
7379
// CHECK-NEXT: [[LEN32:%.*]] = getelementptr inbounds nuw i8, ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]], i64 4
7480
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN32]], align 4, !tbaa [[TBAA2]]
81+
// CHECK-NEXT: br label [[CONT48]]
82+
// CHECK: cont48:
7583
// CHECK-NEXT: ret ptr [[AGG_TEMP1_SROA_0_0_COPYLOAD]]
7684
//
7785
struct Outer * assign(void * __bidi_indexable bar, int len) {
@@ -90,12 +98,12 @@ struct Outer * assign(void * __bidi_indexable bar, int len) {
9098
// CHECK: [[PROF9]] = !{!"branch_weights", i32 -8192, i32 8191}
9199
// CHECK: [[META10]] = !{!"bounds-safety-check-ptr-lt-upper-bound", !"bounds-safety-check-ptr-ge-lower-bound"}
92100
// CHECK: [[TBAA11]] = !{[[META5]], [[META5]], i64 0}
93-
// CHECK: [[META12]] = !{}
94-
// CHECK: [[META13]] = !{!"bounds-safety-check-one-past-end-overflow"}
95-
// CHECK: [[PROF14]] = !{!"branch_weights", i32 1, i32 1048575}
96-
// CHECK: [[META15]] = !{!"bounds-safety-check-one-past-end-overflow", !"bounds-safety-check-ptr-lt-upper-bound", !"bounds-safety-check-ptr-ge-lower-bound", !"bounds-safety-check-count-negative", !"bounds-safety-check-ptr-le-upper-bound", !"bounds-safety-check-flexible-count-gt-bounds"}
97-
// CHECK: [[TBAA16]] = !{[[META17:![0-9]+]], [[META17]], i64 0}
98-
// CHECK: [[META17]] = !{!"any pointer", [[META5]], i64 0}
101+
// CHECK: [[TBAA12]] = !{[[META13:![0-9]+]], [[META13]], i64 0}
102+
// CHECK: [[META13]] = !{!"any pointer", [[META5]], i64 0}
103+
// CHECK: [[META14]] = !{!"bounds-safety-check-ptr-neq-null"}
104+
// CHECK: [[META15]] = !{!"bounds-safety-check-one-past-end-overflow"}
105+
// CHECK: [[PROF16]] = !{!"branch_weights", i32 1, i32 1048575}
106+
// CHECK: [[META17]] = !{!"bounds-safety-check-one-past-end-overflow", !"bounds-safety-check-ptr-lt-upper-bound", !"bounds-safety-check-ptr-ge-lower-bound", !"bounds-safety-check-count-negative", !"bounds-safety-check-ptr-le-upper-bound", !"bounds-safety-check-flexible-count-gt-bounds"}
99107
// CHECK: [[META18]] = !{!"bounds-safety-check-count-negative"}
100108
// CHECK: [[META19]] = !{!"bounds-safety-check-flexible-count-gt-bounds"}
101109
// CHECK: [[PROF20]] = !{!"branch_weights", i32 -16384, i32 16381}

clang/test/BoundsSafety/CodeGen/terminated-by-to-indexable-trivial-O2.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,17 @@ const char *__indexable good_chars_unsafe(void) {
4141
}
4242

4343
// CHECK-LABEL: @bad_null(
44-
// CHECK-NEXT: terminated_by.loop_end:
45-
// CHECK-NEXT: ret { ptr, ptr } zeroinitializer
44+
// CHECK-NEXT: entry:
45+
// CHECK-NEXT: unreachable
4646
//
4747
int *__indexable bad_null(void) {
4848
int *__null_terminated p = 0;
4949
return __terminated_by_to_indexable(p);
5050
}
5151

5252
// CHECK-LABEL: @bad_null_unsafe(
53-
// CHECK-NEXT: terminated_by.loop_end:
54-
// CHECK-NEXT: ret { ptr, ptr } zeroinitializer
53+
// CHECK-NEXT: entry:
54+
// CHECK-NEXT: unreachable
5555
//
5656
int *__indexable bad_null_unsafe(void) {
5757
int *__null_terminated p = 0;

0 commit comments

Comments
 (0)