Skip to content

Commit f3091b7

Browse files
rotaterightmemfrob
authored andcommitted
[InstSimplify] add tests for compare of min/max; NFC
The test are adapted from the existing tests for cmp/select idioms.
1 parent e55a7d6 commit f3091b7

File tree

1 file changed

+324
-0
lines changed

1 file changed

+324
-0
lines changed

llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll

Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,3 +809,327 @@ define <2 x i8> @smax_smax_constants_partial_undef(<2 x i8> %x) {
809809
%m2 = call <2 x i8> @llvm.smax.v2i8(<2 x i8> <i8 9, i8 9>, <2 x i8> %m)
810810
ret <2 x i8> %m2
811811
}
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

Comments
 (0)