@@ -185,13 +185,17 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
185185 SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
186186 SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , Int32VT);
187187 SDValue Op2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 3 , Float32VT);
188+ SDValue Op3 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 8 , Int32VT);
188189
189190 SDValue Add = DAG->getNode (ISD::ADD, DL, Int32VT, Op0, Op1);
190191 SDValue Sub = DAG->getNode (ISD::SUB, DL, Int32VT, Add, Op0);
191192 SDValue Mul = DAG->getNode (ISD::MUL, DL, Int32VT, Add, Sub);
192193 SDValue And = DAG->getNode (ISD::AND, DL, Int32VT, Op0, Op1);
193194 SDValue Xor = DAG->getNode (ISD::XOR, DL, Int32VT, Op1, Op0);
194195 SDValue Or = DAG->getNode (ISD::OR, DL, Int32VT, Op0, Op1);
196+ SDNodeFlags DisFlags;
197+ DisFlags.setDisjoint (true );
198+ SDValue DisOr = DAG->getNode (ISD::OR, DL, Int32VT, Op0, Op3, DisFlags);
195199 SDValue SMax = DAG->getNode (ISD::SMAX, DL, Int32VT, Op0, Op1);
196200 SDValue SMin = DAG->getNode (ISD::SMIN, DL, Int32VT, Op1, Op0);
197201 SDValue UMax = DAG->getNode (ISD::UMAX, DL, Int32VT, Op0, Op1);
@@ -205,6 +209,7 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
205209 EXPECT_TRUE (sd_match (Sub, m_Sub (m_Value (), m_Value ())));
206210 EXPECT_TRUE (sd_match (Add, m_c_BinOp (ISD::ADD, m_Value (), m_Value ())));
207211 EXPECT_TRUE (sd_match (Add, m_Add (m_Value (), m_Value ())));
212+ EXPECT_TRUE (sd_match (Add, m_AddLike (m_Value (), m_Value ())));
208213 EXPECT_TRUE (sd_match (
209214 Mul, m_Mul (m_OneUse (m_Opc (ISD::SUB)), m_NUses<2 >(m_Specific (Add)))));
210215 EXPECT_TRUE (
@@ -217,6 +222,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
217222 EXPECT_TRUE (sd_match (Xor, m_Xor (m_Value (), m_Value ())));
218223 EXPECT_TRUE (sd_match (Or, m_c_BinOp (ISD::OR, m_Value (), m_Value ())));
219224 EXPECT_TRUE (sd_match (Or, m_Or (m_Value (), m_Value ())));
225+ EXPECT_FALSE (sd_match (Or, m_DisjointOr (m_Value (), m_Value ())));
226+
227+ EXPECT_TRUE (sd_match (DisOr, m_Or (m_Value (), m_Value ())));
228+ EXPECT_TRUE (sd_match (DisOr, m_DisjointOr (m_Value (), m_Value ())));
229+ EXPECT_FALSE (sd_match (DisOr, m_Add (m_Value (), m_Value ())));
230+ EXPECT_TRUE (sd_match (DisOr, m_AddLike (m_Value (), m_Value ())));
220231
221232 EXPECT_TRUE (sd_match (SMax, m_c_BinOp (ISD::SMAX, m_Value (), m_Value ())));
222233 EXPECT_TRUE (sd_match (SMax, m_SMax (m_Value (), m_Value ())));
@@ -242,9 +253,14 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
242253
243254 SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
244255 SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int64VT);
245- SDValue Op2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , FloatVT);
256+ SDValue Op2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , FloatVT);
257+ SDValue Op3 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 3 , Int32VT);
246258
247259 SDValue ZExt = DAG->getNode (ISD::ZERO_EXTEND, DL, Int64VT, Op0);
260+ SDNodeFlags NNegFlags;
261+ NNegFlags.setNonNeg (true );
262+ SDValue ZExtNNeg =
263+ DAG->getNode (ISD::ZERO_EXTEND, DL, Int64VT, Op3, NNegFlags);
248264 SDValue SExt = DAG->getNode (ISD::SIGN_EXTEND, DL, Int64VT, Op0);
249265 SDValue Trunc = DAG->getNode (ISD::TRUNCATE, DL, Int32VT, Op1);
250266
@@ -260,6 +276,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
260276 using namespace SDPatternMatch ;
261277 EXPECT_TRUE (sd_match (ZExt, m_UnaryOp (ISD::ZERO_EXTEND, m_Value ())));
262278 EXPECT_TRUE (sd_match (SExt, m_SExt (m_Value ())));
279+ EXPECT_TRUE (sd_match (SExt, m_SExtLike (m_Value ())));
280+ ASSERT_TRUE (ZExtNNeg->getFlags ().hasNonNeg ());
281+ EXPECT_FALSE (sd_match (ZExtNNeg, m_SExt (m_Value ())));
282+ EXPECT_TRUE (sd_match (ZExtNNeg, m_NNegZExt (m_Value ())));
283+ EXPECT_FALSE (sd_match (ZExt, m_NNegZExt (m_Value ())));
284+ EXPECT_TRUE (sd_match (ZExtNNeg, m_SExtLike (m_Value ())));
285+ EXPECT_FALSE (sd_match (ZExt, m_SExtLike (m_Value ())));
263286 EXPECT_TRUE (sd_match (Trunc, m_Trunc (m_Specific (Op1))));
264287
265288 EXPECT_TRUE (sd_match (Neg, m_Neg (m_Value ())));
0 commit comments