@@ -273,6 +273,30 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_SUB) {
273273 EXPECT_EQ (Known.One , APInt (8 , 0x1 ));
274274}
275275
276+ // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
277+ TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_USUBO_CARRY) {
278+ SDLoc Loc;
279+ auto IntVT = EVT::getIntegerVT (Context, 8 );
280+ auto N0 = DAG->getConstant (0x5a , Loc, IntVT);
281+ auto UnknownOp1 = DAG->getRegister (0 , IntVT); // ????????
282+ auto Mask1_Zero = DAG->getConstant (0x8 , Loc, IntVT); // 00001000
283+ auto Mask1_One = DAG->getConstant (0x20 , Loc, IntVT); // 00100000
284+ // N1 = (???????? & 00001000) | 00100000 = 0010?000
285+ auto N1 = DAG->getNode (ISD::AND, Loc, IntVT, Mask1_Zero, UnknownOp1);
286+ N1 = DAG->getNode (ISD::OR, Loc, IntVT, Mask1_One, N1);
287+ auto UnknownOpC = DAG->getRegister (1 , IntVT);
288+ auto Op = DAG->getNode (ISD::USUBO_CARRY, Loc, IntVT, N0, N1, UnknownOpC);
289+ // N0 = 01011010
290+ // N1 = 0010?000
291+ // C = ?
292+ // =>
293+ // Known.Zero = 11000100 (0xc4)
294+ // Known.One = 00110000 (0x30)
295+ KnownBits Known = DAG->computeKnownBits (Op);
296+ EXPECT_EQ (Known.Zero , APInt (8 , 0xc4 ));
297+ EXPECT_EQ (Known.One , APInt (8 , 0x30 ));
298+ }
299+
276300TEST_F (AArch64SelectionDAGTest, isSplatValue_Fixed_BUILD_VECTOR) {
277301 TargetLowering TL (*TM);
278302
0 commit comments