@@ -382,3 +382,65 @@ loop.latch:
382
382
exit:
383
383
ret void
384
384
}
385
+
386
+ ; Test case for PR44800.
387
+ define void @duplicated_incoming_blocks_blend (i32 %x , i32* %ptr ) {
388
+ ; CHECK-LABEL: @duplicated_incoming_blocks_blend(
389
+ ; CHECK-NEXT: entry:
390
+ ; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
391
+ ; CHECK: vector.ph:
392
+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i32 0
393
+ ; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
394
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
395
+ ; CHECK: vector.body:
396
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
397
+ ; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
398
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt <2 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]]
399
+ ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> [[VEC_IND]], i32 0
400
+ ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, i32* [[PTR:%.*]], i32 [[TMP1]]
401
+ ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i32, i32* [[TMP2]], i32 0
402
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32* [[TMP3]] to <2 x i32>*
403
+ ; CHECK-NEXT: store <2 x i32> [[VEC_IND]], <2 x i32>* [[TMP4]], align 4
404
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 2
405
+ ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], <i32 2, i32 2>
406
+ ; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
407
+ ; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], [[LOOP10:!llvm.loop !.*]]
408
+ ; CHECK: middle.block:
409
+ ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 1000, 1000
410
+ ; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
411
+ ; CHECK: scalar.ph:
412
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1000, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
413
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
414
+ ; CHECK: loop.header:
415
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[ADD_I:%.*]], [[LOOP_LATCH:%.*]] ]
416
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i32 [[IV]], [[X]]
417
+ ; CHECK-NEXT: br i1 [[C_0]], label [[LOOP_LATCH]], label [[LOOP_LATCH]]
418
+ ; CHECK: loop.latch:
419
+ ; CHECK-NEXT: [[P:%.*]] = phi i32 [ [[IV]], [[LOOP_HEADER]] ], [ [[IV]], [[LOOP_HEADER]] ]
420
+ ; CHECK-NEXT: [[GEP_PTR:%.*]] = getelementptr i32, i32* [[PTR]], i32 [[P]]
421
+ ; CHECK-NEXT: store i32 [[P]], i32* [[GEP_PTR]], align 4
422
+ ; CHECK-NEXT: [[ADD_I]] = add nsw i32 [[P]], 1
423
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[ADD_I]], 1000
424
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_HEADER]], label [[EXIT]], [[LOOP11:!llvm.loop !.*]]
425
+ ; CHECK: exit:
426
+ ; CHECK-NEXT: ret void
427
+ ;
428
+ entry:
429
+ br label %loop.header
430
+
431
+ loop.header:
432
+ %iv = phi i32 [ 0 , %entry ], [ %add.i , %loop.latch ]
433
+ %c.0 = icmp ugt i32 %iv , %x
434
+ br i1 %c.0 , label %loop.latch , label %loop.latch
435
+
436
+ loop.latch:
437
+ %p = phi i32 [ %iv , %loop.header ], [ %iv , %loop.header ]
438
+ %gep.ptr = getelementptr i32 , i32* %ptr , i32 %p
439
+ store i32 %p , i32* %gep.ptr
440
+ %add.i = add nsw i32 %p , 1
441
+ %cmp = icmp slt i32 %add.i , 1000
442
+ br i1 %cmp , label %loop.header , label %exit
443
+
444
+ exit:
445
+ ret void
446
+ }
0 commit comments