@@ -217,3 +217,94 @@ exit:
217
217
%.lcssa = phi float [ %rdx.next , %loop ]
218
218
ret float %.lcssa
219
219
}
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