@@ -3750,5 +3750,106 @@ for.end:
37503750 ret void
37513751}
37523752
3753+ ; Test case for https://github.com/llvm/llvm-project/issues/95520.
3754+ define i32 @recurence_uniform_load (ptr %src , ptr noalias %dst ) {
3755+ ; UNROLL-NO-IC-LABEL: @recurence_uniform_load(
3756+ ; UNROLL-NO-IC-NEXT: entry:
3757+ ; UNROLL-NO-IC-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
3758+ ; UNROLL-NO-IC: vector.ph:
3759+ ; UNROLL-NO-IC-NEXT: br label [[VECTOR_BODY:%.*]]
3760+ ; UNROLL-NO-IC: vector.body:
3761+ ; UNROLL-NO-IC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
3762+ ; UNROLL-NO-IC-NEXT: [[VECTOR_RECUR:%.*]] = phi <4 x i32> [ <i32 poison, i32 poison, i32 poison, i32 0>, [[VECTOR_PH]] ], [ [[BROADCAST_SPLAT:%.*]], [[VECTOR_BODY]] ]
3763+ ; UNROLL-NO-IC-NEXT: [[TMP0:%.*]] = load i32, ptr [[SRC:%.*]], align 4
3764+ ; UNROLL-NO-IC-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP0]], i64 0
3765+ ; UNROLL-NO-IC-NEXT: [[BROADCAST_SPLAT]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
3766+ ; UNROLL-NO-IC-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 8
3767+ ; UNROLL-NO-IC-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP37:![0-9]+]]
3768+ ; UNROLL-NO-IC: middle.block:
3769+ ; UNROLL-NO-IC-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
3770+ ; UNROLL-NO-IC: scalar.ph:
3771+ ; UNROLL-NO-IC-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP0]], [[MIDDLE_BLOCK]] ]
3772+ ; UNROLL-NO-IC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 8, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
3773+ ; UNROLL-NO-IC-NEXT: br label [[LOOP:%.*]]
3774+ ; UNROLL-NO-IC: loop:
3775+ ; UNROLL-NO-IC-NEXT: [[PHI:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]
3776+ ; UNROLL-NO-IC-NEXT: [[SCALAR_RECUR:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[LOAD:%.*]], [[LOOP]] ]
3777+ ; UNROLL-NO-IC-NEXT: [[ADD]] = add i64 [[PHI]], 1
3778+ ; UNROLL-NO-IC-NEXT: [[LOAD]] = load i32, ptr [[SRC]], align 4
3779+ ; UNROLL-NO-IC-NEXT: [[ICMP:%.*]] = icmp ult i64 [[PHI]], 1
3780+ ; UNROLL-NO-IC-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP38:![0-9]+]]
3781+ ; UNROLL-NO-IC: exit:
3782+ ; UNROLL-NO-IC-NEXT: ret i32 0
3783+ ;
3784+ ; UNROLL-NO-VF-LABEL: @recurence_uniform_load(
3785+ ; UNROLL-NO-VF-NEXT: entry:
3786+ ; UNROLL-NO-VF-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
3787+ ; UNROLL-NO-VF: vector.ph:
3788+ ; UNROLL-NO-VF-NEXT: br label [[VECTOR_BODY:%.*]]
3789+ ; UNROLL-NO-VF: vector.body:
3790+ ; UNROLL-NO-VF-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
3791+ ; UNROLL-NO-VF-NEXT: [[VECTOR_RECUR:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP0:%.*]], [[VECTOR_BODY]] ]
3792+ ; UNROLL-NO-VF-NEXT: [[TMP0]] = load i32, ptr [[SRC:%.*]], align 4
3793+ ; UNROLL-NO-VF-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
3794+ ; UNROLL-NO-VF-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP37:![0-9]+]]
3795+ ; UNROLL-NO-VF: middle.block:
3796+ ; UNROLL-NO-VF-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
3797+ ; UNROLL-NO-VF: scalar.ph:
3798+ ; UNROLL-NO-VF-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP0]], [[MIDDLE_BLOCK]] ]
3799+ ; UNROLL-NO-VF-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 2, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
3800+ ; UNROLL-NO-VF-NEXT: br label [[LOOP:%.*]]
3801+ ; UNROLL-NO-VF: loop:
3802+ ; UNROLL-NO-VF-NEXT: [[PHI:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]
3803+ ; UNROLL-NO-VF-NEXT: [[SCALAR_RECUR:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[LOAD:%.*]], [[LOOP]] ]
3804+ ; UNROLL-NO-VF-NEXT: [[ADD]] = add i64 [[PHI]], 1
3805+ ; UNROLL-NO-VF-NEXT: [[LOAD]] = load i32, ptr [[SRC]], align 4
3806+ ; UNROLL-NO-VF-NEXT: [[ICMP:%.*]] = icmp ult i64 [[PHI]], 1
3807+ ; UNROLL-NO-VF-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP38:![0-9]+]]
3808+ ; UNROLL-NO-VF: exit:
3809+ ; UNROLL-NO-VF-NEXT: ret i32 0
3810+ ;
3811+ ; SINK-AFTER-LABEL: @recurence_uniform_load(
3812+ ; SINK-AFTER-NEXT: entry:
3813+ ; SINK-AFTER-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
3814+ ; SINK-AFTER: vector.ph:
3815+ ; SINK-AFTER-NEXT: br label [[VECTOR_BODY:%.*]]
3816+ ; SINK-AFTER: vector.body:
3817+ ; SINK-AFTER-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
3818+ ; SINK-AFTER-NEXT: [[VECTOR_RECUR:%.*]] = phi <4 x i32> [ <i32 poison, i32 poison, i32 poison, i32 0>, [[VECTOR_PH]] ], [ [[BROADCAST_SPLAT:%.*]], [[VECTOR_BODY]] ]
3819+ ; SINK-AFTER-NEXT: [[TMP0:%.*]] = load i32, ptr [[SRC:%.*]], align 4
3820+ ; SINK-AFTER-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP0]], i64 0
3821+ ; SINK-AFTER-NEXT: [[BROADCAST_SPLAT]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
3822+ ; SINK-AFTER-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4
3823+ ; SINK-AFTER-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP37:![0-9]+]]
3824+ ; SINK-AFTER: middle.block:
3825+ ; SINK-AFTER-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
3826+ ; SINK-AFTER: scalar.ph:
3827+ ; SINK-AFTER-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP0]], [[MIDDLE_BLOCK]] ]
3828+ ; SINK-AFTER-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 4, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
3829+ ; SINK-AFTER-NEXT: br label [[LOOP:%.*]]
3830+ ; SINK-AFTER: loop:
3831+ ; SINK-AFTER-NEXT: [[PHI:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[ADD:%.*]], [[LOOP]] ]
3832+ ; SINK-AFTER-NEXT: [[SCALAR_RECUR:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], [[SCALAR_PH]] ], [ [[LOAD:%.*]], [[LOOP]] ]
3833+ ; SINK-AFTER-NEXT: [[ADD]] = add i64 [[PHI]], 1
3834+ ; SINK-AFTER-NEXT: [[LOAD]] = load i32, ptr [[SRC]], align 4
3835+ ; SINK-AFTER-NEXT: [[ICMP:%.*]] = icmp ult i64 [[PHI]], 1
3836+ ; SINK-AFTER-NEXT: br i1 [[ICMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP38:![0-9]+]]
3837+ ; SINK-AFTER: exit:
3838+ ; SINK-AFTER-NEXT: ret i32 0
3839+ ;
3840+ entry:
3841+ br label %loop
3842+
3843+ loop:
3844+ %phi = phi i64 [ 0 , %entry ], [ %add , %loop ]
3845+ %recur = phi i32 [ 0 , %entry ], [ %load , %loop ]
3846+ %add = add i64 %phi , 1
3847+ %load = load i32 , ptr %src , align 4
3848+ %icmp = icmp ult i64 %phi , 1
3849+ br i1 %icmp , label %loop , label %exit
3850+
3851+ exit:
3852+ ret i32 0
3853+ }
37533854
37543855!2 = !{!"branch_weights" , i32 1 , i32 1 }
0 commit comments