Skip to content

Commit 7c0c9d6

Browse files
committed
[LV] Add tests with multiple conditions feedin exit branches.
Test cases for the recent buildbot failures: https://lab.llvm.org/buildbot/#/builders/17/builds/47 https://lab.llvm.org/buildbot/#/builders/168/builds/37
1 parent 50e222f commit 7c0c9d6

File tree

2 files changed

+311
-0
lines changed

2 files changed

+311
-0
lines changed

llvm/test/Transforms/LoopVectorize/AArch64/conditional-branches-cost.ll

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)