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