xref: /llvm-project/llvm/test/Transforms/InstCombine/remove-loop-phi-multiply-by-zero.ll (revision 462cb3cd6cecd0511ecaf0e3ebcaba455ece587d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3define double @test_mul_fast_flags(ptr %arr_d) {
4; CHECK-LABEL: @test_mul_fast_flags(
5; CHECK-NEXT:  entry:
6; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
7; CHECK:       for.body:
8; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
9; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
10; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
11; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
12; CHECK:       end:
13; CHECK-NEXT:    ret double 0.000000e+00
14;
15entry:
16  br label %for.body
17
18for.body:                                         ; preds = %entry, %for.body
19  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
20  %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
21  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
22  %0 = load double, ptr %arrayidx, align 8
23  %mul = fmul fast double %f_prod.01, %0
24  %inc = add i64 %i.02, 1
25  %cmp = icmp ult i64 %inc, 1000
26  br i1 %cmp, label %for.body, label %end
27
28end:                                              ; preds = %for.body
29  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
30  ret double %f_prod.0.lcssa
31}
32
33define double @test_nsz_nnan_flags_enabled(ptr %arr_d) {
34; CHECK-LABEL: @test_nsz_nnan_flags_enabled(
35; CHECK-NEXT:  entry:
36; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
37; CHECK:       for.body:
38; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
39; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
40; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
41; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
42; CHECK:       end:
43; CHECK-NEXT:    ret double 0.000000e+00
44;
45entry:
46  br label %for.body
47
48for.body:                                         ; preds = %entry, %for.body
49  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
50  %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
51  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
52  %0 = load double, ptr %arrayidx, align 8
53  %mul = fmul nsz nnan double %f_prod.01, %0
54  %inc = add i64 %i.02, 1
55  %cmp = icmp ult i64 %inc, 1000
56  br i1 %cmp, label %for.body, label %end
57
58end:                                              ; preds = %for.body
59  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
60  ret double %f_prod.0.lcssa
61}
62
63define double @test_nnan_flag_enabled(ptr %arr_d) {
64; CHECK-LABEL: @test_nnan_flag_enabled(
65; CHECK-NEXT:  entry:
66; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
67; CHECK:       for.body:
68; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
69; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
70; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
71; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
72; CHECK-NEXT:    [[MUL]] = fmul nnan double [[F_PROD_01]], [[TMP0]]
73; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
74; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
75; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
76; CHECK:       end:
77; CHECK-NEXT:    ret double [[MUL]]
78;
79entry:
80  br label %for.body
81
82for.body:                                         ; preds = %entry, %for.body
83  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
84  %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
85  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
86  %0 = load double, ptr %arrayidx, align 8
87  %mul = fmul nnan double %f_prod.01, %0
88  %inc = add i64 %i.02, 1
89  %cmp = icmp ult i64 %inc, 1000
90  br i1 %cmp, label %for.body, label %end
91
92end:                                              ; preds = %for.body
93  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
94  ret double %f_prod.0.lcssa
95}
96
97define double @test_ninf_flag_enabled(ptr %arr_d) {
98; CHECK-LABEL: @test_ninf_flag_enabled(
99; CHECK-NEXT:  entry:
100; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
101; CHECK:       for.body:
102; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
103; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
104; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
105; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
106; CHECK-NEXT:    [[MUL]] = fmul ninf double [[F_PROD_01]], [[TMP0]]
107; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
108; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
109; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
110; CHECK:       end:
111; CHECK-NEXT:    ret double [[MUL]]
112;
113entry:
114  br label %for.body
115
116for.body:                                         ; preds = %entry, %for.body
117  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
118  %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
119  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
120  %0 = load double, ptr %arrayidx, align 8
121  %mul = fmul ninf double %f_prod.01, %0
122  %inc = add i64 %i.02, 1
123  %cmp = icmp ult i64 %inc, 1000
124  br i1 %cmp, label %for.body, label %end
125
126end:                                              ; preds = %for.body
127  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
128  ret double %f_prod.0.lcssa
129}
130
131define double @test_nsz_flag_enabled(ptr %arr_d) {
132; CHECK-LABEL: @test_nsz_flag_enabled(
133; CHECK-NEXT:  entry:
134; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
135; CHECK:       for.body:
136; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
137; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
138; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
139; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
140; CHECK-NEXT:    [[MUL]] = fmul nsz double [[F_PROD_01]], [[TMP0]]
141; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
142; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
143; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
144; CHECK:       end:
145; CHECK-NEXT:    ret double [[MUL]]
146;
147entry:
148  br label %for.body
149
150for.body:                                         ; preds = %entry, %for.body
151  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
152  %f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
153  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
154  %0 = load double, ptr %arrayidx, align 8
155  %mul = fmul nsz double %f_prod.01, %0
156  %inc = add i64 %i.02, 1
157  %cmp = icmp ult i64 %inc, 1000
158  br i1 %cmp, label %for.body, label %end
159
160end:                                              ; preds = %for.body
161  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
162  ret double %f_prod.0.lcssa
163}
164
165define double @test_phi_initalise_to_non_zero(ptr %arr_d) {
166; CHECK-LABEL: @test_phi_initalise_to_non_zero(
167; CHECK-NEXT:  entry:
168; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
169; CHECK:       for.body:
170; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
171; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
172; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
173; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
174; CHECK-NEXT:    [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
175; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
176; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
177; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
178; CHECK:       end:
179; CHECK-NEXT:    ret double [[MUL]]
180;
181entry:
182  br label %for.body
183
184for.body:                                         ; preds = %entry, %for.body
185  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
186  %f_prod.01 = phi double [ 1.000000e+00, %entry ], [ %mul, %for.body ]
187  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
188  %0 = load double, ptr %arrayidx, align 8
189  %mul = fmul fast double %f_prod.01, %0
190  %inc = add i64 %i.02, 1
191  %cmp = icmp ult i64 %inc, 1000
192  br i1 %cmp, label %for.body, label %end
193
194end:                                              ; preds = %for.body
195  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
196  ret double %f_prod.0.lcssa
197}
198
199define double @test_multiple_phi_operands(ptr %arr_d, i1 %entry_cond) {
200; CHECK-LABEL: @test_multiple_phi_operands(
201; CHECK-NEXT:  entry:
202; CHECK-NEXT:    br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
203; CHECK:       entry_2:
204; CHECK-NEXT:    br label [[FOR_BODY]]
205; CHECK:       for.body:
206; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
207; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
208; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
209; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
210; CHECK-NEXT:    [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
211; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
212; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
213; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
214; CHECK:       end:
215; CHECK-NEXT:    ret double [[MUL]]
216;
217entry:
218  br i1 %entry_cond, label %for.body, label %entry_2
219
220entry_2:
221  br label %for.body
222
223for.body:                                         ; preds = %entry, %for.body
224  %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
225  %f_prod.01 = phi double [ 0.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]
226  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
227  %0 = load double, ptr %arrayidx, align 8
228  %mul = fmul fast double %f_prod.01, %0
229  %inc = add i64 %i.02, 1
230  %cmp = icmp ult i64 %inc, 1000
231  br i1 %cmp, label %for.body, label %end
232
233end:                                              ; preds = %for.body
234  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
235  ret double %f_prod.0.lcssa
236}
237
238define double @test_multiple_phi_operands_with_non_zero(ptr %arr_d, i1 %entry_cond) {
239; CHECK-LABEL: @test_multiple_phi_operands_with_non_zero(
240; CHECK-NEXT:  entry:
241; CHECK-NEXT:    br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
242; CHECK:       entry_2:
243; CHECK-NEXT:    br label [[FOR_BODY]]
244; CHECK:       for.body:
245; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
246; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
247; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1000 x double], ptr [[ARR_D:%.*]], i64 0, i64 [[I_02]]
248; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
249; CHECK-NEXT:    [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
250; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
251; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
252; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
253; CHECK:       end:
254; CHECK-NEXT:    ret double [[MUL]]
255;
256entry:
257  br i1 %entry_cond, label %for.body, label %entry_2
258
259entry_2:
260  br label %for.body
261
262for.body:                                         ; preds = %entry, %for.body
263  %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
264  %f_prod.01 = phi double [ 1.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]
265  %arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
266  %0 = load double, ptr %arrayidx, align 8
267  %mul = fmul fast double %f_prod.01, %0
268  %inc = add i64 %i.02, 1
269  %cmp = icmp ult i64 %inc, 1000
270  br i1 %cmp, label %for.body, label %end
271
272end:                                              ; preds = %for.body
273  %f_prod.0.lcssa = phi double [ %mul, %for.body ]
274  ret double %f_prod.0.lcssa
275}
276
277define i32 @test_int_phi_operands(ptr %arr_d) {
278; CHECK-LABEL: @test_int_phi_operands(
279; CHECK-NEXT:  entry:
280; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
281; CHECK:       for.body:
282; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
283; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
284; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
285; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
286; CHECK-NEXT:    [[MUL]] = mul nsw i32 [[F_PROD_01]], [[TMP0]]
287; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
288; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
289; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
290; CHECK:       end:
291; CHECK-NEXT:    ret i32 [[MUL]]
292;
293entry:
294  br label %for.body
295
296for.body:                                         ; preds = %entry, %for.body
297  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
298  %f_prod.01 = phi i32 [ 0, %entry ], [ %mul, %for.body ]
299  %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
300  %0 = load i32, ptr %arrayidx, align 4
301  %mul = mul nsw i32 %f_prod.01, %0
302  %inc = add i64 %i.02, 1
303  %cmp = icmp ult i64 %inc, 1000
304  br i1 %cmp, label %for.body, label %end
305
306end:                                 ; preds = %for.body
307  %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
308  ret i32 %f_prod.0.lcssa
309}
310
311define i32 @test_int_phi_operands_initalise_to_non_zero(ptr %arr_d) {
312; CHECK-LABEL: @test_int_phi_operands_initalise_to_non_zero(
313; CHECK-NEXT:  entry:
314; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
315; CHECK:       for.body:
316; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
317; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
318; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
319; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
320; CHECK-NEXT:    [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
321; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
322; CHECK-NEXT:    [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
323; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
324; CHECK:       end:
325; CHECK-NEXT:    ret i32 [[MUL]]
326;
327entry:
328  br label %for.body
329
330for.body:                                         ; preds = %entry, %for.body
331  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
332  %f_prod.01 = phi i32 [ 1, %entry ], [ %mul, %for.body ]
333  %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
334  %0 = load i32, ptr %arrayidx, align 4
335  %mul = mul i32 %f_prod.01, %0
336  %inc = add i64 %i.02, 1
337  %cmp = icmp ult i64 %inc, 1000
338  br i1 %cmp, label %for.body, label %end
339
340end:                                 ; preds = %for.body
341  %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
342  ret i32 %f_prod.0.lcssa
343}
344
345define i32 @test_multiple_int_phi_operands(ptr %arr_d, i1 %entry_cond) {
346; CHECK-LABEL: @test_multiple_int_phi_operands(
347; CHECK-NEXT:  entry:
348; CHECK-NEXT:    br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
349; CHECK:       entry_2:
350; CHECK-NEXT:    br label [[FOR_BODY]]
351; CHECK:       for.body:
352; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
353; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 0, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
354; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
355; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
356; CHECK-NEXT:    [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
357; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
358; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
359; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
360; CHECK:       end:
361; CHECK-NEXT:    ret i32 [[MUL]]
362;
363entry:
364  br i1 %entry_cond, label %for.body, label %entry_2
365
366entry_2:
367  br label %for.body
368
369for.body:                                         ; preds = %entry, %for.body
370  %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
371  %f_prod.01 = phi i32 [ 0, %entry ], [0, %entry_2], [ %mul, %for.body ]
372  %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
373  %0 = load i32, ptr %arrayidx, align 4
374  %mul = mul i32 %f_prod.01, %0
375  %inc = add i64 %i.02, 1
376  %cmp = icmp ult i64 %inc, 1000
377  br i1 %cmp, label %for.body, label %end
378
379end:                                              ; preds = %for.body
380  %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
381  ret i32 %f_prod.0.lcssa
382}
383
384define i32 @test_multiple_int_phi_operands_initalise_to_non_zero(ptr %arr_d, i1 %entry_cond) {
385; CHECK-LABEL: @test_multiple_int_phi_operands_initalise_to_non_zero(
386; CHECK-NEXT:  entry:
387; CHECK-NEXT:    br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
388; CHECK:       entry_2:
389; CHECK-NEXT:    br label [[FOR_BODY]]
390; CHECK:       for.body:
391; CHECK-NEXT:    [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
392; CHECK-NEXT:    [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
393; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
394; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
395; CHECK-NEXT:    [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
396; CHECK-NEXT:    [[INC]] = add nuw nsw i64 [[I_02]], 1
397; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
398; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
399; CHECK:       end:
400; CHECK-NEXT:    ret i32 [[MUL]]
401;
402entry:
403  br i1 %entry_cond, label %for.body, label %entry_2
404
405entry_2:
406  br label %for.body
407
408for.body:                                         ; preds = %entry, %for.body
409  %i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
410  %f_prod.01 = phi i32 [ 0, %entry ], [1, %entry_2], [ %mul, %for.body ]
411  %arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
412  %0 = load i32, ptr %arrayidx, align 4
413  %mul = mul i32 %f_prod.01, %0
414  %inc = add i64 %i.02, 1
415  %cmp = icmp ult i64 %inc, 1000
416  br i1 %cmp, label %for.body, label %end
417
418end:                                              ; preds = %for.body
419  %f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
420  ret i32 %f_prod.0.lcssa
421}
422