[llvm] r348043 - [ValueTracking] Make unit tests easier to write; NFC
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 30 14:22:30 PST 2018
Author: nikic
Date: Fri Nov 30 14:22:30 2018
New Revision: 348043
URL: http://llvm.org/viewvc/llvm-project?rev=348043&view=rev
Log:
[ValueTracking] Make unit tests easier to write; NFC
Generalize the existing MatchSelectPatternTest class to also work
with other types of tests. This reduces the amount of boilerplate
necessary to write ValueTracking tests in general, and computeKnownBits
tests in particular.
The inherited convention is that the function must be @test and the
tested instruction %A.
Differential Revision: https://reviews.llvm.org/D55141
Modified:
llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp
Modified: llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp?rev=348043&r1=348042&r2=348043&view=diff
==============================================================================
--- llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp (original)
+++ llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp Fri Nov 30 14:22:30 2018
@@ -22,7 +22,7 @@ using namespace llvm;
namespace {
-class MatchSelectPatternTest : public testing::Test {
+class ValueTrackingTest : public testing::Test {
protected:
void parseAssembly(const char *Assembly) {
SMDiagnostic Error;
@@ -51,6 +51,13 @@ protected:
report_fatal_error("@test must have an instruction %A");
}
+ LLVMContext Context;
+ std::unique_ptr<Module> M;
+ Instruction *A;
+};
+
+class MatchSelectPatternTest : public ValueTrackingTest {
+protected:
void expectPattern(const SelectPatternResult &P) {
Value *LHS, *RHS;
Instruction::CastOps CastOp;
@@ -59,10 +66,16 @@ protected:
EXPECT_EQ(P.NaNBehavior, R.NaNBehavior);
EXPECT_EQ(P.Ordered, R.Ordered);
}
+};
- LLVMContext Context;
- std::unique_ptr<Module> M;
- Instruction *A, *B;
+class ComputeKnownBitsTest : public ValueTrackingTest {
+protected:
+ void expectKnownBits(uint64_t Zero, uint64_t One) {
+ auto Known = computeKnownBits(A, M->getDataLayout());
+ ASSERT_FALSE(Known.hasConflict());
+ EXPECT_EQ(Known.One.getZExtValue(), One);
+ EXPECT_EQ(Known.Zero.getZExtValue(), Zero);
+ }
};
}
@@ -497,117 +510,61 @@ TEST(ValueTracking, GuaranteedToTransfer
}
}
-TEST(ValueTracking, ComputeNumSignBits_PR32045) {
- StringRef Assembly = "define i32 @f(i32 %a) { "
- " %val = ashr i32 %a, -1 "
- " ret i32 %val "
- "} ";
-
- LLVMContext Context;
- SMDiagnostic Error;
- auto M = parseAssemblyString(Assembly, Error, Context);
- assert(M && "Bad assembly?");
-
- auto *F = M->getFunction("f");
- assert(F && "Bad assembly?");
-
- auto *RVal =
- cast<ReturnInst>(F->getEntryBlock().getTerminator())->getOperand(0);
- EXPECT_EQ(ComputeNumSignBits(RVal, M->getDataLayout()), 1u);
+TEST_F(ValueTrackingTest, ComputeNumSignBits_PR32045) {
+ parseAssembly(
+ "define i32 @test(i32 %a) {\n"
+ " %A = ashr i32 %a, -1\n"
+ " ret i32 %A\n"
+ "}\n");
+ EXPECT_EQ(ComputeNumSignBits(A, M->getDataLayout()), 1u);
}
// No guarantees for canonical IR in this analysis, so this just bails out.
-TEST(ValueTracking, ComputeNumSignBits_Shuffle) {
- StringRef Assembly = "define <2 x i32> @f() { "
- " %val = shufflevector <2 x i32> undef, <2 x i32> undef, <2 x i32> <i32 0, i32 0> "
- " ret <2 x i32> %val "
- "} ";
-
- LLVMContext Context;
- SMDiagnostic Error;
- auto M = parseAssemblyString(Assembly, Error, Context);
- assert(M && "Bad assembly?");
-
- auto *F = M->getFunction("f");
- assert(F && "Bad assembly?");
-
- auto *RVal =
- cast<ReturnInst>(F->getEntryBlock().getTerminator())->getOperand(0);
- EXPECT_EQ(ComputeNumSignBits(RVal, M->getDataLayout()), 1u);
+TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle) {
+ parseAssembly(
+ "define <2 x i32> @test() {\n"
+ " %A = shufflevector <2 x i32> undef, <2 x i32> undef, <2 x i32> <i32 0, i32 0>\n"
+ " ret <2 x i32> %A\n"
+ "}\n");
+ EXPECT_EQ(ComputeNumSignBits(A, M->getDataLayout()), 1u);
}
// No guarantees for canonical IR in this analysis, so a shuffle element that
// references an undef value means this can't return any extra information.
-TEST(ValueTracking, ComputeNumSignBits_Shuffle2) {
- StringRef Assembly = "define <2 x i32> @f(<2 x i1> %x) { "
- " %sext = sext <2 x i1> %x to <2 x i32> "
- " %val = shufflevector <2 x i32> %sext, <2 x i32> undef, <2 x i32> <i32 0, i32 2> "
- " ret <2 x i32> %val "
- "} ";
-
- LLVMContext Context;
- SMDiagnostic Error;
- auto M = parseAssemblyString(Assembly, Error, Context);
- assert(M && "Bad assembly?");
-
- auto *F = M->getFunction("f");
- assert(F && "Bad assembly?");
-
- auto *RVal =
- cast<ReturnInst>(F->getEntryBlock().getTerminator())->getOperand(0);
- EXPECT_EQ(ComputeNumSignBits(RVal, M->getDataLayout()), 1u);
-}
-
-TEST(ValueTracking, ComputeKnownBits) {
- StringRef Assembly = "define i32 @f(i32 %a, i32 %b) { "
- " %ash = mul i32 %a, 8 "
- " %aad = add i32 %ash, 7 "
- " %aan = and i32 %aad, 4095 "
- " %bsh = shl i32 %b, 4 "
- " %bad = or i32 %bsh, 6 "
- " %ban = and i32 %bad, 4095 "
- " %mul = mul i32 %aan, %ban "
- " ret i32 %mul "
- "} ";
-
- LLVMContext Context;
- SMDiagnostic Error;
- auto M = parseAssemblyString(Assembly, Error, Context);
- assert(M && "Bad assembly?");
-
- auto *F = M->getFunction("f");
- assert(F && "Bad assembly?");
-
- auto *RVal =
- cast<ReturnInst>(F->getEntryBlock().getTerminator())->getOperand(0);
- auto Known = computeKnownBits(RVal, M->getDataLayout());
- ASSERT_FALSE(Known.hasConflict());
- EXPECT_EQ(Known.One.getZExtValue(), 10u);
- EXPECT_EQ(Known.Zero.getZExtValue(), 4278190085u);
-}
-
-TEST(ValueTracking, ComputeKnownMulBits) {
- StringRef Assembly = "define i32 @f(i32 %a, i32 %b) { "
- " %aa = shl i32 %a, 5 "
- " %bb = shl i32 %b, 5 "
- " %aaa = or i32 %aa, 24 "
- " %bbb = or i32 %bb, 28 "
- " %mul = mul i32 %aaa, %bbb "
- " ret i32 %mul "
- "} ";
-
- LLVMContext Context;
- SMDiagnostic Error;
- auto M = parseAssemblyString(Assembly, Error, Context);
- assert(M && "Bad assembly?");
-
- auto *F = M->getFunction("f");
- assert(F && "Bad assembly?");
+TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle2) {
+ parseAssembly(
+ "define <2 x i32> @test(<2 x i1> %x) {\n"
+ " %sext = sext <2 x i1> %x to <2 x i32>\n"
+ " %A = shufflevector <2 x i32> %sext, <2 x i32> undef, <2 x i32> <i32 0, i32 2>\n"
+ " ret <2 x i32> %A\n"
+ "}\n");
+ EXPECT_EQ(ComputeNumSignBits(A, M->getDataLayout()), 1u);
+}
+
+TEST_F(ComputeKnownBitsTest, ComputeKnownBits) {
+ parseAssembly(
+ "define i32 @test(i32 %a, i32 %b) {\n"
+ " %ash = mul i32 %a, 8\n"
+ " %aad = add i32 %ash, 7\n"
+ " %aan = and i32 %aad, 4095\n"
+ " %bsh = shl i32 %b, 4\n"
+ " %bad = or i32 %bsh, 6\n"
+ " %ban = and i32 %bad, 4095\n"
+ " %A = mul i32 %aan, %ban\n"
+ " ret i32 %A\n"
+ "}\n");
+ expectKnownBits(/*zero*/ 4278190085u, /*one*/ 10u);
+}
- auto *RVal =
- cast<ReturnInst>(F->getEntryBlock().getTerminator())->getOperand(0);
- auto Known = computeKnownBits(RVal, M->getDataLayout());
- ASSERT_FALSE(Known.hasConflict());
- EXPECT_EQ(Known.One.getZExtValue(), 32u);
- EXPECT_EQ(Known.Zero.getZExtValue(), 95u);
+TEST_F(ComputeKnownBitsTest, ComputeKnownMulBits) {
+ parseAssembly(
+ "define i32 @test(i32 %a, i32 %b) {\n"
+ " %aa = shl i32 %a, 5\n"
+ " %bb = shl i32 %b, 5\n"
+ " %aaa = or i32 %aa, 24\n"
+ " %bbb = or i32 %bb, 28\n"
+ " %A = mul i32 %aaa, %bbb\n"
+ " ret i32 %A\n"
+ "}\n");
+ expectKnownBits(/*zero*/ 95u, /*one*/ 32u);
}
More information about the llvm-commits
mailing list