@@ -165,9 +165,15 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
165165 SDValue Select = DAG->getSelect (DL, MVT::i1, Cond, T, F);
166166
167167 auto VInt32VT = EVT::getVectorVT (Context, Int32VT, 4 );
168+ auto SmallVInt32VT = EVT::getVectorVT (Context, Int32VT, 2 );
169+ auto Idx0 = DAG->getVectorIdxConstant (0 , DL);
170+ auto Idx3 = DAG->getVectorIdxConstant (3 , DL);
168171 SDValue V1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 6 , VInt32VT);
169172 SDValue V2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 7 , VInt32VT);
173+ SDValue V3 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 8 , SmallVInt32VT);
170174 SDValue VSelect = DAG->getNode (ISD::VSELECT, DL, VInt32VT, Cond, V1, V2);
175+ SDValue InsertSubvector =
176+ DAG->getNode (ISD::INSERT_SUBVECTOR, DL, VInt32VT, V2, V3, Idx0);
171177
172178 SDValue ExtractELT =
173179 DAG->getNode (ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3);
@@ -209,15 +215,33 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
209215 EXPECT_TRUE (sd_match (ExtractELT, m_ExtractElt (m_Value (), m_Value ())));
210216 EXPECT_TRUE (sd_match (ExtractELT, m_ExtractElt (m_Value (), m_ConstInt ())));
211217 EXPECT_TRUE (sd_match (ExtractELT, m_ExtractElt (m_Value (), m_SpecificInt (1 ))));
218+
219+ EXPECT_TRUE (sd_match (InsertSubvector,
220+ m_InsertSubvector (m_Value (), m_Value (), m_Value ())));
221+ EXPECT_TRUE (sd_match (
222+ InsertSubvector,
223+ m_InsertSubvector (m_Specific (V2), m_Specific (V3), m_Specific (Idx0))));
224+ EXPECT_TRUE (sd_match (
225+ InsertSubvector,
226+ m_InsertSubvector (m_Specific (V2), m_Specific (V3), m_SpecificInt (0 ))));
227+ EXPECT_FALSE (sd_match (
228+ InsertSubvector,
229+ m_InsertSubvector (m_Specific (V2), m_Specific (V3), m_Specific (Idx3))));
230+ EXPECT_FALSE (sd_match (
231+ InsertSubvector,
232+ m_InsertSubvector (m_Specific (V2), m_Specific (V3), m_SpecificInt (3 ))));
212233}
213234
214235TEST_F (SelectionDAGPatternMatchTest, matchBinaryOp) {
215236 SDLoc DL;
216237 auto Int32VT = EVT::getIntegerVT (Context, 32 );
217238 auto Float32VT = EVT::getFloatingPointVT (32 );
239+ auto BigVInt32VT = EVT::getVectorVT (Context, Int32VT, 8 );
218240 auto VInt32VT = EVT::getVectorVT (Context, Int32VT, 4 );
219241
220242 SDValue V1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 6 , VInt32VT);
243+ auto Idx0 = DAG->getVectorIdxConstant (0 , DL);
244+ auto Idx1 = DAG->getVectorIdxConstant (1 , DL);
221245
222246 SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
223247 SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , Int32VT);
@@ -260,6 +284,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
260284 SDValue SFAdd = DAG->getNode (ISD::STRICT_FADD, DL, {Float32VT, MVT::Other},
261285 {DAG->getEntryNode (), Op2, Op2});
262286
287+ SDValue Vec = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 9 , BigVInt32VT);
288+ SDValue SubVec =
289+ DAG->getNode (ISD::EXTRACT_SUBVECTOR, DL, VInt32VT, Vec, Idx0);
290+
263291 SDValue InsertELT =
264292 DAG->getNode (ISD::INSERT_VECTOR_ELT, DL, VInt32VT, V1, Op0, Op4);
265293
@@ -320,6 +348,16 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
320348 EXPECT_FALSE (sd_match (SFAdd, m_ChainedBinOp (ISD::STRICT_FADD, m_OtherVT (),
321349 m_SpecificVT (Float32VT))));
322350
351+ EXPECT_TRUE (sd_match (SubVec, m_ExtractSubvector (m_Value (), m_Value ())));
352+ EXPECT_TRUE (
353+ sd_match (SubVec, m_ExtractSubvector (m_Specific (Vec), m_Specific (Idx0))));
354+ EXPECT_TRUE (
355+ sd_match (SubVec, m_ExtractSubvector (m_Specific (Vec), m_SpecificInt (0 ))));
356+ EXPECT_FALSE (
357+ sd_match (SubVec, m_ExtractSubvector (m_Specific (Vec), m_Specific (Idx1))));
358+ EXPECT_FALSE (
359+ sd_match (SubVec, m_ExtractSubvector (m_Specific (Vec), m_SpecificInt (1 ))));
360+
323361 EXPECT_TRUE (
324362 sd_match (InsertELT, m_InsertElt (m_Value (), m_Value (), m_Value ())));
325363 EXPECT_TRUE (
0 commit comments