xref: /llvm-project/llvm/test/Transforms/LoopVectorize/ARM/pointer_iv.ll (revision 05dbdb0088a3f5541d9e91c61a564d0aa4704f4f)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=loop-vectorize,dce,instcombine,simplifycfg -S -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,mve4beat -simplifycfg-require-and-preserve-domtree=1 -tail-predication=disabled < %s | FileCheck %s
3
4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
5target triple = "thumbv8.1m.main-none-none-eabi"
6
7define hidden void @pointer_phi_v4i32_add1(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %s, i32%y) {
8; CHECK-LABEL: @pointer_phi_v4i32_add1(
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0
11; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
12; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
13; CHECK:       vector.body:
14; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
15; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i32, i32* [[A:%.*]], i32 [[INDEX]]
16; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 [[INDEX]]
17; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[NEXT_GEP]] to <4 x i32>*
18; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
19; CHECK-NEXT:    [[TMP1:%.*]] = add nsw <4 x i32> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]
20; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32* [[NEXT_GEP4]] to <4 x i32>*
21; CHECK-NEXT:    store <4 x i32> [[TMP1]], <4 x i32>* [[TMP2]], align 4
22; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
23; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
24; CHECK-NEXT:    br i1 [[TMP3]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
25; CHECK:       end:
26; CHECK-NEXT:    ret void
27;
28entry:
29  br label %for.body
30for.body:
31  %A.addr.09 = phi i32* [ %add.ptr, %for.body ], [ %A, %entry ]
32  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
33  %B.addr.07 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ]
34  %0 = load i32, i32* %A.addr.09, align 4
35  %add.ptr = getelementptr inbounds i32, i32* %A.addr.09, i32 1
36  %add = add nsw i32 %0, %y
37  store i32 %add, i32* %B.addr.07, align 4
38  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.07, i32 1
39  %inc = add nuw nsw i32 %i.08, 1
40  %exitcond = icmp eq i32 %inc, 1000
41  br i1 %exitcond, label %end, label %for.body
42end:
43  ret void
44}
45
46define hidden void @pointer_phi_v4i32_add2(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %y) {
47; CHECK-LABEL: @pointer_phi_v4i32_add2(
48; CHECK-NEXT:  entry:
49; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i32, i32* [[A:%.*]], i32 1992
50; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 996
51; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0
52; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
53; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
54; CHECK:       vector.body:
55; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
56; CHECK-NEXT:    [[TMP0:%.*]] = shl i32 [[INDEX]], 1
57; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i32, i32* [[A]], i32 [[TMP0]]
58; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i32, i32* [[B]], i32 [[INDEX]]
59; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[NEXT_GEP]] to <8 x i32>*
60; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i32>, <8 x i32>* [[TMP1]], align 4
61; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
62; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
63; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[NEXT_GEP4]] to <4 x i32>*
64; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP3]], align 4
65; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
66; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996
67; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP2:![0-9]+]]
68; CHECK:       for.body:
69; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi i32* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
70; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]
71; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi i32* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
72; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR_09]], align 4
73; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_09]], i32 2
74; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP5]], [[Y]]
75; CHECK-NEXT:    store i32 [[ADD]], i32* [[B_ADDR_07]], align 4
76; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[B_ADDR_07]], i32 1
77; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
78; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
79; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
80; CHECK:       end:
81; CHECK-NEXT:    ret void
82;
83entry:
84  br label %for.body
85for.body:
86  %A.addr.09 = phi i32* [ %add.ptr, %for.body ], [ %A, %entry ]
87  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
88  %B.addr.07 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ]
89  %0 = load i32, i32* %A.addr.09, align 4
90  %add.ptr = getelementptr inbounds i32, i32* %A.addr.09, i32 2
91  %add = add nsw i32 %0, %y
92  store i32 %add, i32* %B.addr.07, align 4
93  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.07, i32 1
94  %inc = add nuw nsw i32 %i.08, 1
95  %exitcond = icmp eq i32 %inc, 1000
96  br i1 %exitcond, label %end, label %for.body
97end:
98  ret void
99}
100
101define hidden void @pointer_phi_v4i32_add3(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %y) {
102; CHECK-LABEL: @pointer_phi_v4i32_add3(
103; CHECK-NEXT:  entry:
104; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i32, i32* [[A:%.*]], i32 2988
105; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 996
106; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0
107; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
108; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
109; CHECK:       vector.body:
110; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi i32* [ [[A]], [[ENTRY:%.*]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]
111; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
112; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>
113; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i32, i32* [[B]], i32 [[INDEX]]
114; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP0]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
115; CHECK-NEXT:    [[TMP1:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]
116; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32* [[NEXT_GEP]] to <4 x i32>*
117; CHECK-NEXT:    store <4 x i32> [[TMP1]], <4 x i32>* [[TMP2]], align 4
118; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
119; CHECK-NEXT:    [[PTR_IND]] = getelementptr i32, i32* [[POINTER_PHI]], i32 12
120; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996
121; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
122; CHECK:       for.body:
123; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi i32* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
124; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]
125; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi i32* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
126; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR_09]], align 4
127; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_09]], i32 3
128; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], [[Y]]
129; CHECK-NEXT:    store i32 [[ADD]], i32* [[B_ADDR_07]], align 4
130; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[B_ADDR_07]], i32 1
131; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
132; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
133; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
134; CHECK:       end:
135; CHECK-NEXT:    ret void
136;
137entry:
138  br label %for.body
139for.body:
140  %A.addr.09 = phi i32* [ %add.ptr, %for.body ], [ %A, %entry ]
141  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
142  %B.addr.07 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ]
143  %0 = load i32, i32* %A.addr.09, align 4
144  %add.ptr = getelementptr inbounds i32, i32* %A.addr.09, i32 3
145  %add = add nsw i32 %0, %y
146  store i32 %add, i32* %B.addr.07, align 4
147  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.07, i32 1
148  %inc = add nuw nsw i32 %i.08, 1
149  %exitcond = icmp eq i32 %inc, 1000
150  br i1 %exitcond, label %end, label %for.body
151end:
152  ret void
153}
154
155define hidden void @pointer_phi_v8i16_add1(i16* noalias nocapture readonly %A, i16* noalias nocapture %B, i32 %y) {
156; CHECK-LABEL: @pointer_phi_v8i16_add1(
157; CHECK-NEXT:  entry:
158; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16
159; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[TMP0]], i64 0
160; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer
161; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
162; CHECK:       vector.body:
163; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
164; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i16, i16* [[A:%.*]], i32 [[INDEX]]
165; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i16, i16* [[B:%.*]], i32 [[INDEX]]
166; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i16* [[NEXT_GEP]] to <8 x i16>*
167; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]], align 2
168; CHECK-NEXT:    [[TMP2:%.*]] = add <8 x i16> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]
169; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i16* [[NEXT_GEP4]] to <8 x i16>*
170; CHECK-NEXT:    store <8 x i16> [[TMP2]], <8 x i16>* [[TMP3]], align 2
171; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
172; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
173; CHECK-NEXT:    br i1 [[TMP4]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]
174; CHECK:       end:
175; CHECK-NEXT:    ret void
176;
177entry:
178  %0 = trunc i32 %y to i16
179  br label %for.body
180for.body:                                         ; preds = %for.body, %for.body.lr.ph
181  %A.addr.011 = phi i16* [ %A, %entry ], [ %add.ptr, %for.body ]
182  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
183  %B.addr.09 = phi i16* [ %B, %entry ], [ %incdec.ptr, %for.body ]
184  %l1 = load i16, i16* %A.addr.011, align 2
185  %add.ptr = getelementptr inbounds i16, i16* %A.addr.011, i32 1
186  %conv1 = add i16 %l1, %0
187  store i16 %conv1, i16* %B.addr.09, align 2
188  %incdec.ptr = getelementptr inbounds i16, i16* %B.addr.09, i32 1
189  %inc = add nuw nsw i32 %i.010, 1
190  %exitcond = icmp eq i32 %inc, 1000
191  br i1 %exitcond, label %end, label %for.body
192end:
193  ret void
194}
195
196define hidden void @pointer_phi_v8i16_add2(i16* noalias nocapture readonly %A, i16* noalias nocapture %B, i32 %y) {
197; CHECK-LABEL: @pointer_phi_v8i16_add2(
198; CHECK-NEXT:  entry:
199; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16
200; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i16, i16* [[A:%.*]], i32 1984
201; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i16, i16* [[B:%.*]], i32 992
202; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[TMP0]], i64 0
203; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer
204; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
205; CHECK:       vector.body:
206; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
207; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 [[INDEX]], 1
208; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i16, i16* [[A]], i32 [[TMP1]]
209; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i16, i16* [[B]], i32 [[INDEX]]
210; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i16* [[NEXT_GEP]] to <16 x i16>*
211; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <16 x i16>, <16 x i16>* [[TMP2]], align 2
212; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <16 x i16> [[WIDE_VEC]], <16 x i16> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
213; CHECK-NEXT:    [[TMP3:%.*]] = add <8 x i16> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
214; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i16* [[NEXT_GEP4]] to <8 x i16>*
215; CHECK-NEXT:    store <8 x i16> [[TMP3]], <8 x i16>* [[TMP4]], align 2
216; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
217; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
218; CHECK-NEXT:    br i1 [[TMP5]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
219; CHECK:       for.body:
220; CHECK-NEXT:    [[A_ADDR_011:%.*]] = phi i16* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
221; CHECK-NEXT:    [[I_010:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]
222; CHECK-NEXT:    [[B_ADDR_09:%.*]] = phi i16* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
223; CHECK-NEXT:    [[L1:%.*]] = load i16, i16* [[A_ADDR_011]], align 2
224; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i16, i16* [[A_ADDR_011]], i32 2
225; CHECK-NEXT:    [[CONV1:%.*]] = add i16 [[L1]], [[TMP0]]
226; CHECK-NEXT:    store i16 [[CONV1]], i16* [[B_ADDR_09]], align 2
227; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i16, i16* [[B_ADDR_09]], i32 1
228; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_010]], 1
229; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
230; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
231; CHECK:       end:
232; CHECK-NEXT:    ret void
233;
234entry:
235  %0 = trunc i32 %y to i16
236  br label %for.body
237for.body:                                         ; preds = %for.body, %for.body.lr.ph
238  %A.addr.011 = phi i16* [ %A, %entry ], [ %add.ptr, %for.body ]
239  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
240  %B.addr.09 = phi i16* [ %B, %entry ], [ %incdec.ptr, %for.body ]
241  %l1 = load i16, i16* %A.addr.011, align 2
242  %add.ptr = getelementptr inbounds i16, i16* %A.addr.011, i32 2
243  %conv1 = add i16 %l1, %0
244  store i16 %conv1, i16* %B.addr.09, align 2
245  %incdec.ptr = getelementptr inbounds i16, i16* %B.addr.09, i32 1
246  %inc = add nuw nsw i32 %i.010, 1
247  %exitcond = icmp eq i32 %inc, 1000
248  br i1 %exitcond, label %end, label %for.body
249end:
250  ret void
251}
252
253define hidden void @pointer_phi_v8i16_add3(i16* noalias nocapture readonly %A, i16* noalias nocapture %B, i32 %y) {
254; CHECK-LABEL: @pointer_phi_v8i16_add3(
255; CHECK-NEXT:  entry:
256; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i16
257; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
258; CHECK:       for.body:
259; CHECK-NEXT:    [[A_ADDR_011:%.*]] = phi i16* [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[ADD_PTR:%.*]], [[FOR_BODY]] ]
260; CHECK-NEXT:    [[I_010:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
261; CHECK-NEXT:    [[B_ADDR_09:%.*]] = phi i16* [ [[B:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ]
262; CHECK-NEXT:    [[L1:%.*]] = load i16, i16* [[A_ADDR_011]], align 2
263; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i16, i16* [[A_ADDR_011]], i32 3
264; CHECK-NEXT:    [[CONV1:%.*]] = add i16 [[L1]], [[TMP0]]
265; CHECK-NEXT:    store i16 [[CONV1]], i16* [[B_ADDR_09]], align 2
266; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i16, i16* [[B_ADDR_09]], i32 1
267; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_010]], 1
268; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
269; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]]
270; CHECK:       end:
271; CHECK-NEXT:    ret void
272;
273entry:
274  %0 = trunc i32 %y to i16
275  br label %for.body
276for.body:                                         ; preds = %for.body, %for.body.lr.ph
277  %A.addr.011 = phi i16* [ %A, %entry ], [ %add.ptr, %for.body ]
278  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
279  %B.addr.09 = phi i16* [ %B, %entry ], [ %incdec.ptr, %for.body ]
280  %l1 = load i16, i16* %A.addr.011, align 2
281  %add.ptr = getelementptr inbounds i16, i16* %A.addr.011, i32 3
282  %conv1 = add i16 %l1, %0
283  store i16 %conv1, i16* %B.addr.09, align 2
284  %incdec.ptr = getelementptr inbounds i16, i16* %B.addr.09, i32 1
285  %inc = add nuw nsw i32 %i.010, 1
286  %exitcond = icmp eq i32 %inc, 1000
287  br i1 %exitcond, label %end, label %for.body
288end:
289  ret void
290}
291
292define hidden void @pointer_phi_v16i8_add1(i8* noalias nocapture readonly %A, i8* noalias nocapture %B, i32 %y) {
293; CHECK-LABEL: @pointer_phi_v16i8_add1(
294; CHECK-NEXT:  entry:
295; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8
296; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, i8* [[A:%.*]], i32 992
297; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, i8* [[B:%.*]], i32 992
298; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[TMP0]], i64 0
299; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i8> [[BROADCAST_SPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer
300; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
301; CHECK:       vector.body:
302; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
303; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, i8* [[A]], i32 [[INDEX]]
304; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i8, i8* [[B]], i32 [[INDEX]]
305; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[NEXT_GEP]] to <16 x i8>*
306; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <16 x i8>, <16 x i8>* [[TMP1]], align 1
307; CHECK-NEXT:    [[TMP2:%.*]] = add <16 x i8> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]
308; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i8* [[NEXT_GEP4]] to <16 x i8>*
309; CHECK-NEXT:    store <16 x i8> [[TMP2]], <16 x i8>* [[TMP3]], align 1
310; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
311; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
312; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
313; CHECK:       for.body:
314; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi i8* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
315; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]
316; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
317; CHECK-NEXT:    [[TMP5:%.*]] = load i8, i8* [[A_ADDR_010]], align 1
318; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i8, i8* [[A_ADDR_010]], i32 1
319; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP5]], [[TMP0]]
320; CHECK-NEXT:    store i8 [[CONV1]], i8* [[B_ADDR_08]], align 1
321; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[B_ADDR_08]], i32 1
322; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1
323; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
324; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
325; CHECK:       end:
326; CHECK-NEXT:    ret void
327;
328entry:
329  %0 = trunc i32 %y to i8
330  br label %for.body
331
332for.body:
333  %A.addr.010 = phi i8* [ %A, %entry ], [ %add.ptr, %for.body ]
334  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
335  %B.addr.08 = phi i8* [ %B, %entry ], [ %incdec.ptr, %for.body ]
336  %1 = load i8, i8* %A.addr.010, align 1
337  %add.ptr = getelementptr inbounds i8, i8* %A.addr.010, i32 1
338  %conv1 = add i8 %1, %0
339  store i8 %conv1, i8* %B.addr.08, align 1
340  %incdec.ptr = getelementptr inbounds i8, i8* %B.addr.08, i32 1
341  %inc = add nuw nsw i32 %i.09, 1
342  %exitcond = icmp eq i32 %inc, 1000
343  br i1 %exitcond, label %end, label %for.body
344end:
345  ret void
346}
347
348define hidden void @pointer_phi_v16i8_add2(i8* noalias nocapture readonly %A, i8* noalias nocapture %B, i32 %y) {
349; CHECK-LABEL: @pointer_phi_v16i8_add2(
350; CHECK-NEXT:  entry:
351; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8
352; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, i8* [[A:%.*]], i32 1984
353; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, i8* [[B:%.*]], i32 992
354; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i8> poison, i8 [[TMP0]], i64 0
355; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i8> [[BROADCAST_SPLATINSERT]], <16 x i8> poison, <16 x i32> zeroinitializer
356; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
357; CHECK:       vector.body:
358; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
359; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 [[INDEX]], 1
360; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, i8* [[A]], i32 [[TMP1]]
361; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i8, i8* [[B]], i32 [[INDEX]]
362; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[NEXT_GEP]] to <32 x i8>*
363; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <32 x i8>, <32 x i8>* [[TMP2]], align 1
364; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <32 x i8> [[WIDE_VEC]], <32 x i8> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
365; CHECK-NEXT:    [[TMP3:%.*]] = add <16 x i8> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
366; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i8* [[NEXT_GEP4]] to <16 x i8>*
367; CHECK-NEXT:    store <16 x i8> [[TMP3]], <16 x i8>* [[TMP4]], align 1
368; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
369; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
370; CHECK-NEXT:    br i1 [[TMP5]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
371; CHECK:       for.body:
372; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi i8* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
373; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]
374; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
375; CHECK-NEXT:    [[TMP6:%.*]] = load i8, i8* [[A_ADDR_010]], align 1
376; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i8, i8* [[A_ADDR_010]], i32 2
377; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP6]], [[TMP0]]
378; CHECK-NEXT:    store i8 [[CONV1]], i8* [[B_ADDR_08]], align 1
379; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[B_ADDR_08]], i32 1
380; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1
381; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
382; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
383; CHECK:       end:
384; CHECK-NEXT:    ret void
385;
386entry:
387  %0 = trunc i32 %y to i8
388  br label %for.body
389
390for.body:
391  %A.addr.010 = phi i8* [ %A, %entry ], [ %add.ptr, %for.body ]
392  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
393  %B.addr.08 = phi i8* [ %B, %entry ], [ %incdec.ptr, %for.body ]
394  %1 = load i8, i8* %A.addr.010, align 1
395  %add.ptr = getelementptr inbounds i8, i8* %A.addr.010, i32 2
396  %conv1 = add i8 %1, %0
397  store i8 %conv1, i8* %B.addr.08, align 1
398  %incdec.ptr = getelementptr inbounds i8, i8* %B.addr.08, i32 1
399  %inc = add nuw nsw i32 %i.09, 1
400  %exitcond = icmp eq i32 %inc, 1000
401  br i1 %exitcond, label %end, label %for.body
402end:
403  ret void
404}
405
406define hidden void @pointer_phi_v16i8_add3(i8* noalias nocapture readonly %A, i8* noalias nocapture %B, i32 %y) {
407; CHECK-LABEL: @pointer_phi_v16i8_add3(
408; CHECK-NEXT:  entry:
409; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[Y:%.*]] to i8
410; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
411; CHECK:       for.body:
412; CHECK-NEXT:    [[A_ADDR_010:%.*]] = phi i8* [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[ADD_PTR:%.*]], [[FOR_BODY]] ]
413; CHECK-NEXT:    [[I_09:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
414; CHECK-NEXT:    [[B_ADDR_08:%.*]] = phi i8* [ [[B:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ]
415; CHECK-NEXT:    [[TMP1:%.*]] = load i8, i8* [[A_ADDR_010]], align 1
416; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i8, i8* [[A_ADDR_010]], i32 3
417; CHECK-NEXT:    [[CONV1:%.*]] = add i8 [[TMP1]], [[TMP0]]
418; CHECK-NEXT:    store i8 [[CONV1]], i8* [[B_ADDR_08]], align 1
419; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[B_ADDR_08]], i32 1
420; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_09]], 1
421; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
422; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]]
423; CHECK:       end:
424; CHECK-NEXT:    ret void
425;
426entry:
427  %0 = trunc i32 %y to i8
428  br label %for.body
429
430for.body:
431  %A.addr.010 = phi i8* [ %A, %entry ], [ %add.ptr, %for.body ]
432  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
433  %B.addr.08 = phi i8* [ %B, %entry ], [ %incdec.ptr, %for.body ]
434  %1 = load i8, i8* %A.addr.010, align 1
435  %add.ptr = getelementptr inbounds i8, i8* %A.addr.010, i32 3
436  %conv1 = add i8 %1, %0
437  store i8 %conv1, i8* %B.addr.08, align 1
438  %incdec.ptr = getelementptr inbounds i8, i8* %B.addr.08, i32 1
439  %inc = add nuw nsw i32 %i.09, 1
440  %exitcond = icmp eq i32 %inc, 1000
441  br i1 %exitcond, label %end, label %for.body
442end:
443  ret void
444}
445
446define hidden void @pointer_phi_v4f32_add1(float* noalias nocapture readonly %A, float* noalias nocapture %B, float %y) {
447; CHECK-LABEL: @pointer_phi_v4f32_add1(
448; CHECK-NEXT:  entry:
449; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0
450; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer
451; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
452; CHECK:       vector.body:
453; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
454; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr float, float* [[A:%.*]], i32 [[INDEX]]
455; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr float, float* [[B:%.*]], i32 [[INDEX]]
456; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[NEXT_GEP]] to <4 x float>*
457; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
458; CHECK-NEXT:    [[TMP1:%.*]] = fadd fast <4 x float> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]
459; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[NEXT_GEP4]] to <4 x float>*
460; CHECK-NEXT:    store <4 x float> [[TMP1]], <4 x float>* [[TMP2]], align 4
461; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
462; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
463; CHECK-NEXT:    br i1 [[TMP3]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
464; CHECK:       end:
465; CHECK-NEXT:    ret void
466;
467entry:
468  br label %for.body
469for.body:
470  %A.addr.09 = phi float* [ %add.ptr, %for.body ], [ %A, %entry ]
471  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
472  %B.addr.07 = phi float* [ %incdec.ptr, %for.body ], [ %B, %entry ]
473  %0 = load float, float* %A.addr.09, align 4
474  %add.ptr = getelementptr inbounds float, float* %A.addr.09, i32 1
475  %add = fadd fast float %0, %y
476  store float %add, float* %B.addr.07, align 4
477  %incdec.ptr = getelementptr inbounds float, float* %B.addr.07, i32 1
478  %inc = add nuw nsw i32 %i.08, 1
479  %exitcond = icmp eq i32 %inc, 1000
480  br i1 %exitcond, label %end, label %for.body
481end:
482  ret void
483}
484
485define hidden void @pointer_phi_v4f32_add2(float* noalias nocapture readonly %A, float* noalias nocapture %B, float %y) {
486; CHECK-LABEL: @pointer_phi_v4f32_add2(
487; CHECK-NEXT:  entry:
488; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr float, float* [[A:%.*]], i32 1992
489; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr float, float* [[B:%.*]], i32 996
490; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0
491; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer
492; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
493; CHECK:       vector.body:
494; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
495; CHECK-NEXT:    [[TMP0:%.*]] = shl i32 [[INDEX]], 1
496; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr float, float* [[A]], i32 [[TMP0]]
497; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr float, float* [[B]], i32 [[INDEX]]
498; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[NEXT_GEP]] to <8 x float>*
499; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <8 x float>, <8 x float>* [[TMP1]], align 4
500; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x float> [[WIDE_VEC]], <8 x float> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
501; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <4 x float> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
502; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[NEXT_GEP4]] to <4 x float>*
503; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
504; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
505; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996
506; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
507; CHECK:       for.body:
508; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi float* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
509; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]
510; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi float* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
511; CHECK-NEXT:    [[TMP5:%.*]] = load float, float* [[A_ADDR_09]], align 4
512; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds float, float* [[A_ADDR_09]], i32 2
513; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP5]], [[Y]]
514; CHECK-NEXT:    store float [[ADD]], float* [[B_ADDR_07]], align 4
515; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds float, float* [[B_ADDR_07]], i32 1
516; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
517; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
518; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]
519; CHECK:       end:
520; CHECK-NEXT:    ret void
521;
522entry:
523  br label %for.body
524for.body:
525  %A.addr.09 = phi float* [ %add.ptr, %for.body ], [ %A, %entry ]
526  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
527  %B.addr.07 = phi float* [ %incdec.ptr, %for.body ], [ %B, %entry ]
528  %0 = load float, float* %A.addr.09, align 4
529  %add.ptr = getelementptr inbounds float, float* %A.addr.09, i32 2
530  %add = fadd fast float %0, %y
531  store float %add, float* %B.addr.07, align 4
532  %incdec.ptr = getelementptr inbounds float, float* %B.addr.07, i32 1
533  %inc = add nuw nsw i32 %i.08, 1
534  %exitcond = icmp eq i32 %inc, 1000
535  br i1 %exitcond, label %end, label %for.body
536end:
537  ret void
538}
539
540define hidden void @pointer_phi_v4f32_add3(float* noalias nocapture readonly %A, float* noalias nocapture %B, float %y) {
541; CHECK-LABEL: @pointer_phi_v4f32_add3(
542; CHECK-NEXT:  entry:
543; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr float, float* [[A:%.*]], i32 2988
544; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr float, float* [[B:%.*]], i32 996
545; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[Y:%.*]], i64 0
546; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer
547; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
548; CHECK:       vector.body:
549; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi float* [ [[A]], [[ENTRY:%.*]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]
550; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
551; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr float, float* [[POINTER_PHI]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>
552; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr float, float* [[B]], i32 [[INDEX]]
553; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x float> @llvm.masked.gather.v4f32.v4p0f32(<4 x float*> [[TMP0]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x float> poison)
554; CHECK-NEXT:    [[TMP1:%.*]] = fadd fast <4 x float> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]
555; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[NEXT_GEP]] to <4 x float>*
556; CHECK-NEXT:    store <4 x float> [[TMP1]], <4 x float>* [[TMP2]], align 4
557; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
558; CHECK-NEXT:    [[PTR_IND]] = getelementptr float, float* [[POINTER_PHI]], i32 12
559; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 996
560; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
561; CHECK:       for.body:
562; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi float* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
563; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 996, [[VECTOR_BODY]] ]
564; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi float* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
565; CHECK-NEXT:    [[TMP4:%.*]] = load float, float* [[A_ADDR_09]], align 4
566; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds float, float* [[A_ADDR_09]], i32 3
567; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP4]], [[Y]]
568; CHECK-NEXT:    store float [[ADD]], float* [[B_ADDR_07]], align 4
569; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds float, float* [[B_ADDR_07]], i32 1
570; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
571; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
572; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]
573; CHECK:       end:
574; CHECK-NEXT:    ret void
575;
576entry:
577  br label %for.body
578for.body:
579  %A.addr.09 = phi float* [ %add.ptr, %for.body ], [ %A, %entry ]
580  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
581  %B.addr.07 = phi float* [ %incdec.ptr, %for.body ], [ %B, %entry ]
582  %0 = load float, float* %A.addr.09, align 4
583  %add.ptr = getelementptr inbounds float, float* %A.addr.09, i32 3
584  %add = fadd fast float %0, %y
585  store float %add, float* %B.addr.07, align 4
586  %incdec.ptr = getelementptr inbounds float, float* %B.addr.07, i32 1
587  %inc = add nuw nsw i32 %i.08, 1
588  %exitcond = icmp eq i32 %inc, 1000
589  br i1 %exitcond, label %end, label %for.body
590end:
591  ret void
592}
593
594define hidden void @pointer_phi_v4half_add1(half* noalias nocapture readonly %A, half* noalias nocapture %B, half %y) {
595; CHECK-LABEL: @pointer_phi_v4half_add1(
596; CHECK-NEXT:  entry:
597; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0
598; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer
599; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
600; CHECK:       vector.body:
601; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
602; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr half, half* [[A:%.*]], i32 [[INDEX]]
603; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr half, half* [[B:%.*]], i32 [[INDEX]]
604; CHECK-NEXT:    [[TMP0:%.*]] = bitcast half* [[NEXT_GEP]] to <8 x half>*
605; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <8 x half>, <8 x half>* [[TMP0]], align 4
606; CHECK-NEXT:    [[TMP1:%.*]] = fadd fast <8 x half> [[WIDE_LOAD]], [[BROADCAST_SPLAT]]
607; CHECK-NEXT:    [[TMP2:%.*]] = bitcast half* [[NEXT_GEP4]] to <8 x half>*
608; CHECK-NEXT:    store <8 x half> [[TMP1]], <8 x half>* [[TMP2]], align 4
609; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
610; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
611; CHECK-NEXT:    br i1 [[TMP3]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
612; CHECK:       end:
613; CHECK-NEXT:    ret void
614;
615entry:
616  br label %for.body
617for.body:
618  %A.addr.09 = phi half* [ %add.ptr, %for.body ], [ %A, %entry ]
619  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
620  %B.addr.07 = phi half* [ %incdec.ptr, %for.body ], [ %B, %entry ]
621  %0 = load half, half* %A.addr.09, align 4
622  %add.ptr = getelementptr inbounds half, half* %A.addr.09, i32 1
623  %add = fadd fast half %0, %y
624  store half %add, half* %B.addr.07, align 4
625  %incdec.ptr = getelementptr inbounds half, half* %B.addr.07, i32 1
626  %inc = add nuw nsw i32 %i.08, 1
627  %exitcond = icmp eq i32 %inc, 1000
628  br i1 %exitcond, label %end, label %for.body
629end:
630  ret void
631}
632
633define hidden void @pointer_phi_v4half_add2(half* noalias nocapture readonly %A, half* noalias nocapture %B, half %y) {
634; CHECK-LABEL: @pointer_phi_v4half_add2(
635; CHECK-NEXT:  entry:
636; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr half, half* [[A:%.*]], i32 1984
637; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr half, half* [[B:%.*]], i32 992
638; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0
639; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer
640; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
641; CHECK:       vector.body:
642; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
643; CHECK-NEXT:    [[TMP0:%.*]] = shl i32 [[INDEX]], 1
644; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr half, half* [[A]], i32 [[TMP0]]
645; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr half, half* [[B]], i32 [[INDEX]]
646; CHECK-NEXT:    [[TMP1:%.*]] = bitcast half* [[NEXT_GEP]] to <16 x half>*
647; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <16 x half>, <16 x half>* [[TMP1]], align 4
648; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <16 x half> [[WIDE_VEC]], <16 x half> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
649; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <8 x half> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
650; CHECK-NEXT:    [[TMP3:%.*]] = bitcast half* [[NEXT_GEP4]] to <8 x half>*
651; CHECK-NEXT:    store <8 x half> [[TMP2]], <8 x half>* [[TMP3]], align 4
652; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
653; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
654; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP20:![0-9]+]]
655; CHECK:       for.body:
656; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi half* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
657; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]
658; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi half* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
659; CHECK-NEXT:    [[TMP5:%.*]] = load half, half* [[A_ADDR_09]], align 4
660; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds half, half* [[A_ADDR_09]], i32 2
661; CHECK-NEXT:    [[ADD:%.*]] = fadd fast half [[TMP5]], [[Y]]
662; CHECK-NEXT:    store half [[ADD]], half* [[B_ADDR_07]], align 4
663; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds half, half* [[B_ADDR_07]], i32 1
664; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
665; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
666; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
667; CHECK:       end:
668; CHECK-NEXT:    ret void
669;
670entry:
671  br label %for.body
672for.body:
673  %A.addr.09 = phi half* [ %add.ptr, %for.body ], [ %A, %entry ]
674  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
675  %B.addr.07 = phi half* [ %incdec.ptr, %for.body ], [ %B, %entry ]
676  %0 = load half, half* %A.addr.09, align 4
677  %add.ptr = getelementptr inbounds half, half* %A.addr.09, i32 2
678  %add = fadd fast half %0, %y
679  store half %add, half* %B.addr.07, align 4
680  %incdec.ptr = getelementptr inbounds half, half* %B.addr.07, i32 1
681  %inc = add nuw nsw i32 %i.08, 1
682  %exitcond = icmp eq i32 %inc, 1000
683  br i1 %exitcond, label %end, label %for.body
684end:
685  ret void
686}
687
688define hidden void @pointer_phi_v4half_add3(half* noalias nocapture readonly %A, half* noalias nocapture %B, half %y) {
689; CHECK-LABEL: @pointer_phi_v4half_add3(
690; CHECK-NEXT:  entry:
691; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr half, half* [[A:%.*]], i32 2976
692; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr half, half* [[B:%.*]], i32 992
693; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x half> poison, half [[Y:%.*]], i64 0
694; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x half> [[BROADCAST_SPLATINSERT]], <8 x half> poison, <8 x i32> zeroinitializer
695; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
696; CHECK:       vector.body:
697; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
698; CHECK-NEXT:    [[TMP0:%.*]] = mul i32 [[INDEX]], 3
699; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr half, half* [[A]], i32 [[TMP0]]
700; CHECK-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr half, half* [[B]], i32 [[INDEX]]
701; CHECK-NEXT:    [[TMP1:%.*]] = bitcast half* [[NEXT_GEP]] to <24 x half>*
702; CHECK-NEXT:    [[WIDE_VEC:%.*]] = load <24 x half>, <24 x half>* [[TMP1]], align 4
703; CHECK-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <24 x half> [[WIDE_VEC]], <24 x half> poison, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21>
704; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <8 x half> [[STRIDED_VEC]], [[BROADCAST_SPLAT]]
705; CHECK-NEXT:    [[TMP3:%.*]] = bitcast half* [[NEXT_GEP4]] to <8 x half>*
706; CHECK-NEXT:    store <8 x half> [[TMP2]], <8 x half>* [[TMP3]], align 4
707; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
708; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
709; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP22:![0-9]+]]
710; CHECK:       for.body:
711; CHECK-NEXT:    [[A_ADDR_09:%.*]] = phi half* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
712; CHECK-NEXT:    [[I_08:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 992, [[VECTOR_BODY]] ]
713; CHECK-NEXT:    [[B_ADDR_07:%.*]] = phi half* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
714; CHECK-NEXT:    [[TMP5:%.*]] = load half, half* [[A_ADDR_09]], align 4
715; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds half, half* [[A_ADDR_09]], i32 3
716; CHECK-NEXT:    [[ADD:%.*]] = fadd fast half [[TMP5]], [[Y]]
717; CHECK-NEXT:    store half [[ADD]], half* [[B_ADDR_07]], align 4
718; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds half, half* [[B_ADDR_07]], i32 1
719; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
720; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
721; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
722; CHECK:       end:
723; CHECK-NEXT:    ret void
724;
725entry:
726  br label %for.body
727for.body:
728  %A.addr.09 = phi half* [ %add.ptr, %for.body ], [ %A, %entry ]
729  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
730  %B.addr.07 = phi half* [ %incdec.ptr, %for.body ], [ %B, %entry ]
731  %0 = load half, half* %A.addr.09, align 4
732  %add.ptr = getelementptr inbounds half, half* %A.addr.09, i32 3
733  %add = fadd fast half %0, %y
734  store half %add, half* %B.addr.07, align 4
735  %incdec.ptr = getelementptr inbounds half, half* %B.addr.07, i32 1
736  %inc = add nuw nsw i32 %i.08, 1
737  %exitcond = icmp eq i32 %inc, 1000
738  br i1 %exitcond, label %end, label %for.body
739end:
740  ret void
741}
742
743!0 = distinct !{!0, !1}
744!1 = !{!"llvm.loop.interleave.count", i32 2}
745
746define hidden void @pointer_phi_v4i32_uf2(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %n, i32 %y) {
747; CHECK-LABEL: @pointer_phi_v4i32_uf2(
748; CHECK-NEXT:  entry:
749; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i32, i32* [[A:%.*]], i32 59952
750; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 9992
751; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0
752; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
753; CHECK-NEXT:    [[BROADCAST_SPLATINSERT6:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
754; CHECK-NEXT:    [[BROADCAST_SPLAT7:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT6]], <4 x i32> poison, <4 x i32> zeroinitializer
755; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
756; CHECK:       vector.body:
757; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi i32* [ [[A]], [[ENTRY:%.*]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]
758; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
759; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 0, i32 6, i32 12, i32 18>
760; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 24, i32 30, i32 36, i32 42>
761; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i32, i32* [[B]], i32 [[INDEX]]
762; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP0]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
763; CHECK-NEXT:    [[WIDE_MASKED_GATHER5:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP1]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
764; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]
765; CHECK-NEXT:    [[TMP3:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER5]], [[BROADCAST_SPLAT7]]
766; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i32* [[NEXT_GEP]] to <4 x i32>*
767; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP4]], align 4
768; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, i32* [[NEXT_GEP]], i32 4
769; CHECK-NEXT:    [[TMP6:%.*]] = bitcast i32* [[TMP5]] to <4 x i32>*
770; CHECK-NEXT:    store <4 x i32> [[TMP3]], <4 x i32>* [[TMP6]], align 4
771; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
772; CHECK-NEXT:    [[PTR_IND]] = getelementptr i32, i32* [[POINTER_PHI]], i32 48
773; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9992
774; CHECK-NEXT:    br i1 [[TMP7]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
775; CHECK:       for.cond.cleanup:
776; CHECK-NEXT:    ret void
777; CHECK:       for.body:
778; CHECK-NEXT:    [[A_ADDR_08:%.*]] = phi i32* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
779; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 9992, [[VECTOR_BODY]] ]
780; CHECK-NEXT:    [[B_ADDR_06:%.*]] = phi i32* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
781; CHECK-NEXT:    [[TMP8:%.*]] = load i32, i32* [[A_ADDR_08]], align 4
782; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_08]], i32 6
783; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[Y]]
784; CHECK-NEXT:    store i32 [[ADD]], i32* [[B_ADDR_06]], align 4
785; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[B_ADDR_06]], i32 1
786; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1
787; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 10000
788; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
789;
790
791entry:
792  br label %for.body
793
794for.cond.cleanup:
795  ret void
796
797for.body:
798  %A.addr.08 = phi i32* [ %A, %entry ], [ %add.ptr, %for.body ]
799  %i.07 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
800  %B.addr.06 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
801  %0 = load i32, i32* %A.addr.08, align 4
802  %add.ptr = getelementptr inbounds i32, i32* %A.addr.08, i32 6
803  %add = add nsw i32 %0, %y
804  store i32 %add, i32* %B.addr.06, align 4
805  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.06, i32 1
806  %inc = add nuw nsw i32 %i.07, 1
807  %exitcond = icmp eq i32 %inc, 10000
808  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !llvm.loop !0
809}
810
811!2 = distinct !{!2, !3}
812!3 = !{!"llvm.loop.interleave.count", i32 4}
813
814define hidden void @pointer_phi_v4i32_uf4(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %n, i32 %y) {
815; CHECK-LABEL: @pointer_phi_v4i32_uf4(
816; CHECK-NEXT:  entry:
817; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i32, i32* [[A:%.*]], i32 59904
818; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 9984
819; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[Y:%.*]], i64 0
820; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
821; CHECK-NEXT:    [[BROADCAST_SPLATINSERT10:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
822; CHECK-NEXT:    [[BROADCAST_SPLAT11:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT10]], <4 x i32> poison, <4 x i32> zeroinitializer
823; CHECK-NEXT:    [[BROADCAST_SPLATINSERT12:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
824; CHECK-NEXT:    [[BROADCAST_SPLAT13:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT12]], <4 x i32> poison, <4 x i32> zeroinitializer
825; CHECK-NEXT:    [[BROADCAST_SPLATINSERT14:%.*]] = insertelement <4 x i32> poison, i32 [[Y]], i64 0
826; CHECK-NEXT:    [[BROADCAST_SPLAT15:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT14]], <4 x i32> poison, <4 x i32> zeroinitializer
827; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
828; CHECK:       vector.body:
829; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi i32* [ [[A]], [[ENTRY:%.*]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]
830; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
831; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 0, i32 6, i32 12, i32 18>
832; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 24, i32 30, i32 36, i32 42>
833; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 48, i32 54, i32 60, i32 66>
834; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i32, i32* [[POINTER_PHI]], <4 x i32> <i32 72, i32 78, i32 84, i32 90>
835; CHECK-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i32, i32* [[B]], i32 [[INDEX]]
836; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP0]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
837; CHECK-NEXT:    [[WIDE_MASKED_GATHER7:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP1]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
838; CHECK-NEXT:    [[WIDE_MASKED_GATHER8:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP2]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
839; CHECK-NEXT:    [[WIDE_MASKED_GATHER9:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[TMP3]], i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
840; CHECK-NEXT:    [[TMP4:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER]], [[BROADCAST_SPLAT]]
841; CHECK-NEXT:    [[TMP5:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER7]], [[BROADCAST_SPLAT11]]
842; CHECK-NEXT:    [[TMP6:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER8]], [[BROADCAST_SPLAT13]]
843; CHECK-NEXT:    [[TMP7:%.*]] = add nsw <4 x i32> [[WIDE_MASKED_GATHER9]], [[BROADCAST_SPLAT15]]
844; CHECK-NEXT:    [[TMP8:%.*]] = bitcast i32* [[NEXT_GEP]] to <4 x i32>*
845; CHECK-NEXT:    store <4 x i32> [[TMP4]], <4 x i32>* [[TMP8]], align 4
846; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i32, i32* [[NEXT_GEP]], i32 4
847; CHECK-NEXT:    [[TMP10:%.*]] = bitcast i32* [[TMP9]] to <4 x i32>*
848; CHECK-NEXT:    store <4 x i32> [[TMP5]], <4 x i32>* [[TMP10]], align 4
849; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr i32, i32* [[NEXT_GEP]], i32 8
850; CHECK-NEXT:    [[TMP12:%.*]] = bitcast i32* [[TMP11]] to <4 x i32>*
851; CHECK-NEXT:    store <4 x i32> [[TMP6]], <4 x i32>* [[TMP12]], align 4
852; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i32, i32* [[NEXT_GEP]], i32 12
853; CHECK-NEXT:    [[TMP14:%.*]] = bitcast i32* [[TMP13]] to <4 x i32>*
854; CHECK-NEXT:    store <4 x i32> [[TMP7]], <4 x i32>* [[TMP14]], align 4
855; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
856; CHECK-NEXT:    [[PTR_IND]] = getelementptr i32, i32* [[POINTER_PHI]], i32 96
857; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9984
858; CHECK-NEXT:    br i1 [[TMP15]], label [[FOR_BODY:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
859; CHECK:       for.cond.cleanup:
860; CHECK-NEXT:    ret void
861; CHECK:       for.body:
862; CHECK-NEXT:    [[A_ADDR_08:%.*]] = phi i32* [ [[ADD_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END]], [[VECTOR_BODY]] ]
863; CHECK-NEXT:    [[I_07:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 9984, [[VECTOR_BODY]] ]
864; CHECK-NEXT:    [[B_ADDR_06:%.*]] = phi i32* [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[IND_END2]], [[VECTOR_BODY]] ]
865; CHECK-NEXT:    [[TMP16:%.*]] = load i32, i32* [[A_ADDR_08]], align 4
866; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_08]], i32 6
867; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], [[Y]]
868; CHECK-NEXT:    store i32 [[ADD]], i32* [[B_ADDR_06]], align 4
869; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[B_ADDR_06]], i32 1
870; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_07]], 1
871; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 10000
872; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP27:![0-9]+]]
873;
874entry:
875  br label %for.body
876
877for.cond.cleanup:
878  ret void
879
880for.body:
881  %A.addr.08 = phi i32* [ %A, %entry ], [ %add.ptr, %for.body ]
882  %i.07 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
883  %B.addr.06 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
884  %0 = load i32, i32* %A.addr.08, align 4
885  %add.ptr = getelementptr inbounds i32, i32* %A.addr.08, i32 6
886  %add = add nsw i32 %0, %y
887  store i32 %add, i32* %B.addr.06, align 4
888  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.06, i32 1
889  %inc = add nuw nsw i32 %i.07, 1
890  %exitcond = icmp eq i32 %inc, 10000
891  br i1 %exitcond, label %for.cond.cleanup, label %for.body, !llvm.loop !2
892}
893
894define hidden void @mult_ptr_iv(i8* noalias nocapture readonly %x, i8* noalias nocapture %z) {
895; CHECK-LABEL: @mult_ptr_iv(
896; CHECK-NEXT:  entry:
897; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, i8* [[Z:%.*]], i32 3000
898; CHECK-NEXT:    [[SCEVGEP1:%.*]] = getelementptr i8, i8* [[X:%.*]], i32 3000
899; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ugt i8* [[SCEVGEP1]], [[Z]]
900; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ugt i8* [[SCEVGEP]], [[X]]
901; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
902; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[FOR_BODY:%.*]], label [[VECTOR_PH:%.*]]
903; CHECK:       vector.ph:
904; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, i8* [[X]], i32 3000
905; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, i8* [[Z]], i32 3000
906; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
907; CHECK:       vector.body:
908; CHECK-NEXT:    [[POINTER_PHI:%.*]] = phi i8* [ [[X]], [[VECTOR_PH]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ]
909; CHECK-NEXT:    [[POINTER_PHI5:%.*]] = phi i8* [ [[Z]], [[VECTOR_PH]] ], [ [[PTR_IND6:%.*]], [[VECTOR_BODY]] ]
910; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
911; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, i8* [[POINTER_PHI]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>
912; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, i8* [[POINTER_PHI5]], <4 x i32> <i32 0, i32 3, i32 6, i32 9>
913; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i8, <4 x i8*> [[TMP0]], i32 1
914; CHECK-NEXT:    [[WIDE_MASKED_GATHER:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0i8(<4 x i8*> [[TMP0]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> poison), !alias.scope !28
915; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i8, <4 x i8*> [[TMP0]], i32 2
916; CHECK-NEXT:    [[WIDE_MASKED_GATHER7:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0i8(<4 x i8*> [[TMP2]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> poison), !alias.scope !28
917; CHECK-NEXT:    [[WIDE_MASKED_GATHER8:%.*]] = call <4 x i8> @llvm.masked.gather.v4i8.v4p0i8(<4 x i8*> [[TMP3]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> poison), !alias.scope !28
918; CHECK-NEXT:    [[TMP4:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], <i8 10, i8 10, i8 10, i8 10>
919; CHECK-NEXT:    [[TMP5:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], [[WIDE_MASKED_GATHER7]]
920; CHECK-NEXT:    [[TMP6:%.*]] = mul <4 x i8> [[WIDE_MASKED_GATHER]], [[WIDE_MASKED_GATHER8]]
921; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i8, <4 x i8*> [[TMP1]], i32 1
922; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0i8(<4 x i8> [[TMP4]], <4 x i8*> [[TMP1]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>), !alias.scope !31, !noalias !28
923; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i8, <4 x i8*> [[TMP1]], i32 2
924; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0i8(<4 x i8> [[TMP5]], <4 x i8*> [[TMP7]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>), !alias.scope !31, !noalias !28
925; CHECK-NEXT:    call void @llvm.masked.scatter.v4i8.v4p0i8(<4 x i8> [[TMP6]], <4 x i8*> [[TMP8]], i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>), !alias.scope !31, !noalias !28
926; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
927; CHECK-NEXT:    [[PTR_IND]] = getelementptr i8, i8* [[POINTER_PHI]], i32 12
928; CHECK-NEXT:    [[PTR_IND6]] = getelementptr i8, i8* [[POINTER_PHI5]], i32 12
929; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
930; CHECK-NEXT:    br i1 [[TMP9]], label [[END:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP33:![0-9]+]]
931; CHECK:       for.body:
932; CHECK-NEXT:    [[X_ADDR_050:%.*]] = phi i8* [ [[INCDEC_PTR2:%.*]], [[FOR_BODY]] ], [ [[X]], [[ENTRY:%.*]] ]
933; CHECK-NEXT:    [[Z_ADDR_049:%.*]] = phi i8* [ [[INCDEC_PTR34:%.*]], [[FOR_BODY]] ], [ [[Z]], [[ENTRY]] ]
934; CHECK-NEXT:    [[I_048:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY]] ]
935; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i8, i8* [[X_ADDR_050]], i32 1
936; CHECK-NEXT:    [[TMP10:%.*]] = load i8, i8* [[X_ADDR_050]], align 1
937; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i8, i8* [[X_ADDR_050]], i32 2
938; CHECK-NEXT:    [[TMP11:%.*]] = load i8, i8* [[INCDEC_PTR]], align 1
939; CHECK-NEXT:    [[INCDEC_PTR2]] = getelementptr inbounds i8, i8* [[X_ADDR_050]], i32 3
940; CHECK-NEXT:    [[TMP12:%.*]] = load i8, i8* [[INCDEC_PTR1]], align 1
941; CHECK-NEXT:    [[MUL:%.*]] = mul i8 [[TMP10]], 10
942; CHECK-NEXT:    [[MUL1:%.*]] = mul i8 [[TMP10]], [[TMP11]]
943; CHECK-NEXT:    [[MUL2:%.*]] = mul i8 [[TMP10]], [[TMP12]]
944; CHECK-NEXT:    [[INCDEC_PTR32:%.*]] = getelementptr inbounds i8, i8* [[Z_ADDR_049]], i32 1
945; CHECK-NEXT:    store i8 [[MUL]], i8* [[Z_ADDR_049]], align 1
946; CHECK-NEXT:    [[INCDEC_PTR33:%.*]] = getelementptr inbounds i8, i8* [[Z_ADDR_049]], i32 2
947; CHECK-NEXT:    store i8 [[MUL1]], i8* [[INCDEC_PTR32]], align 1
948; CHECK-NEXT:    [[INCDEC_PTR34]] = getelementptr inbounds i8, i8* [[Z_ADDR_049]], i32 3
949; CHECK-NEXT:    store i8 [[MUL2]], i8* [[INCDEC_PTR33]], align 1
950; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_048]], 1
951; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
952; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[FOR_BODY]], !llvm.loop [[LOOP34:![0-9]+]]
953; CHECK:       end:
954; CHECK-NEXT:    ret void
955;
956entry:
957  br label %for.body
958
959for.body:
960  %x.addr.050 = phi i8* [ %incdec.ptr2, %for.body ], [ %x, %entry ]
961  %z.addr.049 = phi i8* [ %incdec.ptr34, %for.body ], [ %z, %entry ]
962  %i.048 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
963  %incdec.ptr = getelementptr inbounds i8, i8* %x.addr.050, i32 1
964  %0 = load i8, i8* %x.addr.050, align 1
965  %incdec.ptr1 = getelementptr inbounds i8, i8* %x.addr.050, i32 2
966  %1 = load i8, i8* %incdec.ptr, align 1
967  %incdec.ptr2 = getelementptr inbounds i8, i8* %x.addr.050, i32 3
968  %2 = load i8, i8* %incdec.ptr1, align 1
969  %conv = zext i8 %0 to i32
970  %mul = mul nuw nsw i32 %conv, 10
971  %conv1 = zext i8 %1 to i32
972  %conv2 = zext i8 %2 to i32
973  %mul1 = mul nuw nsw i32 %conv, %conv1
974  %mul2 = mul nuw nsw i32 %conv, %conv2
975  %conv3 = trunc i32 %mul to i8
976  %conv4 = trunc i32 %mul1 to i8
977  %conv5 = trunc i32 %mul2 to i8
978  %incdec.ptr32 = getelementptr inbounds i8, i8* %z.addr.049, i32 1
979  store i8 %conv3, i8* %z.addr.049, align 1
980  %incdec.ptr33 = getelementptr inbounds i8, i8* %z.addr.049, i32 2
981  store i8 %conv4, i8* %incdec.ptr32, align 1
982  %incdec.ptr34 = getelementptr inbounds i8, i8* %z.addr.049, i32 3
983  store i8 %conv5, i8* %incdec.ptr33, align 1
984  %inc = add nuw i32 %i.048, 1
985  %exitcond = icmp eq i32 %inc, 1000
986  br i1 %exitcond, label %end, label %for.body
987
988end:
989  ret void
990}
991