Skip to content

Commit

Permalink
Add missing big enum test cases.
Browse files Browse the repository at this point in the history
Summary: These are important because they are too large to turn into if-statements. They exercise the actually-a-switch paths.

Reviewed By: thezhangwei

Differential Revision: D40418999

fbshipit-source-id: 8b09a39476293b4d95cfbb1e66a8212d5a80ce65
  • Loading branch information
Nick Gorski authored and facebook-github-bot committed Oct 25, 2022
1 parent c3a4138 commit f6753f4
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
20 changes: 20 additions & 0 deletions test/instr/OptimizeEnumSwitchMapTestVerify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ TEST_F(PreVerify, JavaGeneratedClass) {
collect_const_branch_cases(method_use_enumA_again);
std::set<BranchCase> expected_switch_cases_A_again = {
{BranchSource::ArrayGet, 1}, {BranchSource::ArrayGet, 3}};

auto method_use_bigEnum = DexMethod::get_method(
"Lcom/facebook/redextest/Foo;.useBigEnum:(Lcom/facebook/redextest/"
"BigEnum;)I");
auto switch_cases_bigEnum = collect_const_branch_cases(method_use_bigEnum);
std::set<BranchCase> expected_switch_cases_bigEnum;
for (int64_t i = 0; i != 20; ++i) {
expected_switch_cases_bigEnum.emplace(BranchSource::ArrayGet, 1 + i);
}
EXPECT_EQ(expected_switch_cases_bigEnum, switch_cases_bigEnum);
}

TEST_F(PostVerify, JavaGeneratedClass) {
Expand Down Expand Up @@ -106,4 +116,14 @@ TEST_F(PostVerify, JavaGeneratedClass) {
std::set<BranchCase> expected_switch_cases_A_again = {
{BranchSource::VirtualCall, 0}, {BranchSource::VirtualCall, 1}};
EXPECT_EQ(expected_switch_cases_A_again, switch_cases_A_again);

auto method_use_bigEnum = DexMethod::get_method(
"Lcom/facebook/redextest/Foo;.useBigEnum:(Lcom/facebook/redextest/"
"BigEnum;)I");
auto switch_cases_bigEnum = collect_const_branch_cases(method_use_bigEnum);
std::set<BranchCase> expected_switch_cases_bigEnum;
for (int64_t i = 0; i != 20; ++i) {
expected_switch_cases_bigEnum.emplace(BranchSource::VirtualCall, i);
}
EXPECT_EQ(expected_switch_cases_bigEnum, switch_cases_bigEnum);
}
15 changes: 15 additions & 0 deletions test/instr/OptimizeKtEnumSwitchMapTestVerify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ constexpr const char* name_useAAgain =
"Lcom/facebook/redextest/kt/A;"
")I";

constexpr const char* name_useBig =
"Lcom/facebook/redextest/kt/OptimizeEnumSwitchMapTestKt;.useBig:("
"Lcom/facebook/redextest/kt/Big;"
")I";

// Note: Different versions of compilers (javac/kotlinc/d8) can generate
// different keys. So we don't check the specific values of the keys in
// PreVerify, but only that they are positive and unique.
Expand Down Expand Up @@ -64,14 +69,17 @@ TEST_F(PreVerify, KotlinGeneratedClass) {
auto* meth_useA = DexMethod::get_method(name_useA);
auto* meth_useB = DexMethod::get_method(name_useB);
auto* meth_useAAgain = DexMethod::get_method(name_useAAgain);
auto* meth_useBig = DexMethod::get_method(name_useBig);

auto switch_cases_A = collect_const_branch_cases(meth_useA);
auto switch_cases_B = collect_const_branch_cases(meth_useB);
auto switch_cases_A_again = collect_const_branch_cases(meth_useAAgain);
auto switch_cases_Big = collect_const_branch_cases(meth_useBig);

expect_kotlin_switchmapping_of_size(switch_cases_A, 2);
expect_kotlin_switchmapping_of_size(switch_cases_B, 2);
expect_kotlin_switchmapping_of_size(switch_cases_A_again, 2);
expect_kotlin_switchmapping_of_size(switch_cases_Big, 20);
}

TEST_F(PostVerify, KotlinGeneratedClass) {
Expand All @@ -90,10 +98,12 @@ TEST_F(PostVerify, KotlinGeneratedClass) {
auto* meth_useA = DexMethod::get_method(name_useA);
auto* meth_useB = DexMethod::get_method(name_useB);
auto* meth_useAAgain = DexMethod::get_method(name_useAAgain);
auto* meth_useBig = DexMethod::get_method(name_useBig);

auto switch_cases_A = collect_const_branch_cases(meth_useA);
auto switch_cases_B = collect_const_branch_cases(meth_useB);
auto switch_cases_A_again = collect_const_branch_cases(meth_useAAgain);
auto switch_cases_Big = collect_const_branch_cases(meth_useBig);

// OptimizeEnumsPass replaces the old keys with ordinals. Here we check if the
// keys are expected.
Expand All @@ -105,8 +115,13 @@ TEST_F(PostVerify, KotlinGeneratedClass) {
{BranchSource::VirtualCall, 2}};
std::set<BranchCase> expected_switch_cases_A_again{
{BranchSource::VirtualCall, 0}, {BranchSource::VirtualCall, 1}};
std::set<BranchCase> expected_switch_cases_Big;
for (int64_t i = 0; i != 20; ++i) {
expected_switch_cases_Big.emplace(BranchSource::VirtualCall, i);
}

EXPECT_EQ(expected_switch_cases_A, switch_cases_A);
EXPECT_EQ(expected_switch_cases_B, switch_cases_B);
EXPECT_EQ(expected_switch_cases_A_again, switch_cases_A_again);
EXPECT_EQ(expected_switch_cases_Big, switch_cases_Big);
}

0 comments on commit f6753f4

Please sign in to comment.