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