@@ -185,13 +185,17 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
185
185
SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
186
186
SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , Int32VT);
187
187
SDValue Op2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 3 , Float32VT);
188
+ SDValue Op3 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 8 , Int32VT);
188
189
189
190
SDValue Add = DAG->getNode (ISD::ADD, DL, Int32VT, Op0, Op1);
190
191
SDValue Sub = DAG->getNode (ISD::SUB, DL, Int32VT, Add, Op0);
191
192
SDValue Mul = DAG->getNode (ISD::MUL, DL, Int32VT, Add, Sub);
192
193
SDValue And = DAG->getNode (ISD::AND, DL, Int32VT, Op0, Op1);
193
194
SDValue Xor = DAG->getNode (ISD::XOR, DL, Int32VT, Op1, Op0);
194
195
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);
195
199
SDValue SMax = DAG->getNode (ISD::SMAX, DL, Int32VT, Op0, Op1);
196
200
SDValue SMin = DAG->getNode (ISD::SMIN, DL, Int32VT, Op1, Op0);
197
201
SDValue UMax = DAG->getNode (ISD::UMAX, DL, Int32VT, Op0, Op1);
@@ -205,6 +209,7 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
205
209
EXPECT_TRUE (sd_match (Sub, m_Sub (m_Value (), m_Value ())));
206
210
EXPECT_TRUE (sd_match (Add, m_c_BinOp (ISD::ADD, m_Value (), m_Value ())));
207
211
EXPECT_TRUE (sd_match (Add, m_Add (m_Value (), m_Value ())));
212
+ EXPECT_TRUE (sd_match (Add, m_AddLike (m_Value (), m_Value ())));
208
213
EXPECT_TRUE (sd_match (
209
214
Mul, m_Mul (m_OneUse (m_Opc (ISD::SUB)), m_NUses<2 >(m_Specific (Add)))));
210
215
EXPECT_TRUE (
@@ -217,6 +222,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
217
222
EXPECT_TRUE (sd_match (Xor, m_Xor (m_Value (), m_Value ())));
218
223
EXPECT_TRUE (sd_match (Or, m_c_BinOp (ISD::OR, m_Value (), m_Value ())));
219
224
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 ())));
220
231
221
232
EXPECT_TRUE (sd_match (SMax, m_c_BinOp (ISD::SMAX, m_Value (), m_Value ())));
222
233
EXPECT_TRUE (sd_match (SMax, m_SMax (m_Value (), m_Value ())));
@@ -242,9 +253,14 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
242
253
243
254
SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
244
255
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);
246
258
247
259
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);
248
264
SDValue SExt = DAG->getNode (ISD::SIGN_EXTEND, DL, Int64VT, Op0);
249
265
SDValue Trunc = DAG->getNode (ISD::TRUNCATE, DL, Int32VT, Op1);
250
266
@@ -260,6 +276,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
260
276
using namespace SDPatternMatch ;
261
277
EXPECT_TRUE (sd_match (ZExt, m_UnaryOp (ISD::ZERO_EXTEND, m_Value ())));
262
278
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 ())));
263
286
EXPECT_TRUE (sd_match (Trunc, m_Trunc (m_Specific (Op1))));
264
287
265
288
EXPECT_TRUE (sd_match (Neg, m_Neg (m_Value ())));
0 commit comments