@@ -318,6 +318,64 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_UADDO_CARRY) {
318318 EXPECT_EQ (Known.One , APInt (8 , 0x86 ));
319319}
320320
321+ // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
322+ TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_MOVI) {
323+ SDLoc Loc;
324+ auto Int8VT = EVT::getIntegerVT (Context, 8 );
325+ auto Int16VT = EVT::getIntegerVT (Context, 16 );
326+ auto Int32VT = EVT::getIntegerVT (Context, 32 );
327+ auto Int64VT = EVT::getIntegerVT (Context, 64 );
328+ auto N0 = DAG->getConstant (0xA5 , Loc, Int8VT);
329+ KnownBits Known;
330+
331+ auto OpMOVIedit = DAG->getNode (AArch64ISD::MOVIedit, Loc, Int64VT, N0);
332+ Known = DAG->computeKnownBits (OpMOVIedit);
333+ EXPECT_EQ (Known.Zero , APInt (64 , 0x00FF00FFFF00FF00 ));
334+ EXPECT_EQ (Known.One , APInt (64 , 0xFF00FF0000FF00FF ));
335+
336+ auto N1 = DAG->getConstant (16 , Loc, Int8VT);
337+ auto OpMOVImsl = DAG->getNode (AArch64ISD::MOVImsl, Loc, Int32VT, N0, N1);
338+ Known = DAG->computeKnownBits (OpMOVImsl);
339+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFF5A0000 ));
340+ EXPECT_EQ (Known.One , APInt (32 , 0x00A5FFFF ));
341+
342+ auto OpMVNImsl = DAG->getNode (AArch64ISD::MVNImsl, Loc, Int32VT, N0, N1);
343+ Known = DAG->computeKnownBits (OpMVNImsl);
344+ EXPECT_EQ (Known.Zero , APInt (32 , 0x00A50000 ));
345+ EXPECT_EQ (Known.One , APInt (32 , 0xFF5AFFFF ));
346+
347+ auto N2 = DAG->getConstant (16 , Loc, Int8VT);
348+ auto OpMOVIshift32 =
349+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int32VT, N0, N2);
350+ Known = DAG->computeKnownBits (OpMOVIshift32);
351+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFF5AFFFF ));
352+ EXPECT_EQ (Known.One , APInt (32 , 0x00A50000 ));
353+
354+ auto OpMVNIshift32 =
355+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int32VT, N0, N2);
356+ Known = DAG->computeKnownBits (OpMVNIshift32);
357+ EXPECT_EQ (Known.Zero , APInt (32 , 0x00A5FFFF ));
358+ EXPECT_EQ (Known.One , APInt (32 , 0xFF5A0000 ));
359+
360+ auto N3 = DAG->getConstant (8 , Loc, Int8VT);
361+ auto OpMOVIshift16 =
362+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int16VT, N0, N3);
363+ Known = DAG->computeKnownBits (OpMOVIshift16);
364+ EXPECT_EQ (Known.One , APInt (16 , 0xA500 ));
365+ EXPECT_EQ (Known.Zero , APInt (16 , 0x5AFF ));
366+
367+ auto OpMVNIshift16 =
368+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int16VT, N0, N3);
369+ Known = DAG->computeKnownBits (OpMVNIshift16);
370+ EXPECT_EQ (Known.Zero , APInt (16 , 0xA5FF ));
371+ EXPECT_EQ (Known.One , APInt (16 , 0x5A00 ));
372+
373+ auto OpMOVI = DAG->getNode (AArch64ISD::MOVI, Loc, Int8VT, N0);
374+ Known = DAG->computeKnownBits (OpMOVI);
375+ EXPECT_EQ (Known.Zero , APInt (8 , 0x5A ));
376+ EXPECT_EQ (Known.One , APInt (8 , 0xA5 ));
377+ }
378+
321379// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
322380TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_SUB) {
323381 SDLoc Loc;
0 commit comments