@@ -502,3 +502,279 @@ exit:
502
502
%iv.2.lcssa = phi i32 [ %iv.2 , %loop ]
503
503
ret i32 %iv.2.lcssa
504
504
}
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