@@ -254,6 +254,59 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_ADD) {
254254 EXPECT_EQ (Known.One , APInt (8 , 0x55 ));
255255}
256256
257+ // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
258+ TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_UADDO_CARRY) {
259+ SDLoc Loc;
260+ auto IntVT = EVT::getIntegerVT (Context, 8 );
261+ auto UnknownOp = DAG->getRegister (0 , IntVT);
262+ auto Mask_Zero = DAG->getConstant (0x28 , Loc, IntVT);
263+ auto Mask_One = DAG->getConstant (0x20 , Loc, IntVT);
264+ auto N0 = DAG->getNode (ISD::AND, Loc, IntVT, Mask_Zero, UnknownOp);
265+ N0 = DAG->getNode (ISD::OR, Loc, IntVT, Mask_One, N0);
266+ auto N1 = DAG->getConstant (0x65 , Loc, IntVT);
267+
268+ KnownBits Known;
269+
270+ auto UnknownBorrow = DAG->getRegister (1 , IntVT);
271+ auto OpUnknownBorrow =
272+ DAG->getNode (ISD::UADDO_CARRY, Loc, IntVT, N0, N1, UnknownBorrow);
273+ // N0 = 0010?000
274+ // N1 = 01100101
275+ // B = ?
276+ // =>
277+ // Known.Zero = 01110000 (0x70)
278+ // Known.One = 10000100 (0x84)
279+ Known = DAG->computeKnownBits (OpUnknownBorrow);
280+ EXPECT_EQ (Known.Zero , APInt (8 , 0x70 ));
281+ EXPECT_EQ (Known.One , APInt (8 , 0x84 ));
282+
283+ auto ZeroBorrow = DAG->getConstant (0x0 , Loc, IntVT);
284+ auto OpZeroBorrow =
285+ DAG->getNode (ISD::UADDO_CARRY, Loc, IntVT, N0, N1, ZeroBorrow);
286+ // N0 = 0010?000
287+ // N1 = 01100101
288+ // B = 0
289+ // =>
290+ // Known.Zero = 01110010 (0x72)
291+ // Known.One = 10000101 (0x85)
292+ Known = DAG->computeKnownBits (OpZeroBorrow);
293+ EXPECT_EQ (Known.Zero , APInt (8 , 0x72 ));
294+ EXPECT_EQ (Known.One , APInt (8 , 0x85 ));
295+
296+ auto OneBorrow = DAG->getConstant (0x1 , Loc, IntVT);
297+ auto OpOneBorrow =
298+ DAG->getNode (ISD::UADDO_CARRY, Loc, IntVT, N0, N1, OneBorrow);
299+ // N0 = 0010?000
300+ // N1 = 01100101
301+ // B = 1
302+ // =>
303+ // Known.Zero = 01110001 (0x71)
304+ // Known.One = 10000110 (0x86)
305+ Known = DAG->computeKnownBits (OpOneBorrow);
306+ EXPECT_EQ (Known.Zero , APInt (8 , 0x71 ));
307+ EXPECT_EQ (Known.One , APInt (8 , 0x86 ));
308+ }
309+
257310// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
258311TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_SUB) {
259312 SDLoc Loc;
@@ -278,23 +331,53 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_USUBO_CARRY) {
278331 SDLoc Loc;
279332 auto IntVT = EVT::getIntegerVT (Context, 8 );
280333 auto N0 = DAG->getConstant (0x5a , Loc, IntVT);
281- auto UnknownOp1 = DAG->getRegister (0 , IntVT); // ????????
334+ auto UnknownOp = DAG->getRegister (0 , IntVT); // ????????
282335 auto Mask1_Zero = DAG->getConstant (0x8 , Loc, IntVT); // 00001000
283336 auto Mask1_One = DAG->getConstant (0x20 , Loc, IntVT); // 00100000
284337 // N1 = (???????? & 00001000) | 00100000 = 0010?000
285- auto N1 = DAG->getNode (ISD::AND, Loc, IntVT, Mask1_Zero, UnknownOp1 );
338+ auto N1 = DAG->getNode (ISD::AND, Loc, IntVT, Mask1_Zero, UnknownOp );
286339 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);
340+
341+ KnownBits Known;
342+
343+ auto UnknownBorrow = DAG->getRegister (1 , IntVT);
344+ auto OpUnknownBorrow =
345+ DAG->getNode (ISD::USUBO_CARRY, Loc, IntVT, N0, N1, UnknownBorrow);
289346 // N0 = 01011010
290347 // N1 = 0010?000
291- // C = ?
348+ // B = ?
292349 // =>
293350 // Known.Zero = 11000100 (0xc4)
294351 // Known.One = 00110000 (0x30)
295- KnownBits Known = DAG->computeKnownBits (Op );
352+ Known = DAG->computeKnownBits (OpUnknownBorrow );
296353 EXPECT_EQ (Known.Zero , APInt (8 , 0xc4 ));
297354 EXPECT_EQ (Known.One , APInt (8 , 0x30 ));
355+
356+ auto ZeroBorrow = DAG->getConstant (0x0 , Loc, IntVT);
357+ auto OpZeroBorrow =
358+ DAG->getNode (ISD::USUBO_CARRY, Loc, IntVT, N0, N1, ZeroBorrow);
359+ // N0 = 01011010
360+ // N1 = 0010?000
361+ // B = 0
362+ // =>
363+ // Known.Zero = 11000101 (0xc5)
364+ // Known.One = 00110010 (0x32)
365+ Known = DAG->computeKnownBits (OpZeroBorrow);
366+ EXPECT_EQ (Known.Zero , APInt (8 , 0xc5 ));
367+ EXPECT_EQ (Known.One , APInt (8 , 0x32 ));
368+
369+ auto OneBorrow = DAG->getConstant (0x1 , Loc, IntVT);
370+ auto OpOneBorrow =
371+ DAG->getNode (ISD::USUBO_CARRY, Loc, IntVT, N0, N1, OneBorrow);
372+ // N0 = 01011010
373+ // N1 = 0010?000
374+ // B = 1
375+ // =>
376+ // Known.Zero = 11000110 (0xc6)
377+ // Known.One = 00110001 (0x31)
378+ Known = DAG->computeKnownBits (OpOneBorrow);
379+ EXPECT_EQ (Known.Zero , APInt (8 , 0xc6 ));
380+ EXPECT_EQ (Known.One , APInt (8 , 0x31 ));
298381}
299382
300383TEST_F (AArch64SelectionDAGTest, isSplatValue_Fixed_BUILD_VECTOR) {
0 commit comments