Skip to content

Commit 41f2f1f

Browse files
committed
[SCCP] Add tests for non-null pointers (NFC)
1 parent 06ccd32 commit 41f2f1f

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=sccp < %s | FileCheck %s
3+
4+
define i1 @test_no_attr(ptr %p) {
5+
; CHECK-LABEL: define i1 @test_no_attr(
6+
; CHECK-SAME: ptr [[P:%.*]]) {
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[P]], null
8+
; CHECK-NEXT: ret i1 [[CMP]]
9+
;
10+
%cmp = icmp ne ptr %p, null
11+
ret i1 %cmp
12+
}
13+
14+
define i1 @test_nonnull(ptr nonnull %p) {
15+
; CHECK-LABEL: define i1 @test_nonnull(
16+
; CHECK-SAME: ptr nonnull [[P:%.*]]) {
17+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[P]], null
18+
; CHECK-NEXT: ret i1 [[CMP]]
19+
;
20+
%cmp = icmp ne ptr %p, null
21+
ret i1 %cmp
22+
}
23+
24+
define i1 @test_nonnull_eq(ptr nonnull %p) {
25+
; CHECK-LABEL: define i1 @test_nonnull_eq(
26+
; CHECK-SAME: ptr nonnull [[P:%.*]]) {
27+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], null
28+
; CHECK-NEXT: ret i1 [[CMP]]
29+
;
30+
%cmp = icmp eq ptr %p, null
31+
ret i1 %cmp
32+
}
33+
34+
define i1 @test_dereferenceable(ptr dereferenceable(4) %p) {
35+
; CHECK-LABEL: define i1 @test_dereferenceable(
36+
; CHECK-SAME: ptr dereferenceable(4) [[P:%.*]]) {
37+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[P]], null
38+
; CHECK-NEXT: ret i1 [[CMP]]
39+
;
40+
%cmp = icmp ne ptr %p, null
41+
ret i1 %cmp
42+
}
43+
44+
define i1 @test_gep_no_flags(ptr nonnull %p, i64 %x) {
45+
; CHECK-LABEL: define i1 @test_gep_no_flags(
46+
; CHECK-SAME: ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
47+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
48+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[GEP]], null
49+
; CHECK-NEXT: ret i1 [[CMP]]
50+
;
51+
%gep = getelementptr i8, ptr %p, i64 %x
52+
%cmp = icmp ne ptr %gep, null
53+
ret i1 %cmp
54+
}
55+
56+
define i1 @test_gep_nuw(ptr nonnull %p, i64 %x) {
57+
; CHECK-LABEL: define i1 @test_gep_nuw(
58+
; CHECK-SAME: ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
59+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[X]]
60+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[GEP]], null
61+
; CHECK-NEXT: ret i1 [[CMP]]
62+
;
63+
%gep = getelementptr nuw i8, ptr %p, i64 %x
64+
%cmp = icmp ne ptr %gep, null
65+
ret i1 %cmp
66+
}
67+
68+
define i1 @test_gep_inbounds(ptr nonnull %p, i64 %x) {
69+
; CHECK-LABEL: define i1 @test_gep_inbounds(
70+
; CHECK-SAME: ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
71+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[X]]
72+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[GEP]], null
73+
; CHECK-NEXT: ret i1 [[CMP]]
74+
;
75+
%gep = getelementptr inbounds i8, ptr %p, i64 %x
76+
%cmp = icmp ne ptr %gep, null
77+
ret i1 %cmp
78+
}
79+
80+
define i1 @test_gep_inbounds_null_pointer_valid(ptr nonnull %p, i64 %x) null_pointer_is_valid {
81+
; CHECK-LABEL: define i1 @test_gep_inbounds_null_pointer_valid(
82+
; CHECK-SAME: ptr nonnull [[P:%.*]], i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
83+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[X]]
84+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[GEP]], null
85+
; CHECK-NEXT: ret i1 [[CMP]]
86+
;
87+
%gep = getelementptr inbounds i8, ptr %p, i64 %x
88+
%cmp = icmp ne ptr %gep, null
89+
ret i1 %cmp
90+
}
91+
92+
define i1 @test_select(i1 %c, ptr nonnull %p, i64 %x) {
93+
; CHECK-LABEL: define i1 @test_select(
94+
; CHECK-SAME: i1 [[C:%.*]], ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
95+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[X]]
96+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], ptr [[P]], ptr [[GEP]]
97+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[SEL]], null
98+
; CHECK-NEXT: ret i1 [[CMP]]
99+
;
100+
%gep = getelementptr nuw i8, ptr %p, i64 %x
101+
%sel = select i1 %c, ptr %p, ptr %gep
102+
%cmp = icmp ne ptr %sel, null
103+
ret i1 %cmp
104+
}
105+
106+
define i1 @test_select_not_nuw(i1 %c, ptr nonnull %p, i64 %x) {
107+
; CHECK-LABEL: define i1 @test_select_not_nuw(
108+
; CHECK-SAME: i1 [[C:%.*]], ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
109+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
110+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], ptr [[P]], ptr [[GEP]]
111+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[SEL]], null
112+
; CHECK-NEXT: ret i1 [[CMP]]
113+
;
114+
%gep = getelementptr i8, ptr %p, i64 %x
115+
%sel = select i1 %c, ptr %p, ptr %gep
116+
%cmp = icmp ne ptr %sel, null
117+
ret i1 %cmp
118+
}
119+
120+
define i1 @test_phi(i1 %c, ptr nonnull %p, i64 %x) {
121+
; CHECK-LABEL: define i1 @test_phi(
122+
; CHECK-SAME: i1 [[C:%.*]], ptr nonnull [[P:%.*]], i64 [[X:%.*]]) {
123+
; CHECK-NEXT: [[ENTRY:.*]]:
124+
; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]]
125+
; CHECK: [[IF]]:
126+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[X]]
127+
; CHECK-NEXT: br label %[[JOIN]]
128+
; CHECK: [[JOIN]]:
129+
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[P]], %[[ENTRY]] ], [ [[GEP]], %[[IF]] ]
130+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[PHI]], null
131+
; CHECK-NEXT: ret i1 [[CMP]]
132+
;
133+
entry:
134+
br i1 %c, label %if, label %join
135+
136+
if:
137+
%gep = getelementptr nuw i8, ptr %p, i64 %x
138+
br label %join
139+
140+
join:
141+
%phi = phi ptr [ %p, %entry ], [ %gep, %if ]
142+
%cmp = icmp ne ptr %phi, null
143+
ret i1 %cmp
144+
}

0 commit comments

Comments
 (0)