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