@@ -22,7 +22,7 @@ using namespace llvm;
22
22
23
23
namespace {
24
24
25
- class MatchSelectPatternTest : public testing ::Test {
25
+ class ValueTrackingTest : public testing ::Test {
26
26
protected:
27
27
void parseAssembly (const char *Assembly) {
28
28
SMDiagnostic Error;
@@ -51,6 +51,13 @@ class MatchSelectPatternTest : public testing::Test {
51
51
report_fatal_error (" @test must have an instruction %A" );
52
52
}
53
53
54
+ LLVMContext Context;
55
+ std::unique_ptr<Module> M;
56
+ Instruction *A;
57
+ };
58
+
59
+ class MatchSelectPatternTest : public ValueTrackingTest {
60
+ protected:
54
61
void expectPattern (const SelectPatternResult &P) {
55
62
Value *LHS, *RHS;
56
63
Instruction::CastOps CastOp;
@@ -59,10 +66,16 @@ class MatchSelectPatternTest : public testing::Test {
59
66
EXPECT_EQ (P.NaNBehavior , R.NaNBehavior );
60
67
EXPECT_EQ (P.Ordered , R.Ordered );
61
68
}
69
+ };
62
70
63
- LLVMContext Context;
64
- std::unique_ptr<Module> M;
65
- Instruction *A, *B;
71
+ class ComputeKnownBitsTest : public ValueTrackingTest {
72
+ protected:
73
+ void expectKnownBits (uint64_t Zero, uint64_t One) {
74
+ auto Known = computeKnownBits (A, M->getDataLayout ());
75
+ ASSERT_FALSE (Known.hasConflict ());
76
+ EXPECT_EQ (Known.One .getZExtValue (), One);
77
+ EXPECT_EQ (Known.Zero .getZExtValue (), Zero);
78
+ }
66
79
};
67
80
68
81
}
@@ -497,117 +510,61 @@ TEST(ValueTracking, GuaranteedToTransferExecutionToSuccessor) {
497
510
}
498
511
}
499
512
500
- TEST (ValueTracking, ComputeNumSignBits_PR32045) {
501
- StringRef Assembly = " define i32 @f(i32 %a) { "
502
- " %val = ashr i32 %a, -1 "
503
- " ret i32 %val "
504
- " } " ;
505
-
506
- LLVMContext Context;
507
- SMDiagnostic Error;
508
- auto M = parseAssemblyString (Assembly, Error, Context);
509
- assert (M && " Bad assembly?" );
510
-
511
- auto *F = M->getFunction (" f" );
512
- assert (F && " Bad assembly?" );
513
-
514
- auto *RVal =
515
- cast<ReturnInst>(F->getEntryBlock ().getTerminator ())->getOperand (0 );
516
- EXPECT_EQ (ComputeNumSignBits (RVal, M->getDataLayout ()), 1u );
513
+ TEST_F (ValueTrackingTest, ComputeNumSignBits_PR32045) {
514
+ parseAssembly (
515
+ " define i32 @test(i32 %a) {\n "
516
+ " %A = ashr i32 %a, -1\n "
517
+ " ret i32 %A\n "
518
+ " }\n " );
519
+ EXPECT_EQ (ComputeNumSignBits (A, M->getDataLayout ()), 1u );
517
520
}
518
521
519
522
// No guarantees for canonical IR in this analysis, so this just bails out.
520
- TEST (ValueTracking, ComputeNumSignBits_Shuffle) {
521
- StringRef Assembly = " define <2 x i32> @f() { "
522
- " %val = shufflevector <2 x i32> undef, <2 x i32> undef, <2 x i32> <i32 0, i32 0> "
523
- " ret <2 x i32> %val "
524
- " } " ;
525
-
526
- LLVMContext Context;
527
- SMDiagnostic Error;
528
- auto M = parseAssemblyString (Assembly, Error, Context);
529
- assert (M && " Bad assembly?" );
530
-
531
- auto *F = M->getFunction (" f" );
532
- assert (F && " Bad assembly?" );
533
-
534
- auto *RVal =
535
- cast<ReturnInst>(F->getEntryBlock ().getTerminator ())->getOperand (0 );
536
- EXPECT_EQ (ComputeNumSignBits (RVal, M->getDataLayout ()), 1u );
523
+ TEST_F (ValueTrackingTest, ComputeNumSignBits_Shuffle) {
524
+ parseAssembly (
525
+ " define <2 x i32> @test() {\n "
526
+ " %A = shufflevector <2 x i32> undef, <2 x i32> undef, <2 x i32> <i32 0, i32 0>\n "
527
+ " ret <2 x i32> %A\n "
528
+ " }\n " );
529
+ EXPECT_EQ (ComputeNumSignBits (A, M->getDataLayout ()), 1u );
537
530
}
538
531
539
532
// No guarantees for canonical IR in this analysis, so a shuffle element that
540
533
// references an undef value means this can't return any extra information.
541
- TEST (ValueTracking, ComputeNumSignBits_Shuffle2) {
542
- StringRef Assembly = " define <2 x i32> @f(<2 x i1> %x) { "
543
- " %sext = sext <2 x i1> %x to <2 x i32> "
544
- " %val = shufflevector <2 x i32> %sext, <2 x i32> undef, <2 x i32> <i32 0, i32 2> "
545
- " ret <2 x i32> %val "
546
- " } " ;
547
-
548
- LLVMContext Context;
549
- SMDiagnostic Error;
550
- auto M = parseAssemblyString (Assembly, Error, Context);
551
- assert (M && " Bad assembly?" );
552
-
553
- auto *F = M->getFunction (" f" );
554
- assert (F && " Bad assembly?" );
555
-
556
- auto *RVal =
557
- cast<ReturnInst>(F->getEntryBlock ().getTerminator ())->getOperand (0 );
558
- EXPECT_EQ (ComputeNumSignBits (RVal, M->getDataLayout ()), 1u );
534
+ TEST_F (ValueTrackingTest, ComputeNumSignBits_Shuffle2) {
535
+ parseAssembly (
536
+ " define <2 x i32> @test(<2 x i1> %x) {\n "
537
+ " %sext = sext <2 x i1> %x to <2 x i32>\n "
538
+ " %A = shufflevector <2 x i32> %sext, <2 x i32> undef, <2 x i32> <i32 0, i32 2>\n "
539
+ " ret <2 x i32> %A\n "
540
+ " }\n " );
541
+ EXPECT_EQ (ComputeNumSignBits (A, M->getDataLayout ()), 1u );
559
542
}
560
543
561
- TEST (ValueTracking, ComputeKnownBits) {
562
- StringRef Assembly = " define i32 @f(i32 %a, i32 %b) { "
563
- " %ash = mul i32 %a, 8 "
564
- " %aad = add i32 %ash, 7 "
565
- " %aan = and i32 %aad, 4095 "
566
- " %bsh = shl i32 %b, 4 "
567
- " %bad = or i32 %bsh, 6 "
568
- " %ban = and i32 %bad, 4095 "
569
- " %mul = mul i32 %aan, %ban "
570
- " ret i32 %mul "
571
- " } " ;
572
-
573
- LLVMContext Context;
574
- SMDiagnostic Error;
575
- auto M = parseAssemblyString (Assembly, Error, Context);
576
- assert (M && " Bad assembly?" );
577
-
578
- auto *F = M->getFunction (" f" );
579
- assert (F && " Bad assembly?" );
580
-
581
- auto *RVal =
582
- cast<ReturnInst>(F->getEntryBlock ().getTerminator ())->getOperand (0 );
583
- auto Known = computeKnownBits (RVal, M->getDataLayout ());
584
- ASSERT_FALSE (Known.hasConflict ());
585
- EXPECT_EQ (Known.One .getZExtValue (), 10u );
586
- EXPECT_EQ (Known.Zero .getZExtValue (), 4278190085u );
544
+ TEST_F (ComputeKnownBitsTest, ComputeKnownBits) {
545
+ parseAssembly (
546
+ " define i32 @test(i32 %a, i32 %b) {\n "
547
+ " %ash = mul i32 %a, 8\n "
548
+ " %aad = add i32 %ash, 7\n "
549
+ " %aan = and i32 %aad, 4095\n "
550
+ " %bsh = shl i32 %b, 4\n "
551
+ " %bad = or i32 %bsh, 6\n "
552
+ " %ban = and i32 %bad, 4095\n "
553
+ " %A = mul i32 %aan, %ban\n "
554
+ " ret i32 %A\n "
555
+ " }\n " );
556
+ expectKnownBits (/* zero*/ 4278190085u , /* one*/ 10u );
587
557
}
588
558
589
- TEST (ValueTracking, ComputeKnownMulBits) {
590
- StringRef Assembly = " define i32 @f(i32 %a, i32 %b) { "
591
- " %aa = shl i32 %a, 5 "
592
- " %bb = shl i32 %b, 5 "
593
- " %aaa = or i32 %aa, 24 "
594
- " %bbb = or i32 %bb, 28 "
595
- " %mul = mul i32 %aaa, %bbb "
596
- " ret i32 %mul "
597
- " } " ;
598
-
599
- LLVMContext Context;
600
- SMDiagnostic Error;
601
- auto M = parseAssemblyString (Assembly, Error, Context);
602
- assert (M && " Bad assembly?" );
603
-
604
- auto *F = M->getFunction (" f" );
605
- assert (F && " Bad assembly?" );
606
-
607
- auto *RVal =
608
- cast<ReturnInst>(F->getEntryBlock ().getTerminator ())->getOperand (0 );
609
- auto Known = computeKnownBits (RVal, M->getDataLayout ());
610
- ASSERT_FALSE (Known.hasConflict ());
611
- EXPECT_EQ (Known.One .getZExtValue (), 32u );
612
- EXPECT_EQ (Known.Zero .getZExtValue (), 95u );
559
+ TEST_F (ComputeKnownBitsTest, ComputeKnownMulBits) {
560
+ parseAssembly (
561
+ " define i32 @test(i32 %a, i32 %b) {\n "
562
+ " %aa = shl i32 %a, 5\n "
563
+ " %bb = shl i32 %b, 5\n "
564
+ " %aaa = or i32 %aa, 24\n "
565
+ " %bbb = or i32 %bb, 28\n "
566
+ " %A = mul i32 %aaa, %bbb\n "
567
+ " ret i32 %A\n "
568
+ " }\n " );
569
+ expectKnownBits (/* zero*/ 95u , /* one*/ 32u );
613
570
}
0 commit comments