@@ -3750,5 +3750,106 @@ for.end:
3750
3750
ret void
3751
3751
}
3752
3752
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
+ }
3753
3854
3754
3855
!2 = !{!"branch_weights" , i32 1 , i32 1 }
0 commit comments