@@ -873,6 +873,138 @@ exit:
873873 ret i32 0
874874}
875875
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+
8761008;.
8771009; DEFAULT: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
8781010; DEFAULT: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -898,6 +1030,8 @@ exit:
8981030; DEFAULT: [[META21]] = !{[[META10]], [[META13]], [[META15]]}
8991031; DEFAULT: [[LOOP22]] = distinct !{[[LOOP22]], [[META1]], [[META2]]}
9001032; DEFAULT: [[LOOP23]] = distinct !{[[LOOP23]], [[META1]]}
1033+ ; DEFAULT: [[LOOP24]] = distinct !{[[LOOP24]], [[META1]], [[META2]]}
1034+ ; DEFAULT: [[LOOP25]] = distinct !{[[LOOP25]], [[META2]], [[META1]]}
9011035;.
9021036; PRED: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
9031037; PRED: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
@@ -920,4 +1054,6 @@ exit:
9201054; PRED: [[META18]] = !{[[META7]], [[META10]], [[META12]]}
9211055; PRED: [[LOOP19]] = distinct !{[[LOOP19]], [[META1]], [[META2]]}
9221056; PRED: [[LOOP20]] = distinct !{[[LOOP20]], [[META1]]}
1057+ ; PRED: [[LOOP21]] = distinct !{[[LOOP21]], [[META1]], [[META2]]}
1058+ ; PRED: [[LOOP22]] = distinct !{[[LOOP22]], [[META2]], [[META1]]}
9231059;.
0 commit comments