Skip to content

Commit 462cb3c

Browse files
authored
[InstCombine] Infer nusw + nneg -> nuw for getelementptr (#111144)
If the gep is nusw (usually via inbounds) and the offset is non-negative, we can infer nuw. Proof: https://alive2.llvm.org/ce/z/ihztLy
1 parent f85be32 commit 462cb3c

File tree

190 files changed

+2267
-2188
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

190 files changed

+2267
-2188
lines changed

Diff for: clang/test/CodeGen/AArch64/ls64-inline-asm.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ struct foo { unsigned long long x[8]; };
55

66
// CHECK-LABEL: @load(
77
// CHECK-NEXT: entry:
8-
// CHECK-NEXT: [[TMP0:%.*]] = tail call i512 asm sideeffect "ld64b $0,[$1]", "=r,r,~{memory}"(ptr [[ADDR:%.*]]) #[[ATTR1:[0-9]+]], !srcloc !2
8+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i512 asm sideeffect "ld64b $0,[$1]", "=r,r,~{memory}"(ptr [[ADDR:%.*]]) #[[ATTR1:[0-9]+]], !srcloc [[META2:![0-9]+]]
99
// CHECK-NEXT: store i512 [[TMP0]], ptr [[OUTPUT:%.*]], align 8
1010
// CHECK-NEXT: ret void
1111
//
@@ -17,7 +17,7 @@ void load(struct foo *output, void *addr)
1717
// CHECK-LABEL: @store(
1818
// CHECK-NEXT: entry:
1919
// CHECK-NEXT: [[TMP0:%.*]] = load i512, ptr [[INPUT:%.*]], align 8
20-
// CHECK-NEXT: tail call void asm sideeffect "st64b $0,[$1]", "r,r,~{memory}"(i512 [[TMP0]], ptr [[ADDR:%.*]]) #[[ATTR1]], !srcloc !3
20+
// CHECK-NEXT: tail call void asm sideeffect "st64b $0,[$1]", "r,r,~{memory}"(i512 [[TMP0]], ptr [[ADDR:%.*]]) #[[ATTR1]], !srcloc [[META3:![0-9]+]]
2121
// CHECK-NEXT: ret void
2222
//
2323
void store(const struct foo *input, void *addr)
@@ -29,25 +29,25 @@ void store(const struct foo *input, void *addr)
2929
// CHECK-NEXT: entry:
3030
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[IN:%.*]], align 4, !tbaa [[TBAA4:![0-9]+]]
3131
// CHECK-NEXT: [[CONV:%.*]] = sext i32 [[TMP0]] to i64
32-
// CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 4
32+
// CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 4
3333
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX1]], align 4, !tbaa [[TBAA4]]
3434
// CHECK-NEXT: [[CONV2:%.*]] = sext i32 [[TMP1]] to i64
35-
// CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 16
35+
// CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 16
3636
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4, !tbaa [[TBAA4]]
3737
// CHECK-NEXT: [[CONV5:%.*]] = sext i32 [[TMP2]] to i64
38-
// CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 64
38+
// CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 64
3939
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX7]], align 4, !tbaa [[TBAA4]]
4040
// CHECK-NEXT: [[CONV8:%.*]] = sext i32 [[TMP3]] to i64
41-
// CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 100
41+
// CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 100
4242
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX10]], align 4, !tbaa [[TBAA4]]
4343
// CHECK-NEXT: [[CONV11:%.*]] = sext i32 [[TMP4]] to i64
44-
// CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 144
44+
// CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 144
4545
// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX13]], align 4, !tbaa [[TBAA4]]
4646
// CHECK-NEXT: [[CONV14:%.*]] = sext i32 [[TMP5]] to i64
47-
// CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 196
47+
// CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 196
4848
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX16]], align 4, !tbaa [[TBAA4]]
4949
// CHECK-NEXT: [[CONV17:%.*]] = sext i32 [[TMP6]] to i64
50-
// CHECK-NEXT: [[ARRAYIDX19:%.*]] = getelementptr inbounds i8, ptr [[IN]], i64 256
50+
// CHECK-NEXT: [[ARRAYIDX19:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 256
5151
// CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX19]], align 4, !tbaa [[TBAA4]]
5252
// CHECK-NEXT: [[CONV20:%.*]] = sext i32 [[TMP7]] to i64
5353
// CHECK-NEXT: [[S_SROA_10_0_INSERT_EXT:%.*]] = zext i64 [[CONV20]] to i512
@@ -72,7 +72,7 @@ void store(const struct foo *input, void *addr)
7272
// CHECK-NEXT: [[S_SROA_0_0_INSERT_EXT:%.*]] = zext i64 [[CONV]] to i512
7373
// CHECK-NEXT: [[S_SROA_0_0_INSERT_MASK:%.*]] = or disjoint i512 [[S_SROA_4_0_INSERT_MASK]], [[S_SROA_4_0_INSERT_SHIFT]]
7474
// CHECK-NEXT: [[S_SROA_0_0_INSERT_INSERT:%.*]] = or i512 [[S_SROA_0_0_INSERT_MASK]], [[S_SROA_0_0_INSERT_EXT]]
75-
// CHECK-NEXT: tail call void asm sideeffect "st64b $0,[$1]", "r,r,~{memory}"(i512 [[S_SROA_0_0_INSERT_INSERT]], ptr [[ADDR:%.*]]) #[[ATTR1]], !srcloc !8
75+
// CHECK-NEXT: tail call void asm sideeffect "st64b $0,[$1]", "r,r,~{memory}"(i512 [[S_SROA_0_0_INSERT_INSERT]], ptr [[ADDR:%.*]]) #[[ATTR1]], !srcloc [[META8:![0-9]+]]
7676
// CHECK-NEXT: ret void
7777
//
7878
void store2(int *in, void *addr)

Diff for: clang/test/CodeGen/AArch64/pure-scalable-args.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ void test_va_arg(int n, ...) {
417417
// CHECK-AAPCS-EMPTY:
418418
// CHECK-AAPCS-NEXT: vaarg.on_stack: ; preds = %vaarg.maybe_reg, %entry
419419
// CHECK-AAPCS-NEXT: %stack = load ptr, ptr %ap, align 8
420-
// CHECK-AAPCS-NEXT: %new_stack = getelementptr inbounds i8, ptr %stack, i64 8
420+
// CHECK-AAPCS-NEXT: %new_stack = getelementptr inbounds nuw i8, ptr %stack, i64 8
421421
// CHECK-AAPCS-NEXT: store ptr %new_stack, ptr %ap, align 8
422422
// CHECK-AAPCS-NEXT: br label %vaarg.end
423423
// CHECK-AAPCS-EMPTY:
@@ -428,7 +428,7 @@ void test_va_arg(int n, ...) {
428428
// CHECK-AAPCS-NEXT: %vaarg.addr = load ptr, ptr %vaargs.addr, align 8
429429

430430
// CHECK-AAPCS-NEXT: %v.sroa.0.0.copyload = load <2 x i8>, ptr %vaarg.addr, align 16
431-
// CHECK-AAPCS-NEXT: %v.sroa.43.0.vaarg.addr.sroa_idx = getelementptr inbounds i8, ptr %vaarg.addr, i64 48
431+
// CHECK-AAPCS-NEXT: %v.sroa.43.0.vaarg.addr.sroa_idx = getelementptr inbounds nuw i8, ptr %vaarg.addr, i64 48
432432
// CHECK-AAPCS-NEXT: %v.sroa.43.0.copyload = load <4 x float>, ptr %v.sroa.43.0.vaarg.addr.sroa_idx, align 16
433433
// CHECK-AAPCS-NEXT: call void @llvm.va_end.p0(ptr nonnull %ap)
434434
// CHECK-AAPCS-NEXT: %cast.scalable = call <vscale x 2 x i8> @llvm.vector.insert.nxv2i8.v2i8(<vscale x 2 x i8> poison, <2 x i8> %v.sroa.0.0.copyload, i64 0)
@@ -445,11 +445,11 @@ void test_va_arg(int n, ...) {
445445
// CHECK-DARWIN-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ap)
446446
// CHECK-DARWIN-NEXT: call void @llvm.va_start.p0(ptr nonnull %ap)
447447
// CHECK-DARWIN-NEXT: %argp.cur = load ptr, ptr %ap, align 8
448-
// CHECK-DARWIN-NEXT: %argp.next = getelementptr inbounds i8, ptr %argp.cur, i64 8
448+
// CHECK-DARWIN-NEXT: %argp.next = getelementptr inbounds nuw i8, ptr %argp.cur, i64 8
449449
// CHECK-DARWIN-NEXT: store ptr %argp.next, ptr %ap, align 8
450450
// CHECK-DARWIN-NEXT: %0 = load ptr, ptr %argp.cur, align 8
451451
// CHECK-DARWIN-NEXT: %v.sroa.0.0.copyload = load <2 x i8>, ptr %0, align 16
452-
// CHECK-DARWIN-NEXT: %v.sroa.43.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 48
452+
// CHECK-DARWIN-NEXT: %v.sroa.43.0..sroa_idx = getelementptr inbounds nuw i8, ptr %0, i64 48
453453
// CHECK-DARWIN-NEXT: %v.sroa.43.0.copyload = load <4 x float>, ptr %v.sroa.43.0..sroa_idx, align 16
454454
// CHECK-DARWIN-NEXT: call void @llvm.va_end.p0(ptr nonnull %ap)
455455
// CHECK-DARWIN-NEXT: %cast.scalable = call <vscale x 2 x i8> @llvm.vector.insert.nxv2i8.v2i8(<vscale x 2 x i8> poison, <2 x i8> %v.sroa.0.0.copyload, i64 0)

Diff for: clang/test/CodeGen/PowerPC/builtins-ppc-pair-mma.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ void test1(unsigned char *vqp, unsigned char *vpp, vector unsigned char vc, unsi
2525
// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } [[TMP1]], 0
2626
// CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[RESP:%.*]], align 16
2727
// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } [[TMP1]], 1
28-
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[RESP]], i64 16
28+
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw i8, ptr [[RESP]], i64 16
2929
// CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[TMP4]], align 16
3030
// CHECK-NEXT: [[TMP5:%.*]] = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } [[TMP1]], 2
31-
// CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[RESP]], i64 32
31+
// CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[RESP]], i64 32
3232
// CHECK-NEXT: store <16 x i8> [[TMP5]], ptr [[TMP6]], align 16
3333
// CHECK-NEXT: [[TMP7:%.*]] = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } [[TMP1]], 3
34-
// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[RESP]], i64 48
34+
// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw i8, ptr [[RESP]], i64 48
3535
// CHECK-NEXT: store <16 x i8> [[TMP7]], ptr [[TMP8]], align 16
3636
// CHECK-NEXT: ret void
3737
//
@@ -60,7 +60,7 @@ void test3(unsigned char *vqp, unsigned char *vpp, vector unsigned char vc, unsi
6060
// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 0
6161
// CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[RESP:%.*]], align 16
6262
// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 1
63-
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[RESP]], i64 16
63+
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw i8, ptr [[RESP]], i64 16
6464
// CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[TMP4]], align 16
6565
// CHECK-NEXT: ret void
6666
//
@@ -1072,7 +1072,7 @@ void test76(unsigned char *vqp, unsigned char *vpp, vector unsigned char vc, uns
10721072
// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 0
10731073
// CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[RESP:%.*]], align 16
10741074
// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 1
1075-
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[RESP]], i64 16
1075+
// CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw i8, ptr [[RESP]], i64 16
10761076
// CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[TMP4]], align 16
10771077
// CHECK-NEXT: ret void
10781078
//

Diff for: clang/test/CodeGen/SystemZ/zos-mixed-ptr-sizes.c

+14-14
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,21 @@ void test_indexing(struct Foo *f) {
4848

4949
void test_indexing_2(struct Foo *f) {
5050
// X64-LABEL: define void @test_indexing_2(ptr noundef initializes((16, 24)) %f)
51-
// X64: getelementptr inbounds i8, ptr addrspace(1) {{%[0-9]}}, i32 16
52-
// X64: getelementptr inbounds i8, ptr {{%[0-9]}}, i64 24
51+
// X64: getelementptr inbounds nuw i8, ptr addrspace(1) {{%[0-9]}}, i32 16
52+
// X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 24
5353
f->cp64 = ((char *** __ptr32 *)1028)[1][2][3];
5454
use_foo(f);
5555
}
5656

5757
unsigned long* test_misc() {
5858
// X64-LABEL: define ptr @test_misc()
59-
// X64: %arrayidx = getelementptr inbounds i8, ptr addrspace(1) %0, i32 88
59+
// X64: %arrayidx = getelementptr inbounds nuw i8, ptr addrspace(1) %0, i32 88
6060
// X64-NEXT: %1 = load ptr, ptr addrspace(1) %arrayidx
61-
// X64-NEXT: %arrayidx1 = getelementptr inbounds i8, ptr %1, i64 8
61+
// X64-NEXT: %arrayidx1 = getelementptr inbounds nuw i8, ptr %1, i64 8
6262
// X64-NEXT: %2 = load ptr, ptr %arrayidx1
63-
// X64-NEXT: %arrayidx2 = getelementptr inbounds i8, ptr %2, i64 904
63+
// X64-NEXT: %arrayidx2 = getelementptr inbounds nuw i8, ptr %2, i64 904
6464
// X64-NEXT: %3 = load ptr, ptr %arrayidx2
65-
// X64-NEXT: %arrayidx3 = getelementptr inbounds i8, ptr %3, i64 1192
65+
// X64-NEXT: %arrayidx3 = getelementptr inbounds nuw i8, ptr %3, i64 1192
6666
unsigned long* x = (unsigned long*)((char***** __ptr32*)1208)[0][11][1][113][149];
6767
return x;
6868
}
@@ -71,9 +71,9 @@ char* __ptr32* __ptr32 test_misc_2() {
7171
// X64-LABEL: define ptr addrspace(1) @test_misc_2()
7272
// X64: br i1 %cmp, label %if.then, label %if.end
7373
// X64: %1 = load ptr addrspace(1), ptr inttoptr (i64 16 to ptr)
74-
// X64-NEXT: %arrayidx = getelementptr inbounds i8, ptr addrspace(1) %1, i32 544
74+
// X64-NEXT: %arrayidx = getelementptr inbounds nuw i8, ptr addrspace(1) %1, i32 544
7575
// X64-NEXT: %2 = load ptr addrspace(1), ptr addrspace(1) %arrayidx
76-
// X64-NEXT: %arrayidx1 = getelementptr inbounds i8, ptr addrspace(1) %2, i32 24
76+
// X64-NEXT: %arrayidx1 = getelementptr inbounds nuw i8, ptr addrspace(1) %2, i32 24
7777
// X64-NEXT: %3 = load ptr addrspace(1), ptr addrspace(1) %arrayidx1
7878
// X64-NEXT: store ptr addrspace(1) %3, ptr @test_misc_2.res
7979
// X64: ret ptr addrspace(1)
@@ -88,7 +88,7 @@ unsigned short test_misc_3() {
8888
// X64-LABEL: define zeroext i16 @test_misc_3()
8989
// X64: %0 = load ptr addrspace(1), ptr inttoptr (i64 548 to ptr)
9090
// X64-NEXT: %1 = addrspacecast ptr addrspace(1) %0 to ptr
91-
// X64-NEXT: %arrayidx = getelementptr inbounds i8, ptr %1, i64 36
91+
// X64-NEXT: %arrayidx = getelementptr inbounds nuw i8, ptr %1, i64 36
9292
// X64-NEXT: %2 = load i16, ptr %arrayidx, align 2
9393
// X64-NEXT: ret i16 %2
9494
unsigned short this_asid = ((unsigned short*)(*(char* __ptr32*)(0x224)))[18];
@@ -97,10 +97,10 @@ unsigned short test_misc_3() {
9797

9898
int test_misc_4() {
9999
// X64-LABEL: define signext range(i32 0, 2) i32 @test_misc_4()
100-
// X64: getelementptr inbounds i8, ptr addrspace(1) {{%[0-9]}}, i32 88
101-
// X64: getelementptr inbounds i8, ptr {{%[0-9]}}, i64 8
102-
// X64: getelementptr inbounds i8, ptr {{%[0-9]}}, i64 984
103-
// X64: getelementptr inbounds i8, ptr %3, i64 80
100+
// X64: getelementptr inbounds nuw i8, ptr addrspace(1) {{%[0-9]}}, i32 88
101+
// X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 8
102+
// X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 984
103+
// X64: getelementptr inbounds nuw i8, ptr %3, i64 80
104104
// X64: icmp sgt i32 {{.*[0-9]}}, 67240703
105105
// X64: ret i32
106106
int a = (*(int*)(80 + ((char**** __ptr32*)1208)[0][11][1][123]) > 0x040202FF);
@@ -189,7 +189,7 @@ int test_function_ptr32_is_32bit() {
189189
int get_processor_count() {
190190
// X64-LABEL: define signext range(i32 -128, 128) i32 @get_processor_count()
191191
// X64: load ptr addrspace(1), ptr inttoptr (i64 16 to ptr)
192-
// X64-NEXT: [[ARR_IDX1:%[a-z].*]] = getelementptr inbounds i8, ptr addrspace(1) %0, i32 660
192+
// X64-NEXT: [[ARR_IDX1:%[a-z].*]] = getelementptr inbounds nuw i8, ptr addrspace(1) %0, i32 660
193193
// X64: load ptr addrspace(1), ptr addrspace(1) [[ARR_IDX1]]
194194
// X64: load i8, ptr addrspace(1) {{%[a-z].*}}
195195
// X64: sext i8 {{%[0-9]}} to i32

Diff for: clang/test/CodeGen/arm64_32-vaarg.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ typedef struct {
1010
int test_int(OneInt input, va_list *mylist) {
1111
// CHECK-LABEL: define{{.*}} i32 @test_int(i32 %input
1212
// CHECK: [[START:%.*]] = load ptr, ptr %mylist
13-
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[START]], i32 4
13+
// CHECK: [[NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[START]], i32 4
1414
// CHECK: store ptr [[NEXT]], ptr %mylist
1515

1616
// CHECK: [[RES:%.*]] = load i32, ptr [[START]]
@@ -28,9 +28,9 @@ typedef struct {
2828
long long test_longlong(OneLongLong input, va_list *mylist) {
2929
// CHECK-LABEL: define{{.*}} i64 @test_longlong(i64 %input
3030
// CHECK: [[STARTPTR:%.*]] = load ptr, ptr %mylist
31-
// CHECK: [[ALIGN_TMP:%.+]] = getelementptr inbounds i8, ptr [[STARTPTR]], i32 7
31+
// CHECK: [[ALIGN_TMP:%.+]] = getelementptr inbounds nuw i8, ptr [[STARTPTR]], i32 7
3232
// CHECK: [[ALIGNED_ADDR:%.+]] = tail call align 8 ptr @llvm.ptrmask.p0.i32(ptr nonnull [[ALIGN_TMP]], i32 -8)
33-
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[ALIGNED_ADDR]], i32 8
33+
// CHECK: [[NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[ALIGNED_ADDR]], i32 8
3434
// CHECK: store ptr [[NEXT]], ptr %mylist
3535

3636
// CHECK: [[RES:%.*]] = load i64, ptr [[ALIGNED_ADDR]]
@@ -49,7 +49,7 @@ float test_hfa(va_list *mylist) {
4949
// CHECK-LABEL: define{{.*}} float @test_hfa
5050
// CHECK: [[START:%.*]] = load ptr, ptr %mylist
5151

52-
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[START]], i32 16
52+
// CHECK: [[NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[START]], i32 16
5353
// CHECK: store ptr [[NEXT]], ptr %mylist
5454

5555
// CHECK: [[RES:%.*]] = load float, ptr [[START]]
@@ -76,7 +76,7 @@ typedef struct {
7676
long long test_bigstruct(BigStruct input, va_list *mylist) {
7777
// CHECK-LABEL: define{{.*}} i64 @test_bigstruct(ptr
7878
// CHECK: [[START:%.*]] = load ptr, ptr %mylist
79-
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[START]], i32 4
79+
// CHECK: [[NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[START]], i32 4
8080
// CHECK: store ptr [[NEXT]], ptr %mylist
8181

8282
// CHECK: [[ADDR:%.*]] = load ptr, ptr [[START]]
@@ -97,7 +97,7 @@ short test_threeshorts(ThreeShorts input, va_list *mylist) {
9797
// CHECK-LABEL: define{{.*}} signext i16 @test_threeshorts([2 x i32] %input
9898

9999
// CHECK: [[START:%.*]] = load ptr, ptr %mylist
100-
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[START]], i32 8
100+
// CHECK: [[NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[START]], i32 8
101101
// CHECK: store ptr [[NEXT]], ptr %mylist
102102

103103
// CHECK: [[RES:%.*]] = load i16, ptr [[START]]

Diff for: clang/test/CodeGen/attr-counted-by-pr110385.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void init(void * __attribute__((pass_dynamic_object_size(0))));
3131
// CHECK-NEXT: [[GROWABLE:%.*]] = getelementptr inbounds nuw i8, ptr [[FOO]], i64 8
3232
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[GROWABLE]], align 8, !tbaa [[TBAA2:![0-9]+]]
3333
// CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0]], i64 12
34-
// CHECK-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 8
34+
// CHECK-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0]], i64 8
3535
// CHECK-NEXT: [[DOT_COUNTED_BY_LOAD:%.*]] = load i32, ptr [[DOT_COUNTED_BY_GEP]], align 4
3636
// CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[DOT_COUNTED_BY_LOAD]] to i64
3737
// CHECK-NEXT: [[TMP2:%.*]] = shl nsw i64 [[TMP1]], 1
@@ -48,7 +48,7 @@ void test1(struct bucket *foo) {
4848
// CHECK-SAME: ptr noundef [[FOO:%.*]]) local_unnamed_addr #[[ATTR0]] {
4949
// CHECK-NEXT: entry:
5050
// CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[FOO]], i64 16
51-
// CHECK-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[FOO]], i64 12
51+
// CHECK-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[FOO]], i64 12
5252
// CHECK-NEXT: [[DOT_COUNTED_BY_LOAD:%.*]] = load i32, ptr [[DOT_COUNTED_BY_GEP]], align 4
5353
// CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[DOT_COUNTED_BY_LOAD]] to i64
5454
// CHECK-NEXT: [[TMP1:%.*]] = shl nsw i64 [[TMP0]], 1

0 commit comments

Comments
 (0)