1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -indvars -S "-data-layout=e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" | FileCheck -check-prefix=PTR64 %s
3; RUN: opt < %s -indvars -S "-data-layout=e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" | FileCheck -check-prefix=PTR32 %s
4;
5; PR11279: Assertion !IVLimit->getType()->isPointerTy()
6;
7; Test LinearFunctionTestReplace of a pointer-type loop counter. Note
8; that BECount may or may not be a pointer type. A pointer type
9; BECount doesn't really make sense, but that's what falls out of
10; SCEV. Since it's an i8*, it has unit stride so we never adjust the
11; SCEV expression in a way that would convert it to an integer type.
12
13define i8 @testnullptrptr(i8* %buf, i8* %end) nounwind {
14; PTR64-LABEL: @testnullptrptr(
15; PTR64-NEXT:    [[END1:%.*]] = ptrtoint i8* [[END:%.*]] to i64
16; PTR64-NEXT:    br label [[LOOPGUARD:%.*]]
17; PTR64:       loopguard:
18; PTR64-NEXT:    [[GUARD:%.*]] = icmp ult i8* null, [[END]]
19; PTR64-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
20; PTR64:       preheader:
21; PTR64-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* null, i64 [[END1]]
22; PTR64-NEXT:    br label [[LOOP:%.*]]
23; PTR64:       loop:
24; PTR64-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ null, [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
25; PTR64-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
26; PTR64-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
27; PTR64-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
28; PTR64-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
29; PTR64:       exit.loopexit:
30; PTR64-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
31; PTR64-NEXT:    br label [[EXIT]]
32; PTR64:       exit:
33; PTR64-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
34; PTR64-NEXT:    ret i8 [[RET]]
35;
36; PTR32-LABEL: @testnullptrptr(
37; PTR32-NEXT:    [[END1:%.*]] = ptrtoint i8* [[END:%.*]] to i32
38; PTR32-NEXT:    br label [[LOOPGUARD:%.*]]
39; PTR32:       loopguard:
40; PTR32-NEXT:    [[GUARD:%.*]] = icmp ult i8* null, [[END]]
41; PTR32-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
42; PTR32:       preheader:
43; PTR32-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* null, i32 [[END1]]
44; PTR32-NEXT:    br label [[LOOP:%.*]]
45; PTR32:       loop:
46; PTR32-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ null, [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
47; PTR32-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
48; PTR32-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
49; PTR32-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
50; PTR32-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
51; PTR32:       exit.loopexit:
52; PTR32-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
53; PTR32-NEXT:    br label [[EXIT]]
54; PTR32:       exit:
55; PTR32-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
56; PTR32-NEXT:    ret i8 [[RET]]
57;
58  br label %loopguard
59
60loopguard:
61  %guard = icmp ult i8* null, %end
62  br i1 %guard, label %preheader, label %exit
63
64preheader:
65  br label %loop
66
67loop:
68  %p.01.us.us = phi i8* [ null, %preheader ], [ %gep, %loop ]
69  %s = phi i8 [0, %preheader], [%snext, %loop]
70  %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1
71  %snext = load i8, i8* %gep
72  %cmp = icmp ult i8* %gep, %end
73  br i1 %cmp, label %loop, label %exit
74
75exit:
76  %ret = phi i8 [0, %loopguard], [%snext, %loop]
77  ret i8 %ret
78}
79
80define i8 @testptrptr(i8* %buf, i8* %end) nounwind {
81; PTR64-LABEL: @testptrptr(
82; PTR64-NEXT:    [[BUF2:%.*]] = ptrtoint i8* [[BUF:%.*]] to i64
83; PTR64-NEXT:    [[END1:%.*]] = ptrtoint i8* [[END:%.*]] to i64
84; PTR64-NEXT:    br label [[LOOPGUARD:%.*]]
85; PTR64:       loopguard:
86; PTR64-NEXT:    [[GUARD:%.*]] = icmp ult i8* [[BUF]], [[END]]
87; PTR64-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
88; PTR64:       preheader:
89; PTR64-NEXT:    [[TMP1:%.*]] = sub i64 [[END1]], [[BUF2]]
90; PTR64-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* [[BUF]], i64 [[TMP1]]
91; PTR64-NEXT:    br label [[LOOP:%.*]]
92; PTR64:       loop:
93; PTR64-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ [[BUF]], [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
94; PTR64-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
95; PTR64-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
96; PTR64-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
97; PTR64-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
98; PTR64:       exit.loopexit:
99; PTR64-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
100; PTR64-NEXT:    br label [[EXIT]]
101; PTR64:       exit:
102; PTR64-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
103; PTR64-NEXT:    ret i8 [[RET]]
104;
105; PTR32-LABEL: @testptrptr(
106; PTR32-NEXT:    [[BUF2:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
107; PTR32-NEXT:    [[END1:%.*]] = ptrtoint i8* [[END:%.*]] to i32
108; PTR32-NEXT:    br label [[LOOPGUARD:%.*]]
109; PTR32:       loopguard:
110; PTR32-NEXT:    [[GUARD:%.*]] = icmp ult i8* [[BUF]], [[END]]
111; PTR32-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
112; PTR32:       preheader:
113; PTR32-NEXT:    [[TMP1:%.*]] = sub i32 [[END1]], [[BUF2]]
114; PTR32-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* [[BUF]], i32 [[TMP1]]
115; PTR32-NEXT:    br label [[LOOP:%.*]]
116; PTR32:       loop:
117; PTR32-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ [[BUF]], [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
118; PTR32-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
119; PTR32-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
120; PTR32-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
121; PTR32-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
122; PTR32:       exit.loopexit:
123; PTR32-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
124; PTR32-NEXT:    br label [[EXIT]]
125; PTR32:       exit:
126; PTR32-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
127; PTR32-NEXT:    ret i8 [[RET]]
128;
129  br label %loopguard
130
131loopguard:
132  %guard = icmp ult i8* %buf, %end
133  br i1 %guard, label %preheader, label %exit
134
135preheader:
136  br label %loop
137
138loop:
139  %p.01.us.us = phi i8* [ %buf, %preheader ], [ %gep, %loop ]
140  %s = phi i8 [0, %preheader], [%snext, %loop]
141  %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1
142  %snext = load i8, i8* %gep
143  %cmp = icmp ult i8* %gep, %end
144  br i1 %cmp, label %loop, label %exit
145
146exit:
147  %ret = phi i8 [0, %loopguard], [%snext, %loop]
148  ret i8 %ret
149}
150
151define i8 @testnullptrint(i8* %buf, i8* %end) nounwind {
152; PTR64-LABEL: @testnullptrint(
153; PTR64-NEXT:    br label [[LOOPGUARD:%.*]]
154; PTR64:       loopguard:
155; PTR64-NEXT:    [[BI:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
156; PTR64-NEXT:    [[EI:%.*]] = ptrtoint i8* [[END:%.*]] to i32
157; PTR64-NEXT:    [[CNT:%.*]] = sub i32 [[EI]], [[BI]]
158; PTR64-NEXT:    [[GUARD:%.*]] = icmp ult i32 0, [[CNT]]
159; PTR64-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
160; PTR64:       preheader:
161; PTR64-NEXT:    [[TMP1:%.*]] = add i32 [[EI]], -1
162; PTR64-NEXT:    [[TMP2:%.*]] = sub i32 [[TMP1]], [[BI]]
163; PTR64-NEXT:    [[TMP3:%.*]] = zext i32 [[TMP2]] to i64
164; PTR64-NEXT:    [[TMP4:%.*]] = add nuw nsw i64 [[TMP3]], 1
165; PTR64-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* null, i64 [[TMP4]]
166; PTR64-NEXT:    br label [[LOOP:%.*]]
167; PTR64:       loop:
168; PTR64-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ null, [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
169; PTR64-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
170; PTR64-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
171; PTR64-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
172; PTR64-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
173; PTR64:       exit.loopexit:
174; PTR64-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
175; PTR64-NEXT:    br label [[EXIT]]
176; PTR64:       exit:
177; PTR64-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
178; PTR64-NEXT:    ret i8 [[RET]]
179;
180; PTR32-LABEL: @testnullptrint(
181; PTR32-NEXT:    br label [[LOOPGUARD:%.*]]
182; PTR32:       loopguard:
183; PTR32-NEXT:    [[BI:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
184; PTR32-NEXT:    [[EI:%.*]] = ptrtoint i8* [[END:%.*]] to i32
185; PTR32-NEXT:    [[CNT:%.*]] = sub i32 [[EI]], [[BI]]
186; PTR32-NEXT:    [[GUARD:%.*]] = icmp ult i32 0, [[CNT]]
187; PTR32-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
188; PTR32:       preheader:
189; PTR32-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* null, i32 [[CNT]]
190; PTR32-NEXT:    br label [[LOOP:%.*]]
191; PTR32:       loop:
192; PTR32-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ null, [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
193; PTR32-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
194; PTR32-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
195; PTR32-NEXT:    [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
196; PTR32-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
197; PTR32:       exit.loopexit:
198; PTR32-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
199; PTR32-NEXT:    br label [[EXIT]]
200; PTR32:       exit:
201; PTR32-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
202; PTR32-NEXT:    ret i8 [[RET]]
203;
204  br label %loopguard
205
206loopguard:
207  %bi = ptrtoint i8* %buf to i32
208  %ei = ptrtoint i8* %end to i32
209  %cnt = sub i32 %ei, %bi
210  %guard = icmp ult i32 0, %cnt
211  br i1 %guard, label %preheader, label %exit
212
213preheader:
214  br label %loop
215
216loop:
217  %p.01.us.us = phi i8* [ null, %preheader ], [ %gep, %loop ]
218  %iv = phi i32 [ 0, %preheader ], [ %ivnext, %loop ]
219  %s = phi i8 [0, %preheader], [%snext, %loop]
220  %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1
221  %snext = load i8, i8* %gep
222  %ivnext = add i32 %iv, 1
223  %cmp = icmp ult i32 %ivnext, %cnt
224  br i1 %cmp, label %loop, label %exit
225
226exit:
227  %ret = phi i8 [0, %loopguard], [%snext, %loop]
228  ret i8 %ret
229}
230
231define i8 @testptrint(i8* %buf, i8* %end) nounwind {
232; PTR64-LABEL: @testptrint(
233; PTR64-NEXT:    br label [[LOOPGUARD:%.*]]
234; PTR64:       loopguard:
235; PTR64-NEXT:    [[BI:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
236; PTR64-NEXT:    [[EI:%.*]] = ptrtoint i8* [[END:%.*]] to i32
237; PTR64-NEXT:    [[CNT:%.*]] = sub i32 [[EI]], [[BI]]
238; PTR64-NEXT:    [[GUARD:%.*]] = icmp ult i32 [[BI]], [[CNT]]
239; PTR64-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
240; PTR64:       preheader:
241; PTR64-NEXT:    br label [[LOOP:%.*]]
242; PTR64:       loop:
243; PTR64-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ [[BUF]], [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
244; PTR64-NEXT:    [[IV:%.*]] = phi i32 [ [[BI]], [[PREHEADER]] ], [ [[IVNEXT:%.*]], [[LOOP]] ]
245; PTR64-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
246; PTR64-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
247; PTR64-NEXT:    [[IVNEXT]] = add nuw i32 [[IV]], 1
248; PTR64-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[IVNEXT]], [[CNT]]
249; PTR64-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
250; PTR64:       exit.loopexit:
251; PTR64-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
252; PTR64-NEXT:    br label [[EXIT]]
253; PTR64:       exit:
254; PTR64-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
255; PTR64-NEXT:    ret i8 [[RET]]
256;
257; PTR32-LABEL: @testptrint(
258; PTR32-NEXT:    br label [[LOOPGUARD:%.*]]
259; PTR32:       loopguard:
260; PTR32-NEXT:    [[BI:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
261; PTR32-NEXT:    [[EI:%.*]] = ptrtoint i8* [[END:%.*]] to i32
262; PTR32-NEXT:    [[CNT:%.*]] = sub i32 [[EI]], [[BI]]
263; PTR32-NEXT:    [[GUARD:%.*]] = icmp ult i32 [[BI]], [[CNT]]
264; PTR32-NEXT:    br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
265; PTR32:       preheader:
266; PTR32-NEXT:    br label [[LOOP:%.*]]
267; PTR32:       loop:
268; PTR32-NEXT:    [[P_01_US_US:%.*]] = phi i8* [ [[BUF]], [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
269; PTR32-NEXT:    [[IV:%.*]] = phi i32 [ [[BI]], [[PREHEADER]] ], [ [[IVNEXT:%.*]], [[LOOP]] ]
270; PTR32-NEXT:    [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
271; PTR32-NEXT:    [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
272; PTR32-NEXT:    [[IVNEXT]] = add nuw i32 [[IV]], 1
273; PTR32-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[IVNEXT]], [[CNT]]
274; PTR32-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
275; PTR32:       exit.loopexit:
276; PTR32-NEXT:    [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
277; PTR32-NEXT:    br label [[EXIT]]
278; PTR32:       exit:
279; PTR32-NEXT:    [[RET:%.*]] = phi i8 [ 0, [[LOOPGUARD]] ], [ [[SNEXT_LCSSA]], [[EXIT_LOOPEXIT]] ]
280; PTR32-NEXT:    ret i8 [[RET]]
281;
282  br label %loopguard
283
284loopguard:
285  %bi = ptrtoint i8* %buf to i32
286  %ei = ptrtoint i8* %end to i32
287  %cnt = sub i32 %ei, %bi
288  %guard = icmp ult i32 %bi, %cnt
289  br i1 %guard, label %preheader, label %exit
290
291preheader:
292  br label %loop
293
294loop:
295  %p.01.us.us = phi i8* [ %buf, %preheader ], [ %gep, %loop ]
296  %iv = phi i32 [ %bi, %preheader ], [ %ivnext, %loop ]
297  %s = phi i8 [0, %preheader], [%snext, %loop]
298  %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1
299  %snext = load i8, i8* %gep
300  %ivnext = add i32 %iv, 1
301  %cmp = icmp ult i32 %ivnext, %cnt
302  br i1 %cmp, label %loop, label %exit
303
304exit:
305  %ret = phi i8 [0, %loopguard], [%snext, %loop]
306  ret i8 %ret
307}
308
309; IV and BECount have two different pointer types here.
310define void @testnullptr([512 x i8]* %base) nounwind {
311; PTR64-LABEL: @testnullptr(
312; PTR64-NEXT:  entry:
313; PTR64-NEXT:    [[ADD_PTR1603:%.*]] = getelementptr [512 x i8], [512 x i8]* [[BASE:%.*]], i64 0, i64 512
314; PTR64-NEXT:    br label [[PREHEADER:%.*]]
315; PTR64:       preheader:
316; PTR64-NEXT:    [[CMP1604192:%.*]] = icmp ult i8* undef, [[ADD_PTR1603]]
317; PTR64-NEXT:    br i1 [[CMP1604192]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END1609:%.*]]
318; PTR64:       for.body.preheader:
319; PTR64-NEXT:    br label [[FOR_BODY:%.*]]
320; PTR64:       for.body:
321; PTR64-NEXT:    br i1 false, label [[FOR_BODY]], label [[FOR_END1609_LOOPEXIT:%.*]]
322; PTR64:       for.end1609.loopexit:
323; PTR64-NEXT:    br label [[FOR_END1609]]
324; PTR64:       for.end1609:
325; PTR64-NEXT:    unreachable
326;
327; PTR32-LABEL: @testnullptr(
328; PTR32-NEXT:  entry:
329; PTR32-NEXT:    [[ADD_PTR1603:%.*]] = getelementptr [512 x i8], [512 x i8]* [[BASE:%.*]], i64 0, i64 512
330; PTR32-NEXT:    br label [[PREHEADER:%.*]]
331; PTR32:       preheader:
332; PTR32-NEXT:    [[CMP1604192:%.*]] = icmp ult i8* undef, [[ADD_PTR1603]]
333; PTR32-NEXT:    br i1 [[CMP1604192]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END1609:%.*]]
334; PTR32:       for.body.preheader:
335; PTR32-NEXT:    br label [[FOR_BODY:%.*]]
336; PTR32:       for.body:
337; PTR32-NEXT:    br i1 false, label [[FOR_BODY]], label [[FOR_END1609_LOOPEXIT:%.*]]
338; PTR32:       for.end1609.loopexit:
339; PTR32-NEXT:    br label [[FOR_END1609]]
340; PTR32:       for.end1609:
341; PTR32-NEXT:    unreachable
342;
343entry:
344  %add.ptr1603 = getelementptr [512 x i8], [512 x i8]* %base, i64 0, i64 512
345  br label %preheader
346
347preheader:
348  %cmp1604192 = icmp ult i8* undef, %add.ptr1603
349  br i1 %cmp1604192, label %for.body, label %for.end1609
350
351for.body:
352  %r.17193 = phi i8* [ %incdec.ptr1608, %for.body ], [ null, %preheader ]
353  %incdec.ptr1608 = getelementptr i8, i8* %r.17193, i64 1
354  %cmp1604 = icmp ult i8* %incdec.ptr1608, %add.ptr1603
355  br i1 %cmp1604, label %for.body, label %for.end1609
356
357for.end1609:
358  unreachable
359}
360