@@ -165,9 +165,15 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
165
165
SDValue Select = DAG->getSelect (DL, MVT::i1, Cond, T, F);
166
166
167
167
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);
168
171
SDValue V1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 6 , VInt32VT);
169
172
SDValue V2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 7 , VInt32VT);
173
+ SDValue V3 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 8 , SmallVInt32VT);
170
174
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);
171
177
172
178
SDValue ExtractELT =
173
179
DAG->getNode (ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3);
@@ -209,15 +215,33 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
209
215
EXPECT_TRUE (sd_match (ExtractELT, m_ExtractElt (m_Value (), m_Value ())));
210
216
EXPECT_TRUE (sd_match (ExtractELT, m_ExtractElt (m_Value (), m_ConstInt ())));
211
217
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 ))));
212
233
}
213
234
214
235
TEST_F (SelectionDAGPatternMatchTest, matchBinaryOp) {
215
236
SDLoc DL;
216
237
auto Int32VT = EVT::getIntegerVT (Context, 32 );
217
238
auto Float32VT = EVT::getFloatingPointVT (32 );
239
+ auto BigVInt32VT = EVT::getVectorVT (Context, Int32VT, 8 );
218
240
auto VInt32VT = EVT::getVectorVT (Context, Int32VT, 4 );
219
241
220
242
SDValue V1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 6 , VInt32VT);
243
+ auto Idx0 = DAG->getVectorIdxConstant (0 , DL);
244
+ auto Idx1 = DAG->getVectorIdxConstant (1 , DL);
221
245
222
246
SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Int32VT);
223
247
SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , Int32VT);
@@ -260,6 +284,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
260
284
SDValue SFAdd = DAG->getNode (ISD::STRICT_FADD, DL, {Float32VT, MVT::Other},
261
285
{DAG->getEntryNode (), Op2, Op2});
262
286
287
+ SDValue Vec = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 9 , BigVInt32VT);
288
+ SDValue SubVec =
289
+ DAG->getNode (ISD::EXTRACT_SUBVECTOR, DL, VInt32VT, Vec, Idx0);
290
+
263
291
SDValue InsertELT =
264
292
DAG->getNode (ISD::INSERT_VECTOR_ELT, DL, VInt32VT, V1, Op0, Op4);
265
293
@@ -320,6 +348,16 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
320
348
EXPECT_FALSE (sd_match (SFAdd, m_ChainedBinOp (ISD::STRICT_FADD, m_OtherVT (),
321
349
m_SpecificVT (Float32VT))));
322
350
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
+
323
361
EXPECT_TRUE (
324
362
sd_match (InsertELT, m_InsertElt (m_Value (), m_Value (), m_Value ())));
325
363
EXPECT_TRUE (
0 commit comments