@@ -217,3 +217,94 @@ exit:
217217 %.lcssa = phi float [ %rdx.next , %loop ]
218218 ret float %.lcssa
219219}
220+
221+ define float @fadd_reduction_with_live_in (float %inc ) {
222+ ; CHECK-LABEL: define float @fadd_reduction_with_live_in(
223+ ; CHECK-SAME: float [[INC:%.*]]) {
224+ ; CHECK-NEXT: entry:
225+ ; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
226+ ; CHECK: vector.ph:
227+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
228+ ; CHECK: vector.body:
229+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
230+ ; CHECK-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ]
231+ ; CHECK-NEXT: [[VEC_IV:%.*]] = add i32 [[INDEX]], 0
232+ ; CHECK-NEXT: [[VEC_IV1:%.*]] = add i32 [[INDEX]], 1
233+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ule i32 [[VEC_IV]], 1000
234+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i32 [[VEC_IV1]], 1000
235+ ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP0]], float [[INC]], float -0.000000e+00
236+ ; CHECK-NEXT: [[TMP3:%.*]] = fadd float [[VEC_PHI]], [[TMP2]]
237+ ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP1]], float [[INC]], float -0.000000e+00
238+ ; CHECK-NEXT: [[TMP5]] = fadd float [[TMP3]], [[TMP4]]
239+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
240+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1002
241+ ; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
242+ ; CHECK: middle.block:
243+ ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
244+ ; CHECK: scalar.ph:
245+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1002, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
246+ ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP5]], [[MIDDLE_BLOCK]] ], [ 0.000000e+00, [[ENTRY]] ]
247+ ; CHECK-NEXT: br label [[LOOP:%.*]]
248+ ; CHECK: loop:
249+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
250+ ; CHECK-NEXT: [[SUM:%.*]] = phi float [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[SUM_NEXT:%.*]], [[LOOP]] ]
251+ ; CHECK-NEXT: [[SUM_NEXT]] = fadd float [[SUM]], [[INC]]
252+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
253+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 1000
254+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
255+ ; CHECK: exit:
256+ ; CHECK-NEXT: [[LCSSA:%.*]] = phi float [ [[SUM_NEXT]], [[LOOP]] ], [ [[TMP5]], [[MIDDLE_BLOCK]] ]
257+ ; CHECK-NEXT: ret float [[LCSSA]]
258+ ;
259+ ; CHECK-ALM-LABEL: define float @fadd_reduction_with_live_in(
260+ ; CHECK-ALM-SAME: float [[INC:%.*]]) {
261+ ; CHECK-ALM-NEXT: entry:
262+ ; CHECK-ALM-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
263+ ; CHECK-ALM: vector.ph:
264+ ; CHECK-ALM-NEXT: br label [[VECTOR_BODY:%.*]]
265+ ; CHECK-ALM: vector.body:
266+ ; CHECK-ALM-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
267+ ; CHECK-ALM-NEXT: [[VEC_PHI:%.*]] = phi float [ 0.000000e+00, [[VECTOR_PH]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ]
268+ ; CHECK-ALM-NEXT: [[TMP0:%.*]] = add i32 [[INDEX]], 0
269+ ; CHECK-ALM-NEXT: [[TMP1:%.*]] = add i32 [[INDEX]], 1
270+ ; CHECK-ALM-NEXT: [[ACTIVE_LANE_MASK:%.*]] = icmp ult i32 [[TMP0]], 1001
271+ ; CHECK-ALM-NEXT: [[ACTIVE_LANE_MASK1:%.*]] = icmp ult i32 [[TMP1]], 1001
272+ ; CHECK-ALM-NEXT: [[TMP2:%.*]] = select i1 [[ACTIVE_LANE_MASK]], float [[INC]], float -0.000000e+00
273+ ; CHECK-ALM-NEXT: [[TMP3:%.*]] = fadd float [[VEC_PHI]], [[TMP2]]
274+ ; CHECK-ALM-NEXT: [[TMP4:%.*]] = select i1 [[ACTIVE_LANE_MASK1]], float [[INC]], float -0.000000e+00
275+ ; CHECK-ALM-NEXT: [[TMP5]] = fadd float [[TMP3]], [[TMP4]]
276+ ; CHECK-ALM-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
277+ ; CHECK-ALM-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1002
278+ ; CHECK-ALM-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
279+ ; CHECK-ALM: middle.block:
280+ ; CHECK-ALM-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
281+ ; CHECK-ALM: scalar.ph:
282+ ; CHECK-ALM-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1002, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
283+ ; CHECK-ALM-NEXT: [[BC_MERGE_RDX:%.*]] = phi float [ [[TMP5]], [[MIDDLE_BLOCK]] ], [ 0.000000e+00, [[ENTRY]] ]
284+ ; CHECK-ALM-NEXT: br label [[LOOP:%.*]]
285+ ; CHECK-ALM: loop:
286+ ; CHECK-ALM-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
287+ ; CHECK-ALM-NEXT: [[SUM:%.*]] = phi float [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[SUM_NEXT:%.*]], [[LOOP]] ]
288+ ; CHECK-ALM-NEXT: [[SUM_NEXT]] = fadd float [[SUM]], [[INC]]
289+ ; CHECK-ALM-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
290+ ; CHECK-ALM-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 1000
291+ ; CHECK-ALM-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
292+ ; CHECK-ALM: exit:
293+ ; CHECK-ALM-NEXT: [[LCSSA:%.*]] = phi float [ [[SUM_NEXT]], [[LOOP]] ], [ [[TMP5]], [[MIDDLE_BLOCK]] ]
294+ ; CHECK-ALM-NEXT: ret float [[LCSSA]]
295+ ;
296+ entry:
297+ br label %loop
298+
299+ loop:
300+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
301+ %sum = phi float [ 0 .000000e+00 , %entry ], [ %sum.next , %loop ]
302+ %sum.next = fadd float %sum , %inc
303+ %iv.next = add i32 %iv , 1
304+ %ec = icmp eq i32 %iv , 1000
305+ br i1 %ec , label %exit , label %loop
306+
307+ exit:
308+ %lcssa = phi float [ %sum.next , %loop ]
309+ ret float %lcssa
310+ }
0 commit comments