xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll (revision fbcf8a8cbb2461730bfd0603b396842925a88ef2)
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
4cb3b5f07SFlorian Hahn%struct.1 = type { i32, i64, i8 }
5c5e1ddb6SFlorian Hahn%struct.2 = type { i32, [20 x i64], i8 }
6cb3b5f07SFlorian Hahn
7c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension(ptr %start, ptr %high) {
8cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension(
9cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
10c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 6, i32 0
11c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
12c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
13cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
14cb3b5f07SFlorian Hahn; CHECK:       if.then:
15c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 0
16c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
17572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
18cb3b5f07SFlorian Hahn; CHECK:       if.end:
19cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
20cb3b5f07SFlorian Hahn;
21cb3b5f07SFlorian Hahnentry:
22c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 6, i32 0
23c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
24c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
25cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
26cb3b5f07SFlorian Hahn
27c5e1ddb6SFlorian Hahnif.then:
28c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 0
29c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
30c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
31cb3b5f07SFlorian Hahn  ret i1 %c.0
32cb3b5f07SFlorian Hahn
33c5e1ddb6SFlorian Hahnif.end:
34c5e1ddb6SFlorian Hahn  ret i1 true
35cb3b5f07SFlorian Hahn}
36cb3b5f07SFlorian Hahn
37c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.0(ptr %start, ptr %high, i32 %idx) {
38cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.0(
39cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
40cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
41cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
42c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0
43c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
44c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
45cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
46cb3b5f07SFlorian Hahn; CHECK:       if.then:
47cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
48c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 0
49c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
50572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
51cb3b5f07SFlorian Hahn; CHECK:       if.end:
52cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
53cb3b5f07SFlorian Hahn;
54cb3b5f07SFlorian Hahnentry:
55cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
56cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
57c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0
58c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
59c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
60cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
61cb3b5f07SFlorian Hahn
62c5e1ddb6SFlorian Hahnif.then:
63cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
64c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 0
65c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
66c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
67cb3b5f07SFlorian Hahn  ret i1 %c.0
68cb3b5f07SFlorian Hahn
69c5e1ddb6SFlorian Hahnif.end:
70c5e1ddb6SFlorian Hahn  ret i1 true
71cb3b5f07SFlorian Hahn}
72cb3b5f07SFlorian Hahn
73c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.1(ptr %start, ptr %high, i32 %idx) {
74cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.1(
75cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
76cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
77cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
78c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0
79c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
80c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
81cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
82cb3b5f07SFlorian Hahn; CHECK:       if.then:
83cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
84c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 1
85c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
86572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
87cb3b5f07SFlorian Hahn; CHECK:       if.end:
88cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
89cb3b5f07SFlorian Hahn;
90cb3b5f07SFlorian Hahnentry:
91cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
92cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
93c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0
94c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
95c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
96cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
97cb3b5f07SFlorian Hahn
98c5e1ddb6SFlorian Hahnif.then:
99cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
100c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1
101c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
102c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
103cb3b5f07SFlorian Hahn  ret i1 %c.0
104cb3b5f07SFlorian Hahn
105c5e1ddb6SFlorian Hahnif.end:
106c5e1ddb6SFlorian Hahn  ret i1 true
107cb3b5f07SFlorian Hahn}
108cb3b5f07SFlorian Hahn
109c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.2(ptr %start, ptr %high, i32 %idx) {
110cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.2(
111cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
112cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
113cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
114c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0
115c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
116c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
117cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
118cb3b5f07SFlorian Hahn; CHECK:       if.then:
119cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
120c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 2
121572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
122cb3b5f07SFlorian Hahn; CHECK:       if.end:
123cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
124cb3b5f07SFlorian Hahn;
125cb3b5f07SFlorian Hahnentry:
126cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
127cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
128c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0
129c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
130c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
131cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
132cb3b5f07SFlorian Hahn
133c5e1ddb6SFlorian Hahnif.then:
134cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
135c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 2
136c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0, %high
137cb3b5f07SFlorian Hahn  ret i1 %c.0
138cb3b5f07SFlorian Hahn
139c5e1ddb6SFlorian Hahnif.end:
140c5e1ddb6SFlorian Hahn  ret i1 true
141cb3b5f07SFlorian Hahn}
142cb3b5f07SFlorian Hahn
143c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.first.dimension(ptr %start, ptr %high) {
144cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.first.dimension(
145cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
146c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 0
147c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
148c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
149cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
150cb3b5f07SFlorian Hahn; CHECK:       if.then:
151c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 6, i32 0
152c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
153c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]]
154cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_0]]
155cb3b5f07SFlorian Hahn; CHECK:       if.end:
156cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
157cb3b5f07SFlorian Hahn;
158cb3b5f07SFlorian Hahnentry:
159c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 0
160c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
161c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
162cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
163cb3b5f07SFlorian Hahn
164c5e1ddb6SFlorian Hahnif.then:
165c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 6, i32 0
166c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
167c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
168cb3b5f07SFlorian Hahn  ret i1 %c.0
169cb3b5f07SFlorian Hahn
170c5e1ddb6SFlorian Hahnif.end:
171c5e1ddb6SFlorian Hahn  ret i1 true
172cb3b5f07SFlorian Hahn}
173cb3b5f07SFlorian Hahn
174c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.second.dimension(ptr %start, ptr %high) {
175cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.second.dimension(
176cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
177c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 2
178c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR]], [[HIGH:%.*]]
179cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
180cb3b5f07SFlorian Hahn; CHECK:       if.then:
181c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 1
182c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
183572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
184cb3b5f07SFlorian Hahn; CHECK:       if.end:
185cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
186cb3b5f07SFlorian Hahn;
187cb3b5f07SFlorian Hahnentry:
188c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2
189c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr, %high
190cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
191cb3b5f07SFlorian Hahn
192c5e1ddb6SFlorian Hahnif.then:
193c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 1
194c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
195c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
196cb3b5f07SFlorian Hahn  ret i1 %c.0
197cb3b5f07SFlorian Hahn
198c5e1ddb6SFlorian Hahnif.end:
199c5e1ddb6SFlorian Hahn  ret i1 true
200cb3b5f07SFlorian Hahn}
201cb3b5f07SFlorian Hahn
202c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension(ptr %start, ptr %high) {
203cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension(
204cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
205c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 2
206c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR]], [[HIGH:%.*]]
207cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
208cb3b5f07SFlorian Hahn; CHECK:       if.then:
209c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 2
210c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
211cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_0]]
212cb3b5f07SFlorian Hahn; CHECK:       if.end:
213cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
214cb3b5f07SFlorian Hahn;
215cb3b5f07SFlorian Hahnentry:
216c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2
217c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr, %high
218cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
219cb3b5f07SFlorian Hahn
220c5e1ddb6SFlorian Hahnif.then:
221c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2
222c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0, %high
223cb3b5f07SFlorian Hahn  ret i1 %c.0
224cb3b5f07SFlorian Hahn
225c5e1ddb6SFlorian Hahnif.end:
226c5e1ddb6SFlorian Hahn  ret i1 true
227cb3b5f07SFlorian Hahn}
228cb3b5f07SFlorian Hahn
229c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension.var.index.0(ptr %start, ptr %high, i32 %idx) {
230cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension.var.index.0(
231cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
232cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX:%.*]] to i64
233c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT]], i32 0
234c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
235c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
236cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
237cb3b5f07SFlorian Hahn; CHECK:       if.then:
238c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 1
239c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
240c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]]
241cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_0]]
242cb3b5f07SFlorian Hahn; CHECK:       if.end:
243cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
244cb3b5f07SFlorian Hahn;
245cb3b5f07SFlorian Hahnentry:
246cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
247c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 0
248c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
249c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
250cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
251cb3b5f07SFlorian Hahn
252c5e1ddb6SFlorian Hahnif.then:
253c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1
254c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
255c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
256cb3b5f07SFlorian Hahn  ret i1 %c.0
257cb3b5f07SFlorian Hahn
258c5e1ddb6SFlorian Hahnif.end:
259c5e1ddb6SFlorian Hahn  ret i1 true
260cb3b5f07SFlorian Hahn}
261cb3b5f07SFlorian Hahn
262c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension.var.index.1(ptr %start, ptr %high, i32 %idx) {
263cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension.var.index.1(
264cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
265cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX:%.*]] to i64
266c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT]], i32 1
267c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
268c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
269cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
270cb3b5f07SFlorian Hahn; CHECK:       if.then:
271c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 2
272c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
273cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_0]]
274cb3b5f07SFlorian Hahn; CHECK:       if.end:
275cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
276cb3b5f07SFlorian Hahn;
277cb3b5f07SFlorian Hahnentry:
278cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
279c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1
280c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
281c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
282cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
283cb3b5f07SFlorian Hahn
284c5e1ddb6SFlorian Hahnif.then:
285c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 2
286c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0, %high
287cb3b5f07SFlorian Hahn  ret i1 %c.0
288cb3b5f07SFlorian Hahn
289c5e1ddb6SFlorian Hahnif.end:
290c5e1ddb6SFlorian Hahn  ret i1 true
291cb3b5f07SFlorian Hahn}
292cb3b5f07SFlorian Hahn
293c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.true.due.to.first.dimension(ptr %start, ptr %high) {
294cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.true.due.to.first.dimension(
295cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
296c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i32 5
297c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
298c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
299cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
300cb3b5f07SFlorian Hahn; CHECK:       if.then:
301c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0
302c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
303572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
304cb3b5f07SFlorian Hahn; CHECK:       if.end:
305cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
306cb3b5f07SFlorian Hahn;
307cb3b5f07SFlorian Hahnentry:
308c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i32 5
309c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
310c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
311cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
312cb3b5f07SFlorian Hahn
313c5e1ddb6SFlorian Hahnif.then:
314c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 0
315c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
316c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
317cb3b5f07SFlorian Hahn  ret i1 %c.0
318cb3b5f07SFlorian Hahn
319c5e1ddb6SFlorian Hahnif.end:
320c5e1ddb6SFlorian Hahn  ret i1 true
321cb3b5f07SFlorian Hahn}
322cb3b5f07SFlorian Hahn
323c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.true.due.to.third.dimension.var.index(ptr %start, ptr %high, i32 %idx) {
324cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.true.due.to.third.dimension.var.index(
325cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
326cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
327cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
328c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]]
329c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
330c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
331cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
332cb3b5f07SFlorian Hahn; CHECK:       if.then:
333cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
334c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 1, i64 [[IDX_EXT]]
335c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
336572d5d37SFlorian Hahn; CHECK-NEXT:    ret i1 true
337cb3b5f07SFlorian Hahn; CHECK:       if.end:
338cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
339cb3b5f07SFlorian Hahn;
340cb3b5f07SFlorian Hahnentry:
341cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
342cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
343c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext
344c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
345c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
346cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
347cb3b5f07SFlorian Hahn
348c5e1ddb6SFlorian Hahnif.then:
349cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
350c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext
351c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
352c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
353cb3b5f07SFlorian Hahn  ret i1 %c.0
354cb3b5f07SFlorian Hahn
355c5e1ddb6SFlorian Hahnif.end:
356c5e1ddb6SFlorian Hahn  ret i1 true
357cb3b5f07SFlorian Hahn}
358cb3b5f07SFlorian Hahn
359c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.due.to.second.dimension.var.index(ptr %start, ptr %high, i32 %idx) {
360cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.due.to.second.dimension.var.index(
361cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
362cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
363cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
364c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]]
365c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
366c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
367cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
368cb3b5f07SFlorian Hahn; CHECK:       if.then:
369cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
370c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0
371c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
372*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
373cb3b5f07SFlorian Hahn; CHECK:       if.end:
374cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
375cb3b5f07SFlorian Hahn;
376cb3b5f07SFlorian Hahnentry:
377cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
378cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
379c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext
380c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
381c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
382cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
383cb3b5f07SFlorian Hahn
384c5e1ddb6SFlorian Hahnif.then:
385cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
386c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 0
387c5e1ddb6SFlorian Hahn  %start.0.cast = bitcast ptr %start.0 to ptr
388c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0.cast, %high
389cb3b5f07SFlorian Hahn  ret i1 %c.0
390cb3b5f07SFlorian Hahn
391c5e1ddb6SFlorian Hahnif.end:
392c5e1ddb6SFlorian Hahn  ret i1 true
393cb3b5f07SFlorian Hahn}
394cb3b5f07SFlorian Hahn
395c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.unknown.due.to.second.dimension.var.index(ptr %start, ptr %high, i32 %idx) {
396cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.unknown.due.to.second.dimension.var.index(
397cb3b5f07SFlorian Hahn; CHECK-NEXT:  entry:
398cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1
399cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64
400c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]]
401c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr
402c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]]
403cb3b5f07SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
404cb3b5f07SFlorian Hahn; CHECK:       if.then:
405cb3b5f07SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
406c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 2
407c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]
408cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_0]]
409cb3b5f07SFlorian Hahn; CHECK:       if.end:
410cb3b5f07SFlorian Hahn; CHECK-NEXT:    ret i1 true
411cb3b5f07SFlorian Hahn;
412cb3b5f07SFlorian Hahnentry:
413cb3b5f07SFlorian Hahn  %idx.ext.plus.1 = add nuw nsw i32 %idx, 1
414cb3b5f07SFlorian Hahn  %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64
415c5e1ddb6SFlorian Hahn  %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext
416c5e1ddb6SFlorian Hahn  %add.ptr.cast = bitcast ptr %add.ptr to ptr
417c5e1ddb6SFlorian Hahn  %c.1 = icmp ule ptr %add.ptr.cast, %high
418cb3b5f07SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
419cb3b5f07SFlorian Hahn
420c5e1ddb6SFlorian Hahnif.then:
421cb3b5f07SFlorian Hahn  %idx.ext = zext i32 %idx to i64
422c5e1ddb6SFlorian Hahn  %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 2
423c5e1ddb6SFlorian Hahn  %c.0 = icmp ult ptr %start.0, %high
424cb3b5f07SFlorian Hahn  ret i1 %c.0
425cb3b5f07SFlorian Hahn
426c5e1ddb6SFlorian Hahnif.end:
427c5e1ddb6SFlorian Hahn  ret i1 true
428cb3b5f07SFlorian Hahn}
429