xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-arrays.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4define void @pointer.to.array.test.ult.true.due.to.first.dimension(ptr %start, ptr %high) {
5; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.first.dimension(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 9, i64 3
8; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]
9; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
10; CHECK:       if.then:
11; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 0
12; CHECK-NEXT:    call void @use(i1 true)
13; CHECK-NEXT:    ret void
14; CHECK:       if.end:
15; CHECK-NEXT:    ret void
16;
17entry:
18  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 9, i64 3
19  %c.1 = icmp ule ptr %add.ptr.i, %high
20  br i1 %c.1, label %if.then, label %if.end
21
22if.then:                                          ; preds = %entry
23  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0
24  %c.0 = icmp ult ptr %start.0, %high
25  call void @use(i1 %c.0)
26  ret void
27
28if.end:                                           ; preds = %entry
29  ret void
30}
31
32define void @pointer.to.array.test.ult.unknown.due.to.first.dimension(ptr %start, ptr %high) {
33; CHECK-LABEL: @pointer.to.array.test.ult.unknown.due.to.first.dimension(
34; CHECK-NEXT:  entry:
35; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 3
36; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]
37; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
38; CHECK:       if.then:
39; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0
40; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
41; CHECK-NEXT:    call void @use(i1 [[C_0]])
42; CHECK-NEXT:    ret void
43; CHECK:       if.end:
44; CHECK-NEXT:    ret void
45;
46entry:
47  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 3
48  %c.1 = icmp ule ptr %add.ptr.i, %high
49  br i1 %c.1, label %if.then, label %if.end
50
51if.then:                                          ; preds = %entry
52  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0
53  %c.0 = icmp ult ptr %start.0, %high
54  call void @use(i1 %c.0)
55  ret void
56
57if.end:                                           ; preds = %entry
58  ret void
59}
60
61define void @pointer.to.array.test.ult.true.due.to.second.dimension(ptr %start, ptr %high) {
62; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.second.dimension(
63; CHECK-NEXT:  entry:
64; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 1
65; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]
66; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
67; CHECK:       if.then:
68; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 0
69; CHECK-NEXT:    call void @use(i1 true)
70; CHECK-NEXT:    ret void
71; CHECK:       if.end:
72; CHECK-NEXT:    ret void
73;
74entry:
75  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1
76  %c.1 = icmp ule ptr %add.ptr.i, %high
77  br i1 %c.1, label %if.then, label %if.end
78
79if.then:                                          ; preds = %entry
80  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0
81  %c.0 = icmp ult ptr %start.0, %high
82  call void @use(i1 %c.0)
83  ret void
84
85if.end:                                           ; preds = %entry
86  ret void
87}
88
89define void @pointer.to.array.test.ult.unknown.to.second.dimension(ptr %start, ptr %high) {
90; CHECK-LABEL: @pointer.to.array.test.ult.unknown.to.second.dimension(
91; CHECK-NEXT:  entry:
92; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 0
93; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]
94; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
95; CHECK:       if.then:
96; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 1
97; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
98; CHECK-NEXT:    call void @use(i1 [[C_0]])
99; CHECK-NEXT:    ret void
100; CHECK:       if.end:
101; CHECK-NEXT:    ret void
102;
103entry:
104  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0
105  %c.1 = icmp ule ptr %add.ptr.i, %high
106  br i1 %c.1, label %if.then, label %if.end
107
108if.then:                                          ; preds = %entry
109  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1
110  %c.0 = icmp ult ptr %start.0, %high
111  call void @use(i1 %c.0)
112  ret void
113
114if.end:                                           ; preds = %entry
115  ret void
116}
117
118define void @pointer.to.array.test.not.uge.ult(ptr %start, ptr %high) {
119; CHECK-LABEL: @pointer.to.array.test.not.uge.ult(
120; CHECK-NEXT:  entry:
121; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3
122; CHECK-NEXT:    [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
123; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
124; CHECK:       if.then:
125; CHECK-NEXT:    ret void
126; CHECK:       if.end:
127; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0
128; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
129; CHECK-NEXT:    call void @use(i1 [[C_0]])
130; CHECK-NEXT:    ret void
131;
132entry:
133  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3
134  %c.1 = icmp uge ptr %add.ptr.i, %high
135  br i1 %c.1, label %if.then, label %if.end
136
137if.then:                                          ; preds = %entry
138  ret void
139
140if.end:                                           ; preds = %entry
141  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0
142  %c.0 = icmp ult ptr %start.0, %high
143  call void @use(i1 %c.0)
144  ret void
145}
146
147define void @pointer.to.array.test.not.uge.ule(ptr %start, ptr %high) {
148; CHECK-LABEL: @pointer.to.array.test.not.uge.ule(
149; CHECK-NEXT:  entry:
150; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3
151; CHECK-NEXT:    [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
152; CHECK-NEXT:    br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
153; CHECK:       if.then:
154; CHECK-NEXT:    ret void
155; CHECK:       if.end:
156; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0
157; CHECK-NEXT:    [[C_0:%.*]] = icmp ule ptr [[START_0]], [[HIGH]]
158; CHECK-NEXT:    call void @use(i1 [[C_0]])
159; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 2, i64 1
160; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[START_1]], [[HIGH]]
161; CHECK-NEXT:    call void @use(i1 [[C_1]])
162; CHECK-NEXT:    ret void
163;
164entry:
165  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3
166  %c = icmp uge ptr %add.ptr.i, %high
167  br i1 %c, label %if.then, label %if.end
168
169if.then:                                          ; preds = %entry
170  ret void
171
172if.end:                                           ; preds = %entry
173  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0
174  %c.0 = icmp ule ptr %start.0, %high
175  call void @use(i1 %c.0)
176  %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 2, i64 1
177  %c.1 = icmp ule ptr %start.1, %high
178  call void @use(i1 %c.1)
179  ret void
180}
181
182define void @pointer.to.array.test.not.uge.ugt(ptr %start, ptr %high) {
183; CHECK-LABEL: @pointer.to.array.test.not.uge.ugt(
184; CHECK-NEXT:  entry:
185; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3
186; CHECK-NEXT:    [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
187; CHECK-NEXT:    br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
188; CHECK:       if.then:
189; CHECK-NEXT:    ret void
190; CHECK:       if.end:
191; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0
192; CHECK-NEXT:    [[C_0:%.*]] = icmp ugt ptr [[START_0]], [[HIGH]]
193; CHECK-NEXT:    call void @use(i1 [[C_0]])
194; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 1
195; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt ptr [[START_1]], [[HIGH]]
196; CHECK-NEXT:    call void @use(i1 [[C_1]])
197; CHECK-NEXT:    ret void
198;
199entry:
200  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3
201  %c = icmp uge ptr %add.ptr.i, %high
202  br i1 %c, label %if.then, label %if.end
203
204if.then:                                          ; preds = %entry
205  ret void
206
207if.end:                                           ; preds = %entry
208  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0
209  %c.0 = icmp ugt ptr %start.0, %high
210  call void @use(i1 %c.0)
211  %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 1
212  %c.1 = icmp ugt ptr %start.1, %high
213  call void @use(i1 %c.1)
214  ret void
215}
216
217define void @pointer.to.array.test.not.uge.uge(ptr %start, ptr %high) {
218; CHECK-LABEL: @pointer.to.array.test.not.uge.uge(
219; CHECK-NEXT:  entry:
220; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3
221; CHECK-NEXT:    [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
222; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
223; CHECK:       if.then:
224; CHECK-NEXT:    ret void
225; CHECK:       if.end:
226; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0
227; CHECK-NEXT:    [[C_0:%.*]] = icmp uge ptr [[START_0]], [[HIGH]]
228; CHECK-NEXT:    call void @use(i1 [[C_0]])
229; CHECK-NEXT:    ret void
230;
231entry:
232  %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3
233  %c.1 = icmp uge ptr %add.ptr.i, %high
234  br i1 %c.1, label %if.then, label %if.end
235
236if.then:                                          ; preds = %entry
237  ret void
238
239if.end:                                           ; preds = %entry
240  %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0
241  %c.0 = icmp uge ptr %start.0, %high
242  call void @use(i1 %c.0)
243  ret void
244}
245
246declare void @use(i1)
247