@@ -630,9 +630,146 @@ exit:
630
630
ret void
631
631
}
632
632
633
+ define void @print_exact_flags (i64 %n , ptr noalias %x ) {
634
+ ; CHECK-LABEL: Checking a loop in 'print_exact_flags'
635
+ ; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
636
+ ; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
637
+ ; CHECK-NEXT: Live-in ir<%n> = original trip-count
638
+ ; CHECK-EMPTY:
639
+ ; CHECK-NEXT: vector.ph:
640
+ ; CHECK-NEXT: Successor(s): vector loop
641
+ ; CHECK-EMPTY:
642
+ ; CHECK-NEXT: <x1> vector loop: {
643
+ ; CHECK-NEXT: vector.body:
644
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
645
+ ; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
646
+ ; CHECK-NEXT: CLONE ir<%gep.x> = getelementptr ir<%x>, vp<[[STEPS]]>
647
+ ; CHECK-NEXT: WIDEN ir<%lv> = load ir<%gep.x>
648
+ ; CHECK-NEXT: WIDEN ir<%div.1> = udiv ir<%lv>, ir<20>
649
+ ; CHECK-NEXT: WIDEN ir<%div.2> = udiv ir<%lv>, ir<60>
650
+ ; CHECK-NEXT: WIDEN ir<%add> = add ir<%div.1>, ir<%div.2>
651
+ ; CHECK-NEXT: WIDEN store ir<%gep.x>, ir<%add>
652
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
653
+ ; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
654
+ ; CHECK-NEXT: No successors
655
+ ; CHECK-NEXT: }
656
+ ; CHECK-NEXT: Successor(s): middle.block
657
+ ; CHECK-EMPTY:
658
+ ; CHECK-NEXT: middle.block:
659
+ ; CHECK-NEXT: No successors
660
+ ; CHECK-NEXT: }
661
+ ;
662
+ entry:
663
+ br label %loop
664
+
665
+ loop:
666
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
667
+ %gep.x = getelementptr inbounds i32 , ptr %x , i64 %iv
668
+ %lv = load i32 , ptr %gep.x , align 4
669
+ %div.1 = udiv exact i32 %lv , 20
670
+ %div.2 = udiv i32 %lv , 60
671
+ %add = add nsw nuw i32 %div.1 , %div.2
672
+ store i32 %add , ptr %gep.x , align 4
673
+ %iv.next = add i64 %iv , 1
674
+ %exitcond = icmp eq i64 %iv.next , %n
675
+ br i1 %exitcond , label %exit , label %loop
676
+
677
+ exit:
678
+ ret void
679
+ }
680
+
681
+ define void @print_call_flags (ptr readonly %src , ptr noalias %dest , i64 %n ) {
682
+ ; CHECK-LABEL: Checking a loop in 'print_call_flags'
683
+ ; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
684
+ ; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count
685
+ ; CHECK-NEXT: Live-in ir<%n> = original trip-count
686
+ ; CHECK-EMPTY:
687
+ ; CHECK-NEXT: vector.ph:
688
+ ; CHECK-NEXT: Successor(s): vector loop
689
+ ; CHECK-EMPTY:
690
+ ; CHECK-NEXT: <x1> vector loop: {
691
+ ; CHECK-NEXT: vector.body:
692
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
693
+ ; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
694
+ ; CHECK-NEXT: CLONE ir<%ld.addr> = getelementptr ir<%src>, vp<%2>
695
+ ; CHECK-NEXT: WIDEN ir<%ld.value> = load ir<%ld.addr>
696
+ ; CHECK-NEXT: WIDEN ir<%ifcond> = fcmp oeq ir<%ld.value>, ir<5.000000e+00>
697
+ ; CHECK-NEXT: Successor(s): pred.call
698
+ ; CHECK-EMPTY:
699
+ ; CHECK-NEXT: <xVFxUF> pred.call: {
700
+ ; CHECK-NEXT: pred.call.entry:
701
+ ; CHECK-NEXT: BRANCH-ON-MASK ir<%ifcond>
702
+ ; CHECK-NEXT: Successor(s): pred.call.if, pred.call.continue
703
+ ; CHECK-EMPTY:
704
+ ; CHECK-NEXT: pred.call.if:
705
+ ; CHECK-NEXT: REPLICATE ir<%foo.ret.1> = call @foo(ir<%ld.value>) (S->V)
706
+ ; CHECK-NEXT: REPLICATE ir<%foo.ret.2> = call @foo(ir<%ld.value>) (S->V)
707
+ ; CHECK-NEXT: Successor(s): pred.call.continue
708
+ ; CHECK-EMPTY:
709
+ ; CHECK-NEXT: pred.call.continue:
710
+ ; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<%8> = ir<%foo.ret.1>
711
+ ; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<%9> = ir<%foo.ret.2>
712
+ ; CHECK-NEXT: No successors
713
+ ; CHECK-NEXT: }
714
+ ; CHECK-NEXT: Successor(s): if.then.1
715
+ ; CHECK-EMPTY:
716
+ ; CHECK-NEXT: if.then.1:
717
+ ; CHECK-NEXT: WIDEN ir<%fadd> = fadd vp<%8>, vp<%9>
718
+ ; CHECK-NEXT: EMIT vp<%11> = not ir<%ifcond>
719
+ ; CHECK-NEXT: BLEND %st.value = ir<%ld.value>/vp<%11> ir<%fadd>/ir<%ifcond>
720
+ ; CHECK-NEXT: CLONE ir<%st.addr> = getelementptr ir<%dest>, vp<%2>
721
+ ; CHECK-NEXT: WIDEN store ir<%st.addr>, ir<%st.value>
722
+ ; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
723
+ ; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
724
+ ; CHECK-NEXT: No successors
725
+ ; CHECK-NEXT: }
726
+ ; CHECK-NEXT: Successor(s): middle.block
727
+ ; CHECK-EMPTY:
728
+ ; CHECK-NEXT: middle.block:
729
+ ; CHECK-NEXT: No successors
730
+ ; CHECK-NEXT: }
731
+ ;
732
+ entry:
733
+ br label %for.body
734
+
735
+ for.body:
736
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %for.loop ]
737
+ %ld.addr = getelementptr inbounds float , ptr %src , i64 %iv
738
+ %ld.value = load float , ptr %ld.addr , align 8
739
+ %ifcond = fcmp oeq float %ld.value , 5 .0
740
+ br i1 %ifcond , label %if.then , label %for.loop
741
+
742
+ if.then:
743
+ %foo.ret.1 = call nnan nsz ninf float @foo (float %ld.value ) #0
744
+ %foo.ret.2 = call float @foo (float %ld.value ) #0
745
+ %fadd = fadd float %foo.ret.1 , %foo.ret.2
746
+ br label %for.loop
747
+
748
+ for.loop:
749
+ %st.value = phi float [ %ld.value , %for.body ], [ %fadd , %if.then ]
750
+ %st.addr = getelementptr inbounds float , ptr %dest , i64 %iv
751
+ store float %st.value , ptr %st.addr , align 8
752
+ %iv.next = add nsw nuw i64 %iv , 1
753
+ %loopcond = icmp eq i64 %iv.next , %n
754
+ br i1 %loopcond , label %end , label %for.body
755
+
756
+ end:
757
+ ret void
758
+ }
759
+
633
760
!llvm.dbg.cu = !{!0 }
634
761
!llvm.module.flags = !{!3 , !4 }
635
762
763
+ declare float @foo (float ) #0
764
+ declare <2 x float > @vector_foo (<2 x float >, <2 x i1 >)
765
+
766
+ ; We need a vector variant in order to allow for vectorization at present, but
767
+ ; we want to test scalarization of conditional calls. If we provide a variant
768
+ ; with a different number of lanes than the VF we force via
769
+ ; "-force-vector-width=4", then it should pass the legality checks but
770
+ ; scalarize. TODO: Remove the requirement to have a variant.
771
+ attributes #0 = { readonly nounwind "vector-function-abi-variant" ="_ZGV_LLVM_M2v_foo(vector_foo)" }
772
+
636
773
!0 = distinct !DICompileUnit (language: DW_LANG_C99, file: !1 , producer: "clang" , isOptimized: true , runtimeVersion: 0 , emissionKind: NoDebug, enums: !2 )
637
774
!1 = !DIFile (filename: "/tmp/s.c" , directory: "/tmp" )
638
775
!2 = !{}
0 commit comments