@@ -809,3 +809,327 @@ define <2 x i8> @smax_smax_constants_partial_undef(<2 x i8> %x) {
809
809
%m2 = call <2 x i8 > @llvm.smax.v2i8 (<2 x i8 > <i8 9 , i8 9 >, <2 x i8 > %m )
810
810
ret <2 x i8 > %m2
811
811
}
812
+
813
+ define i1 @smax_slt (i8 %x , i8 %y ) {
814
+ ; CHECK-LABEL: @smax_slt(
815
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
816
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[M]], [[X]]
817
+ ; CHECK-NEXT: ret i1 [[R]]
818
+ ;
819
+ %m = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
820
+ %r = icmp slt i8 %m , %x
821
+ ret i1 %r
822
+ }
823
+
824
+ define i1 @smax_sge (i8 %x , i8 %y ) {
825
+ ; CHECK-LABEL: @smax_sge(
826
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
827
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[M]], [[X]]
828
+ ; CHECK-NEXT: ret i1 [[R]]
829
+ ;
830
+ %m = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
831
+ %r = icmp sge i8 %m , %x
832
+ ret i1 %r
833
+ }
834
+
835
+ define i1 @umax_ult (i8 %x , i8 %y ) {
836
+ ; CHECK-LABEL: @umax_ult(
837
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
838
+ ; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[M]], [[X]]
839
+ ; CHECK-NEXT: ret i1 [[R]]
840
+ ;
841
+ %m = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
842
+ %r = icmp ult i8 %m , %x
843
+ ret i1 %r
844
+ }
845
+
846
+ define i1 @umax_uge (i8 %x , i8 %y ) {
847
+ ; CHECK-LABEL: @umax_uge(
848
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
849
+ ; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[M]], [[X]]
850
+ ; CHECK-NEXT: ret i1 [[R]]
851
+ ;
852
+ %m = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
853
+ %r = icmp uge i8 %m , %x
854
+ ret i1 %r
855
+ }
856
+
857
+ define i1 @smax_sgt (i8 %x , i8 %y ) {
858
+ ; CHECK-LABEL: @smax_sgt(
859
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
860
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], [[M]]
861
+ ; CHECK-NEXT: ret i1 [[R]]
862
+ ;
863
+ %m = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
864
+ %r = icmp sgt i8 %x , %m
865
+ ret i1 %r
866
+ }
867
+
868
+ define i1 @smax_sle (i8 %x , i8 %y ) {
869
+ ; CHECK-LABEL: @smax_sle(
870
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
871
+ ; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[X]], [[M]]
872
+ ; CHECK-NEXT: ret i1 [[R]]
873
+ ;
874
+ %m = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
875
+ %r = icmp sle i8 %x , %m
876
+ ret i1 %r
877
+ }
878
+
879
+ define i1 @umax_ugt (i8 %x , i8 %y ) {
880
+ ; CHECK-LABEL: @umax_ugt(
881
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
882
+ ; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[X]], [[M]]
883
+ ; CHECK-NEXT: ret i1 [[R]]
884
+ ;
885
+ %m = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
886
+ %r = icmp ugt i8 %x , %m
887
+ ret i1 %r
888
+ }
889
+
890
+ define i1 @umax_ule (i8 %x , i8 %y ) {
891
+ ; CHECK-LABEL: @umax_ule(
892
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
893
+ ; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[X]], [[M]]
894
+ ; CHECK-NEXT: ret i1 [[R]]
895
+ ;
896
+ %m = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
897
+ %r = icmp ule i8 %x , %m
898
+ ret i1 %r
899
+ }
900
+
901
+ define i1 @smin_sgt (i8 %x , i8 %y ) {
902
+ ; CHECK-LABEL: @smin_sgt(
903
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
904
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[M]], [[X]]
905
+ ; CHECK-NEXT: ret i1 [[R]]
906
+ ;
907
+ %m = call i8 @llvm.smin.i8 (i8 %x , i8 %y )
908
+ %r = icmp sgt i8 %m , %x
909
+ ret i1 %r
910
+ }
911
+
912
+ define i1 @smin_sle (i8 %x , i8 %y ) {
913
+ ; CHECK-LABEL: @smin_sle(
914
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
915
+ ; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[M]], [[X]]
916
+ ; CHECK-NEXT: ret i1 [[R]]
917
+ ;
918
+ %m = call i8 @llvm.smin.i8 (i8 %x , i8 %y )
919
+ %r = icmp sle i8 %m , %x
920
+ ret i1 %r
921
+ }
922
+
923
+ define i1 @umin_ugt (i8 %x , i8 %y ) {
924
+ ; CHECK-LABEL: @umin_ugt(
925
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
926
+ ; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[M]], [[X]]
927
+ ; CHECK-NEXT: ret i1 [[R]]
928
+ ;
929
+ %m = call i8 @llvm.umin.i8 (i8 %x , i8 %y )
930
+ %r = icmp ugt i8 %m , %x
931
+ ret i1 %r
932
+ }
933
+
934
+ define i1 @umin_ule (i8 %x , i8 %y ) {
935
+ ; CHECK-LABEL: @umin_ule(
936
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
937
+ ; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[M]], [[X]]
938
+ ; CHECK-NEXT: ret i1 [[R]]
939
+ ;
940
+ %m = call i8 @llvm.umin.i8 (i8 %x , i8 %y )
941
+ %r = icmp ule i8 %m , %x
942
+ ret i1 %r
943
+ }
944
+
945
+ define i1 @smin_slt (i8 %x , i8 %y ) {
946
+ ; CHECK-LABEL: @smin_slt(
947
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
948
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], [[M]]
949
+ ; CHECK-NEXT: ret i1 [[R]]
950
+ ;
951
+ %m = call i8 @llvm.smin.i8 (i8 %x , i8 %y )
952
+ %r = icmp slt i8 %x , %m
953
+ ret i1 %r
954
+ }
955
+
956
+ define i1 @smin_sge (i8 %x , i8 %y ) {
957
+ ; CHECK-LABEL: @smin_sge(
958
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
959
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[X]], [[M]]
960
+ ; CHECK-NEXT: ret i1 [[R]]
961
+ ;
962
+ %m = call i8 @llvm.smin.i8 (i8 %x , i8 %y )
963
+ %r = icmp sge i8 %x , %m
964
+ ret i1 %r
965
+ }
966
+
967
+ define i1 @umin_ult (i8 %x , i8 %y ) {
968
+ ; CHECK-LABEL: @umin_ult(
969
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
970
+ ; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X]], [[M]]
971
+ ; CHECK-NEXT: ret i1 [[R]]
972
+ ;
973
+ %m = call i8 @llvm.umin.i8 (i8 %x , i8 %y )
974
+ %r = icmp ult i8 %x , %m
975
+ ret i1 %r
976
+ }
977
+
978
+ define i1 @umin_uge (i8 %x , i8 %y ) {
979
+ ; CHECK-LABEL: @umin_uge(
980
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
981
+ ; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[X]], [[M]]
982
+ ; CHECK-NEXT: ret i1 [[R]]
983
+ ;
984
+ %m = call i8 @llvm.umin.i8 (i8 %x , i8 %y )
985
+ %r = icmp uge i8 %x , %m
986
+ ret i1 %r
987
+ }
988
+
989
+ define i1 @smaxmin_sge (i8 %x , i8 %y , i8 %z ) {
990
+ ; CHECK-LABEL: @smaxmin_sge(
991
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
992
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
993
+ ; CHECK-NEXT: [[C:%.*]] = icmp sge i8 [[MAX]], [[MIN]]
994
+ ; CHECK-NEXT: ret i1 [[C]]
995
+ ;
996
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
997
+ %min = call i8 @llvm.smin.i8 (i8 %z , i8 %x )
998
+ %c = icmp sge i8 %max , %min
999
+ ret i1 %c
1000
+ }
1001
+
1002
+ define i1 @smaxmin_sgt (i8 %x , i8 %y , i8 %z ) {
1003
+ ; CHECK-LABEL: @smaxmin_sgt(
1004
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1005
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
1006
+ ; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[MIN]], [[MAX]]
1007
+ ; CHECK-NEXT: ret i1 [[C]]
1008
+ ;
1009
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
1010
+ %min = call i8 @llvm.smin.i8 (i8 %z , i8 %x )
1011
+ %c = icmp sgt i8 %min , %max
1012
+ ret i1 %c
1013
+ }
1014
+
1015
+ define i1 @smaxmin_sle (i8 %x , i8 %y , i8 %z ) {
1016
+ ; CHECK-LABEL: @smaxmin_sle(
1017
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1018
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
1019
+ ; CHECK-NEXT: [[C:%.*]] = icmp sle i8 [[MIN]], [[MAX]]
1020
+ ; CHECK-NEXT: ret i1 [[C]]
1021
+ ;
1022
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
1023
+ %min = call i8 @llvm.smin.i8 (i8 %z , i8 %x )
1024
+ %c = icmp sle i8 %min , %max
1025
+ ret i1 %c
1026
+ }
1027
+
1028
+ define i1 @smaxmin_slt (i8 %x , i8 %y , i8 %z ) {
1029
+ ; CHECK-LABEL: @smaxmin_slt(
1030
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1031
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
1032
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[MAX]], [[MIN]]
1033
+ ; CHECK-NEXT: ret i1 [[C]]
1034
+ ;
1035
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
1036
+ %min = call i8 @llvm.smin.i8 (i8 %z , i8 %x )
1037
+ %c = icmp slt i8 %max , %min
1038
+ ret i1 %c
1039
+ }
1040
+
1041
+ define i1 @umaxmin_uge (i8 %x , i8 %y , i8 %z ) {
1042
+ ; CHECK-LABEL: @umaxmin_uge(
1043
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1044
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
1045
+ ; CHECK-NEXT: [[C:%.*]] = icmp uge i8 [[MAX]], [[MIN]]
1046
+ ; CHECK-NEXT: ret i1 [[C]]
1047
+ ;
1048
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1049
+ %min = call i8 @llvm.umin.i8 (i8 %z , i8 %x )
1050
+ %c = icmp uge i8 %max , %min
1051
+ ret i1 %c
1052
+ }
1053
+
1054
+ define i1 @umaxmin_ugt (i8 %x , i8 %y , i8 %z ) {
1055
+ ; CHECK-LABEL: @umaxmin_ugt(
1056
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1057
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
1058
+ ; CHECK-NEXT: [[C:%.*]] = icmp ugt i8 [[MIN]], [[MAX]]
1059
+ ; CHECK-NEXT: ret i1 [[C]]
1060
+ ;
1061
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1062
+ %min = call i8 @llvm.umin.i8 (i8 %z , i8 %x )
1063
+ %c = icmp ugt i8 %min , %max
1064
+ ret i1 %c
1065
+ }
1066
+
1067
+ define i1 @umaxmin_ule (i8 %x , i8 %y , i8 %z ) {
1068
+ ; CHECK-LABEL: @umaxmin_ule(
1069
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1070
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
1071
+ ; CHECK-NEXT: [[C:%.*]] = icmp ule i8 [[MIN]], [[MAX]]
1072
+ ; CHECK-NEXT: ret i1 [[C]]
1073
+ ;
1074
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1075
+ %min = call i8 @llvm.umin.i8 (i8 %z , i8 %x )
1076
+ %c = icmp ule i8 %min , %max
1077
+ ret i1 %c
1078
+ }
1079
+
1080
+ define i1 @umaxmin_ult (i8 %x , i8 %y , i8 %z ) {
1081
+ ; CHECK-LABEL: @umaxmin_ult(
1082
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1083
+ ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
1084
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[MAX]], [[MIN]]
1085
+ ; CHECK-NEXT: ret i1 [[C]]
1086
+ ;
1087
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1088
+ %min = call i8 @llvm.umin.i8 (i8 %z , i8 %x )
1089
+ %c = icmp ult i8 %max , %min
1090
+ ret i1 %c
1091
+ }
1092
+
1093
+ define i1 @smax_eq (i8 %x , i8 %y ) {
1094
+ ; CHECK-LABEL: @smax_eq(
1095
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1096
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[MAX]], [[X]]
1097
+ ; CHECK-NEXT: ret i1 [[R]]
1098
+ ;
1099
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
1100
+ %r = icmp eq i8 %max , %x
1101
+ ret i1 %r
1102
+ }
1103
+
1104
+ define i1 @smax_eq_commute (i8 %x , i8 %y ) {
1105
+ ; CHECK-LABEL: @smax_eq_commute(
1106
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1107
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[MAX]]
1108
+ ; CHECK-NEXT: ret i1 [[R]]
1109
+ ;
1110
+ %max = call i8 @llvm.smax.i8 (i8 %x , i8 %y )
1111
+ %r = icmp eq i8 %x , %max
1112
+ ret i1 %r
1113
+ }
1114
+
1115
+ define i1 @umax_eq (i8 %x , i8 %y ) {
1116
+ ; CHECK-LABEL: @umax_eq(
1117
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1118
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[MAX]], [[X]]
1119
+ ; CHECK-NEXT: ret i1 [[R]]
1120
+ ;
1121
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1122
+ %r = icmp eq i8 %max , %x
1123
+ ret i1 %r
1124
+ }
1125
+
1126
+ define i1 @umax_eq_commute (i8 %x , i8 %y ) {
1127
+ ; CHECK-LABEL: @umax_eq_commute(
1128
+ ; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1129
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[MAX]]
1130
+ ; CHECK-NEXT: ret i1 [[R]]
1131
+ ;
1132
+ %max = call i8 @llvm.umax.i8 (i8 %x , i8 %y )
1133
+ %r = icmp eq i8 %x , %max
1134
+ ret i1 %r
1135
+ }
0 commit comments