@@ -730,3 +730,201 @@ entry:
730
730
%res.2 = xor i1 %res.1 , %c.1
731
731
ret i1 %res.2
732
732
}
733
+
734
+ declare void @use (i1 )
735
+
736
+ define i8 @iv_known_non_negative_constant_trip_count (ptr %dst , i8 %N ) {
737
+ ; CHECK-LABEL: @iv_known_non_negative_constant_trip_count(
738
+ ; CHECK-NEXT: entry:
739
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
740
+ ; CHECK: loop.header:
741
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
742
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], 2
743
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
744
+ ; CHECK: loop.latch:
745
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N:%.*]], [[IV]]
746
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
747
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 [[N]], [[IV]]
748
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
749
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
750
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
751
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 [[N]], [[IV]]
752
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
753
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
754
+ ; CHECK-NEXT: call void @use(i1 [[C_0]])
755
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
756
+ ; CHECK-NEXT: br label [[LOOP_HEADER]]
757
+ ; CHECK: exit.1:
758
+ ; CHECK-NEXT: ret i8 10
759
+ ;
760
+ entry:
761
+ br label %loop.header
762
+
763
+ loop.header:
764
+ %iv = phi i8 [ 0 , %entry ], [ %iv.next , %loop.latch ]
765
+ %cmp = icmp slt i8 %iv , 2
766
+ br i1 %cmp , label %loop.latch , label %exit.1
767
+
768
+ loop.latch:
769
+ %t.1 = icmp ugt i8 %N , %iv
770
+ call void @use (i1 %t.1 )
771
+ %t.2 = icmp sgt i8 %N , %iv
772
+ call void @use (i1 %t.2 )
773
+ %f.1 = icmp ule i8 %N , %iv
774
+ call void @use (i1 %f.1 )
775
+ %f.2 = icmp sle i8 %N , %iv
776
+ call void @use (i1 %f.2 )
777
+ %c.0 = icmp ugt i8 %iv , 2
778
+ call void @use (i1 %c.0 )
779
+ %iv.next = add nuw nsw i8 %iv , 1
780
+ br label %loop.header
781
+
782
+ exit.1 :
783
+ ret i8 10
784
+ }
785
+
786
+ define i8 @iv_known_non_negative_constant_trip_count_no_nsw_flag (ptr %dst , i8 %N ) {
787
+ ; CHECK-LABEL: @iv_known_non_negative_constant_trip_count_no_nsw_flag(
788
+ ; CHECK-NEXT: entry:
789
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
790
+ ; CHECK: loop.header:
791
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
792
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], 2
793
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
794
+ ; CHECK: loop.latch:
795
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N:%.*]], [[IV]]
796
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
797
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 [[N]], [[IV]]
798
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
799
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
800
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
801
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 [[N]], [[IV]]
802
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
803
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
804
+ ; CHECK-NEXT: call void @use(i1 [[C_0]])
805
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
806
+ ; CHECK-NEXT: br label [[LOOP_HEADER]]
807
+ ; CHECK: exit.1:
808
+ ; CHECK-NEXT: ret i8 10
809
+ ;
810
+ entry:
811
+ br label %loop.header
812
+
813
+ loop.header:
814
+ %iv = phi i8 [ 0 , %entry ], [ %iv.next , %loop.latch ]
815
+ %cmp = icmp slt i8 %iv , 2
816
+ br i1 %cmp , label %loop.latch , label %exit.1
817
+
818
+ loop.latch:
819
+ %t.1 = icmp ugt i8 %N , %iv
820
+ call void @use (i1 %t.1 )
821
+ %t.2 = icmp sgt i8 %N , %iv
822
+ call void @use (i1 %t.2 )
823
+ %f.1 = icmp ule i8 %N , %iv
824
+ call void @use (i1 %f.1 )
825
+ %f.2 = icmp sle i8 %N , %iv
826
+ call void @use (i1 %f.2 )
827
+ %c.0 = icmp ugt i8 %iv , 2
828
+ call void @use (i1 %c.0 )
829
+ %iv.next = add nuw i8 %iv , 1
830
+ br label %loop.header
831
+
832
+ exit.1 :
833
+ ret i8 10
834
+ }
835
+
836
+ define i8 @iv_known_non_negative_variable_trip_count (ptr %dst , i8 %N ) {
837
+ ; CHECK-LABEL: @iv_known_non_negative_variable_trip_count(
838
+ ; CHECK-NEXT: entry:
839
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
840
+ ; CHECK: loop.header:
841
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
842
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]
843
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
844
+ ; CHECK: loop.latch:
845
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N]], [[IV]]
846
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
847
+ ; CHECK-NEXT: call void @use(i1 true)
848
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
849
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
850
+ ; CHECK-NEXT: call void @use(i1 false)
851
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
852
+ ; CHECK-NEXT: call void @use(i1 [[C_0]])
853
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
854
+ ; CHECK-NEXT: br label [[LOOP_HEADER]]
855
+ ; CHECK: exit.1:
856
+ ; CHECK-NEXT: ret i8 10
857
+ ;
858
+ entry:
859
+ br label %loop.header
860
+
861
+ loop.header:
862
+ %iv = phi i8 [ 0 , %entry ], [ %iv.next , %loop.latch ]
863
+ %cmp = icmp slt i8 %iv , %N
864
+ br i1 %cmp , label %loop.latch , label %exit.1
865
+
866
+ loop.latch:
867
+ %t.1 = icmp ugt i8 %N , %iv
868
+ call void @use (i1 %t.1 )
869
+ %t.2 = icmp sgt i8 %N , %iv
870
+ call void @use (i1 %t.2 )
871
+ %f.1 = icmp ule i8 %N , %iv
872
+ call void @use (i1 %f.1 )
873
+ %f.2 = icmp sle i8 %N , %iv
874
+ call void @use (i1 %f.2 )
875
+ %c.0 = icmp ugt i8 %iv , 2
876
+ call void @use (i1 %c.0 )
877
+ %iv.next = add nuw nsw i8 %iv , 1
878
+ br label %loop.header
879
+
880
+ exit.1 :
881
+ ret i8 10
882
+ }
883
+
884
+ define i8 @iv_may_signed_wrap_variable_trip_count (ptr %dst , i8 %N ) {
885
+ ; CHECK-LABEL: @iv_may_signed_wrap_variable_trip_count(
886
+ ; CHECK-NEXT: entry:
887
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
888
+ ; CHECK: loop.header:
889
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
890
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]
891
+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
892
+ ; CHECK: loop.latch:
893
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N]], [[IV]]
894
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
895
+ ; CHECK-NEXT: call void @use(i1 true)
896
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
897
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
898
+ ; CHECK-NEXT: call void @use(i1 false)
899
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
900
+ ; CHECK-NEXT: call void @use(i1 [[C_0]])
901
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
902
+ ; CHECK-NEXT: br label [[LOOP_HEADER]]
903
+ ; CHECK: exit.1:
904
+ ; CHECK-NEXT: ret i8 10
905
+ ;
906
+ entry:
907
+ br label %loop.header
908
+
909
+ loop.header:
910
+ %iv = phi i8 [ 0 , %entry ], [ %iv.next , %loop.latch ]
911
+ %cmp = icmp slt i8 %iv , %N
912
+ br i1 %cmp , label %loop.latch , label %exit.1
913
+
914
+ loop.latch:
915
+ %t.1 = icmp ugt i8 %N , %iv
916
+ call void @use (i1 %t.1 )
917
+ %t.2 = icmp sgt i8 %N , %iv
918
+ call void @use (i1 %t.2 )
919
+ %f.1 = icmp ule i8 %N , %iv
920
+ call void @use (i1 %f.1 )
921
+ %f.2 = icmp sle i8 %N , %iv
922
+ call void @use (i1 %f.2 )
923
+ %c.0 = icmp ugt i8 %iv , 2
924
+ call void @use (i1 %c.0 )
925
+ %iv.next = add nuw i8 %iv , 1
926
+ br label %loop.header
927
+
928
+ exit.1 :
929
+ ret i8 10
930
+ }
0 commit comments