@@ -254,6 +254,59 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_ADD) {
254
254
EXPECT_EQ (Known.One , APInt (8 , 0x55 ));
255
255
}
256
256
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
+
257
310
// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
258
311
TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_SUB) {
259
312
SDLoc Loc;
@@ -278,23 +331,53 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_USUBO_CARRY) {
278
331
SDLoc Loc;
279
332
auto IntVT = EVT::getIntegerVT (Context, 8 );
280
333
auto N0 = DAG->getConstant (0x5a , Loc, IntVT);
281
- auto UnknownOp1 = DAG->getRegister (0 , IntVT); // ????????
334
+ auto UnknownOp = DAG->getRegister (0 , IntVT); // ????????
282
335
auto Mask1_Zero = DAG->getConstant (0x8 , Loc, IntVT); // 00001000
283
336
auto Mask1_One = DAG->getConstant (0x20 , Loc, IntVT); // 00100000
284
337
// 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 );
286
339
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);
289
346
// N0 = 01011010
290
347
// N1 = 0010?000
291
- // C = ?
348
+ // B = ?
292
349
// =>
293
350
// Known.Zero = 11000100 (0xc4)
294
351
// Known.One = 00110000 (0x30)
295
- KnownBits Known = DAG->computeKnownBits (Op );
352
+ Known = DAG->computeKnownBits (OpUnknownBorrow );
296
353
EXPECT_EQ (Known.Zero , APInt (8 , 0xc4 ));
297
354
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 ));
298
381
}
299
382
300
383
TEST_F (AArch64SelectionDAGTest, isSplatValue_Fixed_BUILD_VECTOR) {
0 commit comments