@@ -1040,6 +1040,140 @@ TEST_F(PatternMatchTest, FloatingPointUnorderedMax) {
10401040 EXPECT_EQ (R, MatchR);
10411041}
10421042
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+
10431177TEST_F (PatternMatchTest, OverflowingBinOps) {
10441178 Value *L = IRB.getInt32 (1 );
10451179 Value *R = IRB.getInt32 (2 );
0 commit comments