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