@@ -1040,6 +1040,140 @@ TEST_F(PatternMatchTest, FloatingPointUnorderedMax) {
1040
1040
EXPECT_EQ (R, MatchR);
1041
1041
}
1042
1042
1043
+ TEST_F (PatternMatchTest, FloatingPointMin) {
1044
+ Type *FltTy = IRB.getFloatTy ();
1045
+ Value *L = ConstantFP::get (FltTy, 1.0 );
1046
+ Value *R = ConstantFP::get (FltTy, 2.0 );
1047
+ Value *MatchL, *MatchR;
1048
+
1049
+ // Test OLT.
1050
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1051
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLT (L, R), L, R)));
1052
+ EXPECT_EQ (L, MatchL);
1053
+ EXPECT_EQ (R, MatchR);
1054
+
1055
+ // Test OLE.
1056
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1057
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLE (L, R), L, R)));
1058
+ EXPECT_EQ (L, MatchL);
1059
+ EXPECT_EQ (R, MatchR);
1060
+
1061
+ // Test ULT.
1062
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1063
+ .match (IRB.CreateSelect (IRB.CreateFCmpULT (L, R), L, R)));
1064
+ EXPECT_EQ (L, MatchL);
1065
+ EXPECT_EQ (R, MatchR);
1066
+
1067
+ // Test ULE.
1068
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1069
+ .match (IRB.CreateSelect (IRB.CreateFCmpULE (L, R), L, R)));
1070
+ EXPECT_EQ (L, MatchL);
1071
+ EXPECT_EQ (R, MatchR);
1072
+
1073
+ // Test no match on OGE.
1074
+ EXPECT_FALSE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1075
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGE (L, R), L, R)));
1076
+
1077
+ // Test no match on OGT.
1078
+ EXPECT_FALSE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1079
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGT (L, R), L, R)));
1080
+
1081
+ // Test no match on UGE.
1082
+ EXPECT_FALSE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1083
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGE (L, R), L, R)));
1084
+
1085
+ // Test no match on UGT.
1086
+ EXPECT_FALSE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1087
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGT (L, R), L, R)));
1088
+
1089
+ // Test inverted selects. Note, that this "inverts" the ordering, e.g.:
1090
+ // %cmp = fcmp oge L, R
1091
+ // %min = select %cmp R, L
1092
+
1093
+ // [OU]GE with inverted select.
1094
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1095
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGE (L, R), R, L)));
1096
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1097
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGE (L, R), R, L)));
1098
+ EXPECT_EQ (L, MatchL);
1099
+ EXPECT_EQ (R, MatchR);
1100
+
1101
+ // [OU]GT with inverted select.
1102
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1103
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGT (L, R), R, L)));
1104
+ EXPECT_TRUE (m_OrdOrUnordFMin (m_Value (MatchL), m_Value (MatchR))
1105
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGT (L, R), R, L)));
1106
+ EXPECT_EQ (L, MatchL);
1107
+ EXPECT_EQ (R, MatchR);
1108
+ }
1109
+
1110
+ TEST_F (PatternMatchTest, FloatingPointMax) {
1111
+ Type *FltTy = IRB.getFloatTy ();
1112
+ Value *L = ConstantFP::get (FltTy, 1.0 );
1113
+ Value *R = ConstantFP::get (FltTy, 2.0 );
1114
+ Value *MatchL, *MatchR;
1115
+
1116
+ // Test OGT.
1117
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1118
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGT (L, R), L, R)));
1119
+ EXPECT_EQ (L, MatchL);
1120
+ EXPECT_EQ (R, MatchR);
1121
+
1122
+ // Test OGE.
1123
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1124
+ .match (IRB.CreateSelect (IRB.CreateFCmpOGE (L, R), L, R)));
1125
+ EXPECT_EQ (L, MatchL);
1126
+ EXPECT_EQ (R, MatchR);
1127
+
1128
+ // Test UGT.
1129
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1130
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGT (L, R), L, R)));
1131
+ EXPECT_EQ (L, MatchL);
1132
+ EXPECT_EQ (R, MatchR);
1133
+
1134
+ // Test UGE.
1135
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1136
+ .match (IRB.CreateSelect (IRB.CreateFCmpUGE (L, R), L, R)));
1137
+ EXPECT_EQ (L, MatchL);
1138
+ EXPECT_EQ (R, MatchR);
1139
+
1140
+ // Test no match on OLE.
1141
+ EXPECT_FALSE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1142
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLE (L, R), L, R)));
1143
+
1144
+ // Test no match on OLT.
1145
+ EXPECT_FALSE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1146
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLT (L, R), L, R)));
1147
+
1148
+ // Test no match on ULE.
1149
+ EXPECT_FALSE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1150
+ .match (IRB.CreateSelect (IRB.CreateFCmpULE (L, R), L, R)));
1151
+
1152
+ // Test no match on ULT.
1153
+ EXPECT_FALSE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1154
+ .match (IRB.CreateSelect (IRB.CreateFCmpULT (L, R), L, R)));
1155
+
1156
+ // Test inverted selects. Note, that this "inverts" the ordering, e.g.:
1157
+ // %cmp = fcmp ole L, R
1158
+ // %max = select %cmp, R, L
1159
+
1160
+ // [OU]LE with inverted select.
1161
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1162
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLE (L, R), R, L)));
1163
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1164
+ .match (IRB.CreateSelect (IRB.CreateFCmpULE (L, R), R, L)));
1165
+ EXPECT_EQ (L, MatchL);
1166
+ EXPECT_EQ (R, MatchR);
1167
+
1168
+ // [OUT]LT with inverted select.
1169
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1170
+ .match (IRB.CreateSelect (IRB.CreateFCmpOLT (L, R), R, L)));
1171
+ EXPECT_TRUE (m_OrdOrUnordFMax (m_Value (MatchL), m_Value (MatchR))
1172
+ .match (IRB.CreateSelect (IRB.CreateFCmpULT (L, R), R, L)));
1173
+ EXPECT_EQ (L, MatchL);
1174
+ EXPECT_EQ (R, MatchR);
1175
+ }
1176
+
1043
1177
TEST_F (PatternMatchTest, OverflowingBinOps) {
1044
1178
Value *L = IRB.getInt32 (1 );
1045
1179
Value *R = IRB.getInt32 (2 );
0 commit comments