@@ -383,6 +383,10 @@ struct VPMatchContext : public SDPatternMatch::BasicMatchContext {
383
383
auto BaseOpc = ISD::getBaseOpcodeForVP (OpVal->getOpcode (), false );
384
384
return BaseOpc.has_value () && *BaseOpc == Opc;
385
385
}
386
+
387
+ unsigned getNumOperands (SDValue N) const {
388
+ return N->isVPOpcode () ? N->getNumOperands () - 2 : N->getNumOperands ();
389
+ }
386
390
};
387
391
} // anonymous namespace
388
392
TEST_F (SelectionDAGPatternMatchTest, matchContext) {
@@ -400,15 +404,54 @@ TEST_F(SelectionDAGPatternMatchTest, matchContext) {
400
404
{Vector0, Vector0, Mask0, Scalar0});
401
405
SDValue VPReduceAdd = DAG->getNode (ISD::VP_REDUCE_ADD, DL, Int32VT,
402
406
{Scalar0, VPAdd, Mask0, Scalar0});
407
+ SDValue Add = DAG->getNode (ISD::ADD, DL, VInt32VT, {Vector0, Vector0});
403
408
404
409
using namespace SDPatternMatch ;
405
410
VPMatchContext VPCtx (DAG.get ());
406
411
EXPECT_TRUE (sd_context_match (VPAdd, VPCtx, m_Opc (ISD::ADD)));
412
+ EXPECT_TRUE (
413
+ sd_context_match (VPAdd, VPCtx, m_Node (ISD::ADD, m_Value (), m_Value ())));
414
+ // VPMatchContext can't match pattern using explicit VP Opcode
415
+ EXPECT_FALSE (sd_context_match (VPAdd, VPCtx,
416
+ m_Node (ISD::VP_ADD, m_Value (), m_Value ())));
417
+ EXPECT_FALSE (sd_context_match (
418
+ VPAdd, VPCtx,
419
+ m_Node (ISD::VP_ADD, m_Value (), m_Value (), m_Value (), m_Value ())));
420
+ // Check Binary Op Pattern
421
+ EXPECT_TRUE (sd_context_match (VPAdd, VPCtx, m_Add (m_Value (), m_Value ())));
407
422
// VP_REDUCE_ADD doesn't have a based opcode, so we use a normal
408
423
// sd_match before switching to VPMatchContext when checking VPAdd.
409
424
EXPECT_TRUE (sd_match (VPReduceAdd, m_Node (ISD::VP_REDUCE_ADD, m_Value (),
410
425
m_Context (VPCtx, m_Opc (ISD::ADD)),
411
426
m_Value (), m_Value ())));
427
+ // non-vector predicated should match too
428
+ EXPECT_TRUE (sd_context_match (Add, VPCtx, m_Opc (ISD::ADD)));
429
+ EXPECT_TRUE (
430
+ sd_context_match (Add, VPCtx, m_Node (ISD::ADD, m_Value (), m_Value ())));
431
+ EXPECT_FALSE (sd_context_match (
432
+ Add, VPCtx,
433
+ m_Node (ISD::ADD, m_Value (), m_Value (), m_Value (), m_Value ())));
434
+ EXPECT_TRUE (sd_context_match (Add, VPCtx, m_Add (m_Value (), m_Value ())));
435
+ }
436
+
437
+ TEST_F (SelectionDAGPatternMatchTest, matchVPWithBasicContext) {
438
+ SDLoc DL;
439
+ auto BoolVT = EVT::getIntegerVT (Context, 1 );
440
+ auto Int32VT = EVT::getIntegerVT (Context, 32 );
441
+ auto VInt32VT = EVT::getVectorVT (Context, Int32VT, 4 );
442
+ auto MaskVT = EVT::getVectorVT (Context, BoolVT, 4 );
443
+
444
+ SDValue Vector0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , VInt32VT);
445
+ SDValue Mask = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , MaskVT);
446
+ SDValue EL = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 3 , Int32VT);
447
+
448
+ SDValue VPAdd =
449
+ DAG->getNode (ISD::VP_ADD, DL, VInt32VT, Vector0, Vector0, Mask, EL);
450
+
451
+ using namespace SDPatternMatch ;
452
+ EXPECT_FALSE (sd_match (VPAdd, m_Node (ISD::VP_ADD, m_Value (), m_Value ())));
453
+ EXPECT_TRUE (sd_match (
454
+ VPAdd, m_Node (ISD::VP_ADD, m_Value (), m_Value (), m_Value (), m_Value ())));
412
455
}
413
456
414
457
TEST_F (SelectionDAGPatternMatchTest, matchAdvancedProperties) {
0 commit comments