Skip to content

Commit c2be48a

Browse files
committed
[LV] Add additional tests with induction users.
Adds test coverage of post-inc IV users with different opcodes.
1 parent a74f825 commit c2be48a

File tree

1 file changed

+276
-0
lines changed

1 file changed

+276
-0
lines changed

llvm/test/Transforms/LoopVectorize/iv_outside_user.ll

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,3 +502,279 @@ exit:
502502
%iv.2.lcssa = phi i32 [ %iv.2, %loop ]
503503
ret i32 %iv.2.lcssa
504504
}
505+
506+
define i32 @postinc_sub(i32 %k) {
507+
; CHECK-LABEL: define i32 @postinc_sub(
508+
; CHECK-SAME: i32 [[K:%.*]]) {
509+
; CHECK-NEXT: [[ENTRY:.*]]:
510+
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
511+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
512+
; CHECK: [[VECTOR_PH]]:
513+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
514+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
515+
; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[K]], [[N_VEC]]
516+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
517+
; CHECK: [[VECTOR_BODY]]:
518+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
519+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
520+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
521+
; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
522+
; CHECK: [[MIDDLE_BLOCK]]:
523+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
524+
; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
525+
; CHECK: [[SCALAR_PH]]:
526+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[TMP0]], %[[MIDDLE_BLOCK]] ], [ [[K]], %[[ENTRY]] ]
527+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
528+
; CHECK: [[FOR_BODY]]:
529+
; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
530+
; CHECK-NEXT: [[INC]] = sub nsw i32 [[INC_PHI]], 1
531+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], 0
532+
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
533+
; CHECK: [[FOR_END]]:
534+
; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[TMP0]], %[[MIDDLE_BLOCK]] ]
535+
; CHECK-NEXT: ret i32 [[INC_LCSSA]]
536+
;
537+
entry:
538+
br label %for.body
539+
540+
for.body:
541+
%inc.phi = phi i32 [ %k, %entry ], [ %inc, %for.body ]
542+
%inc = sub nsw i32 %inc.phi, 1
543+
%cmp = icmp eq i32 %inc, 0
544+
br i1 %cmp, label %for.end, label %for.body
545+
546+
for.end:
547+
ret i32 %inc
548+
}
549+
550+
define i32 @postinc_swapped_ops(i32 %k) {
551+
; CHECK-LABEL: define i32 @postinc_swapped_ops(
552+
; CHECK-SAME: i32 [[K:%.*]]) {
553+
; CHECK-NEXT: [[ENTRY:.*]]:
554+
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
555+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
556+
; CHECK: [[VECTOR_PH]]:
557+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
558+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
559+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
560+
; CHECK: [[VECTOR_BODY]]:
561+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
562+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
563+
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
564+
; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
565+
; CHECK: [[MIDDLE_BLOCK]]:
566+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
567+
; CHECK-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
568+
; CHECK: [[SCALAR_PH]]:
569+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
570+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
571+
; CHECK: [[FOR_BODY]]:
572+
; CHECK-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
573+
; CHECK-NEXT: [[INC]] = add nsw i32 1, [[INC_PHI]]
574+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
575+
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
576+
; CHECK: [[FOR_END]]:
577+
; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]
578+
; CHECK-NEXT: ret i32 [[INC_LCSSA]]
579+
;
580+
entry:
581+
br label %for.body
582+
583+
for.body:
584+
%inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
585+
%inc = add nsw i32 1, %inc.phi
586+
%cmp = icmp eq i32 %inc, %k
587+
br i1 %cmp, label %for.end, label %for.body
588+
589+
for.end:
590+
ret i32 %inc
591+
}
592+
593+
define i32 @postinc_not_iv_backedge_value(i32 %k) {
594+
; VEC-LABEL: define i32 @postinc_not_iv_backedge_value(
595+
; VEC-SAME: i32 [[K:%.*]]) {
596+
; VEC-NEXT: [[ENTRY:.*]]:
597+
; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
598+
; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
599+
; VEC: [[VECTOR_PH]]:
600+
; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
601+
; VEC-NEXT: [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
602+
; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
603+
; VEC: [[VECTOR_BODY]]:
604+
; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
605+
; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
606+
; VEC-NEXT: [[TMP0:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 2)
607+
; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
608+
; VEC-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 2)
609+
; VEC-NEXT: [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
610+
; VEC-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
611+
; VEC: [[MIDDLE_BLOCK]]:
612+
; VEC-NEXT: [[TMP2:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1
613+
; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
614+
; VEC-NEXT: br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
615+
; VEC: [[SCALAR_PH]]:
616+
; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
617+
; VEC-NEXT: br label %[[FOR_BODY:.*]]
618+
; VEC: [[FOR_BODY]]:
619+
; VEC-NEXT: [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
620+
; VEC-NEXT: [[INC]] = add nsw i32 [[INC_PHI]], 1
621+
; VEC-NEXT: [[INC_2:%.*]] = add i32 [[INC_PHI]], 2
622+
; VEC-NEXT: [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
623+
; VEC-NEXT: br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
624+
; VEC: [[FOR_END]]:
625+
; VEC-NEXT: [[INC_2_LCSSA:%.*]] = phi i32 [ [[INC_2]], %[[FOR_BODY]] ], [ [[TMP2]], %[[MIDDLE_BLOCK]] ]
626+
; VEC-NEXT: ret i32 [[INC_2_LCSSA]]
627+
;
628+
entry:
629+
br label %for.body
630+
631+
for.body:
632+
%inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
633+
%inc = add nsw i32 %inc.phi, 1
634+
%inc.2 = add i32 %inc.phi, 2
635+
%cmp = icmp eq i32 %inc, %k
636+
br i1 %cmp, label %for.end, label %for.body
637+
638+
for.end:
639+
ret i32 %inc.2
640+
}
641+
642+
define float @fp_postinc_use_fadd(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {
643+
; VEC-LABEL: define float @fp_postinc_use_fadd(
644+
; VEC-SAME: float [[INIT:%.*]], ptr noalias nocapture [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
645+
; VEC-NEXT: [[ENTRY:.*]]:
646+
; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
647+
; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
648+
; VEC: [[VECTOR_PH]]:
649+
; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
650+
; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
651+
; VEC-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
652+
; VEC-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
653+
; VEC-NEXT: [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]
654+
; VEC-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0
655+
; VEC-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer
656+
; VEC-NEXT: [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0
657+
; VEC-NEXT: [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer
658+
; VEC-NEXT: [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]
659+
; VEC-NEXT: [[INDUCTION:%.*]] = fadd fast <2 x float> [[DOTSPLAT]], [[TMP2]]
660+
; VEC-NEXT: [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00
661+
; VEC-NEXT: [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0
662+
; VEC-NEXT: [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer
663+
; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
664+
; VEC: [[VECTOR_BODY]]:
665+
; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
666+
; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
667+
; VEC-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0
668+
; VEC-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP4]]
669+
; VEC-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0
670+
; VEC-NEXT: store <2 x float> [[VEC_IND]], ptr [[TMP6]], align 4
671+
; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
672+
; VEC-NEXT: [[VEC_IND_NEXT]] = fadd fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]
673+
; VEC-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
674+
; VEC-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
675+
; VEC: [[MIDDLE_BLOCK]]:
676+
; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
677+
; VEC-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
678+
; VEC: [[SCALAR_PH]]:
679+
; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
680+
; VEC-NEXT: [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
681+
; VEC-NEXT: br label %[[LOOP:.*]]
682+
; VEC: [[LOOP]]:
683+
; VEC-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
684+
; VEC-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
685+
; VEC-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
686+
; VEC-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4
687+
; VEC-NEXT: [[ADD]] = fadd fast float [[FP_IV]], [[FPINC]]
688+
; VEC-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
689+
; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
690+
; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
691+
; VEC: [[EXIT]]:
692+
; VEC-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
693+
; VEC-NEXT: ret float [[ADD_LCSSA]]
694+
;
695+
entry:
696+
br label %loop
697+
698+
loop:
699+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
700+
%fp.iv = phi float [ %init, %entry ], [ %add, %loop ]
701+
%gep.A = getelementptr inbounds float, ptr %A, i64 %iv
702+
store float %fp.iv, ptr %gep.A, align 4
703+
%add = fadd fast float %fp.iv, %fpinc
704+
%iv.next = add nuw nsw i64 %iv, 1
705+
%ec = icmp eq i64 %iv.next, %N
706+
br i1 %ec, label %exit, label %loop
707+
708+
exit:
709+
ret float %add
710+
}
711+
712+
define float @fp_postinc_use_fsub(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {
713+
; VEC-LABEL: define float @fp_postinc_use_fsub(
714+
; VEC-SAME: float [[INIT:%.*]], ptr noalias nocapture [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
715+
; VEC-NEXT: [[ENTRY:.*]]:
716+
; VEC-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
717+
; VEC-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
718+
; VEC: [[VECTOR_PH]]:
719+
; VEC-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
720+
; VEC-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
721+
; VEC-NEXT: [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
722+
; VEC-NEXT: [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
723+
; VEC-NEXT: [[TMP1:%.*]] = fsub fast float [[INIT]], [[TMP0]]
724+
; VEC-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0
725+
; VEC-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer
726+
; VEC-NEXT: [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0
727+
; VEC-NEXT: [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer
728+
; VEC-NEXT: [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]
729+
; VEC-NEXT: [[INDUCTION:%.*]] = fsub fast <2 x float> [[DOTSPLAT]], [[TMP2]]
730+
; VEC-NEXT: [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00
731+
; VEC-NEXT: [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0
732+
; VEC-NEXT: [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer
733+
; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
734+
; VEC: [[VECTOR_BODY]]:
735+
; VEC-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
736+
; VEC-NEXT: [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
737+
; VEC-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0
738+
; VEC-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP4]]
739+
; VEC-NEXT: [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0
740+
; VEC-NEXT: store <2 x float> [[VEC_IND]], ptr [[TMP6]], align 4
741+
; VEC-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
742+
; VEC-NEXT: [[VEC_IND_NEXT]] = fsub fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]
743+
; VEC-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
744+
; VEC-NEXT: br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
745+
; VEC: [[MIDDLE_BLOCK]]:
746+
; VEC-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
747+
; VEC-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
748+
; VEC: [[SCALAR_PH]]:
749+
; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
750+
; VEC-NEXT: [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
751+
; VEC-NEXT: br label %[[LOOP:.*]]
752+
; VEC: [[LOOP]]:
753+
; VEC-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
754+
; VEC-NEXT: [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
755+
; VEC-NEXT: [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
756+
; VEC-NEXT: store float [[FP_IV]], ptr [[GEP_A]], align 4
757+
; VEC-NEXT: [[ADD]] = fsub fast float [[FP_IV]], [[FPINC]]
758+
; VEC-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
759+
; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
760+
; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
761+
; VEC: [[EXIT]]:
762+
; VEC-NEXT: [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
763+
; VEC-NEXT: ret float [[ADD_LCSSA]]
764+
;
765+
entry:
766+
br label %loop
767+
768+
loop:
769+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
770+
%fp.iv = phi float [ %init, %entry ], [ %add, %loop ]
771+
%gep.A = getelementptr inbounds float, ptr %A, i64 %iv
772+
store float %fp.iv, ptr %gep.A, align 4
773+
%add = fsub fast float %fp.iv, %fpinc
774+
%iv.next = add nuw nsw i64 %iv, 1
775+
%ec = icmp eq i64 %iv.next, %N
776+
br i1 %ec, label %exit, label %loop
777+
778+
exit:
779+
ret float %add
780+
}

0 commit comments

Comments
 (0)