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