@@ -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