@@ -873,6 +873,138 @@ exit:
873
873
ret i32 0
874
874
}
875
875
876
+ define void @multiple_exit_conditions (ptr %src , ptr noalias %dst ) #1 {
877
+ ; DEFAULT-LABEL: define void @multiple_exit_conditions(
878
+ ; DEFAULT-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) #[[ATTR2:[0-9]+]] {
879
+ ; DEFAULT-NEXT: entry:
880
+ ; DEFAULT-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
881
+ ; DEFAULT: vector.ph:
882
+ ; DEFAULT-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 2048
883
+ ; DEFAULT-NEXT: br label [[VECTOR_BODY:%.*]]
884
+ ; DEFAULT: vector.body:
885
+ ; DEFAULT-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
886
+ ; DEFAULT-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 8
887
+ ; DEFAULT-NEXT: [[TMP0:%.*]] = add i64 [[OFFSET_IDX]], 0
888
+ ; DEFAULT-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP0]]
889
+ ; DEFAULT-NEXT: [[TMP1:%.*]] = load i16, ptr [[SRC]], align 2
890
+ ; DEFAULT-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <8 x i16> poison, i16 [[TMP1]], i64 0
891
+ ; DEFAULT-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <8 x i16> [[BROADCAST_SPLATINSERT]], <8 x i16> poison, <8 x i32> zeroinitializer
892
+ ; DEFAULT-NEXT: [[TMP2:%.*]] = or <8 x i16> [[BROADCAST_SPLAT]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
893
+ ; DEFAULT-NEXT: [[TMP3:%.*]] = uitofp <8 x i16> [[TMP2]] to <8 x double>
894
+ ; DEFAULT-NEXT: [[TMP4:%.*]] = getelementptr double, ptr [[NEXT_GEP]], i32 0
895
+ ; DEFAULT-NEXT: store <8 x double> [[TMP3]], ptr [[TMP4]], align 8
896
+ ; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
897
+ ; DEFAULT-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256
898
+ ; DEFAULT-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
899
+ ; DEFAULT: middle.block:
900
+ ; DEFAULT-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]]
901
+ ; DEFAULT: scalar.ph:
902
+ ; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
903
+ ; DEFAULT-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ 512, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
904
+ ; DEFAULT-NEXT: br label [[LOOP:%.*]]
905
+ ; DEFAULT: vector.scevcheck:
906
+ ; DEFAULT-NEXT: unreachable
907
+ ; DEFAULT: loop:
908
+ ; DEFAULT-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]
909
+ ; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
910
+ ; DEFAULT-NEXT: [[L:%.*]] = load i16, ptr [[SRC]], align 2
911
+ ; DEFAULT-NEXT: [[O:%.*]] = or i16 [[L]], 1
912
+ ; DEFAULT-NEXT: [[CONV:%.*]] = uitofp i16 [[O]] to double
913
+ ; DEFAULT-NEXT: store double [[CONV]], ptr [[PTR_IV]], align 8
914
+ ; DEFAULT-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 2
915
+ ; DEFAULT-NEXT: [[PTR_IV_NEXT]] = getelementptr i8, ptr [[PTR_IV]], i64 8
916
+ ; DEFAULT-NEXT: [[IV_CLAMP:%.*]] = and i64 [[IV]], 4294967294
917
+ ; DEFAULT-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_CLAMP]], 512
918
+ ; DEFAULT-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP25:![0-9]+]]
919
+ ; DEFAULT: exit:
920
+ ; DEFAULT-NEXT: ret void
921
+ ;
922
+ ; PRED-LABEL: define void @multiple_exit_conditions(
923
+ ; PRED-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) #[[ATTR2:[0-9]+]] {
924
+ ; PRED-NEXT: entry:
925
+ ; PRED-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
926
+ ; PRED: vector.ph:
927
+ ; PRED-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
928
+ ; PRED-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 2
929
+ ; PRED-NEXT: [[TMP2:%.*]] = sub i64 [[TMP1]], 1
930
+ ; PRED-NEXT: [[N_RND_UP:%.*]] = add i64 257, [[TMP2]]
931
+ ; PRED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N_RND_UP]], [[TMP1]]
932
+ ; PRED-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
933
+ ; PRED-NEXT: [[TMP3:%.*]] = mul i64 [[N_VEC]], 8
934
+ ; PRED-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]]
935
+ ; PRED-NEXT: [[IND_END1:%.*]] = mul i64 [[N_VEC]], 2
936
+ ; PRED-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
937
+ ; PRED-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 2
938
+ ; PRED-NEXT: [[TMP6:%.*]] = call i64 @llvm.vscale.i64()
939
+ ; PRED-NEXT: [[TMP7:%.*]] = mul i64 [[TMP6]], 2
940
+ ; PRED-NEXT: [[TMP8:%.*]] = sub i64 257, [[TMP7]]
941
+ ; PRED-NEXT: [[TMP9:%.*]] = icmp ugt i64 257, [[TMP7]]
942
+ ; PRED-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], i64 [[TMP8]], i64 0
943
+ ; PRED-NEXT: [[ACTIVE_LANE_MASK_ENTRY:%.*]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 0, i64 257)
944
+ ; PRED-NEXT: br label [[VECTOR_BODY:%.*]]
945
+ ; PRED: vector.body:
946
+ ; PRED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
947
+ ; PRED-NEXT: [[ACTIVE_LANE_MASK:%.*]] = phi <vscale x 2 x i1> [ [[ACTIVE_LANE_MASK_ENTRY]], [[VECTOR_PH]] ], [ [[ACTIVE_LANE_MASK_NEXT:%.*]], [[VECTOR_BODY]] ]
948
+ ; PRED-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 8
949
+ ; PRED-NEXT: [[TMP11:%.*]] = add i64 [[OFFSET_IDX]], 0
950
+ ; PRED-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP11]]
951
+ ; PRED-NEXT: [[TMP12:%.*]] = load i16, ptr [[SRC]], align 2
952
+ ; PRED-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i16> poison, i16 [[TMP12]], i64 0
953
+ ; PRED-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x i16> [[BROADCAST_SPLATINSERT]], <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
954
+ ; PRED-NEXT: [[TMP13:%.*]] = or <vscale x 2 x i16> [[BROADCAST_SPLAT]], shufflevector (<vscale x 2 x i16> insertelement (<vscale x 2 x i16> poison, i16 1, i64 0), <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer)
955
+ ; PRED-NEXT: [[TMP14:%.*]] = uitofp <vscale x 2 x i16> [[TMP13]] to <vscale x 2 x double>
956
+ ; PRED-NEXT: [[TMP15:%.*]] = getelementptr double, ptr [[NEXT_GEP]], i32 0
957
+ ; PRED-NEXT: call void @llvm.masked.store.nxv2f64.p0(<vscale x 2 x double> [[TMP14]], ptr [[TMP15]], i32 8, <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
958
+ ; PRED-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], [[TMP5]]
959
+ ; PRED-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 [[INDEX]], i64 [[TMP10]])
960
+ ; PRED-NEXT: [[TMP16:%.*]] = xor <vscale x 2 x i1> [[ACTIVE_LANE_MASK_NEXT]], shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> poison, i1 true, i64 0), <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer)
961
+ ; PRED-NEXT: [[TMP17:%.*]] = extractelement <vscale x 2 x i1> [[TMP16]], i32 0
962
+ ; PRED-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
963
+ ; PRED: middle.block:
964
+ ; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
965
+ ; PRED: scalar.ph:
966
+ ; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
967
+ ; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ [[IND_END1]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
968
+ ; PRED-NEXT: br label [[LOOP:%.*]]
969
+ ; PRED: vector.scevcheck:
970
+ ; PRED-NEXT: unreachable
971
+ ; PRED: loop:
972
+ ; PRED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]
973
+ ; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL2]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
974
+ ; PRED-NEXT: [[L:%.*]] = load i16, ptr [[SRC]], align 2
975
+ ; PRED-NEXT: [[O:%.*]] = or i16 [[L]], 1
976
+ ; PRED-NEXT: [[CONV:%.*]] = uitofp i16 [[O]] to double
977
+ ; PRED-NEXT: store double [[CONV]], ptr [[PTR_IV]], align 8
978
+ ; PRED-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 2
979
+ ; PRED-NEXT: [[PTR_IV_NEXT]] = getelementptr i8, ptr [[PTR_IV]], i64 8
980
+ ; PRED-NEXT: [[IV_CLAMP:%.*]] = and i64 [[IV]], 4294967294
981
+ ; PRED-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_CLAMP]], 512
982
+ ; PRED-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP22:![0-9]+]]
983
+ ; PRED: exit:
984
+ ; PRED-NEXT: ret void
985
+ ;
986
+ entry:
987
+ br label %loop
988
+
989
+ loop:
990
+ %ptr.iv = phi ptr [ %dst , %entry ], [ %ptr.iv.next , %loop ]
991
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
992
+ %l = load i16 , ptr %src , align 2
993
+ %o = or i16 %l , 1
994
+ %conv = uitofp i16 %o to double
995
+ store double %conv , ptr %ptr.iv , align 8
996
+ %iv.next = add nsw i64 %iv , 2
997
+ %ptr.iv.next = getelementptr i8 , ptr %ptr.iv , i64 8
998
+ %iv.clamp = and i64 %iv , 4294967294
999
+ %ec = icmp eq i64 %iv.clamp , 512
1000
+ br i1 %ec , label %exit , label %loop
1001
+
1002
+ exit:
1003
+ ret void
1004
+ }
1005
+
1006
+ attributes #1 = { "target-cpu" ="neoverse-512tvb" }
1007
+
876
1008
;.
877
1009
; DEFAULT: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
878
1010
; DEFAULT: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -898,6 +1030,8 @@ exit:
898
1030
; DEFAULT: [[META21]] = !{[[META10]], [[META13]], [[META15]]}
899
1031
; DEFAULT: [[LOOP22]] = distinct !{[[LOOP22]], [[META1]], [[META2]]}
900
1032
; DEFAULT: [[LOOP23]] = distinct !{[[LOOP23]], [[META1]]}
1033
+ ; DEFAULT: [[LOOP24]] = distinct !{[[LOOP24]], [[META1]], [[META2]]}
1034
+ ; DEFAULT: [[LOOP25]] = distinct !{[[LOOP25]], [[META2]], [[META1]]}
901
1035
;.
902
1036
; PRED: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
903
1037
; PRED: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -920,4 +1054,6 @@ exit:
920
1054
; PRED: [[META18]] = !{[[META7]], [[META10]], [[META12]]}
921
1055
; PRED: [[LOOP19]] = distinct !{[[LOOP19]], [[META1]], [[META2]]}
922
1056
; PRED: [[LOOP20]] = distinct !{[[LOOP20]], [[META1]]}
1057
+ ; PRED: [[LOOP21]] = distinct !{[[LOOP21]], [[META1]], [[META2]]}
1058
+ ; PRED: [[LOOP22]] = distinct !{[[LOOP22]], [[META2]], [[META1]]}
923
1059
;.
0 commit comments