diff options
author | 2023-11-02 13:01:39 +0000 | |
---|---|---|
committer | 2023-11-06 13:13:13 +0000 | |
commit | 666cbfbb2091a6c12552ebaccc07c087ec756aff (patch) | |
tree | 7ef2d86f97bd524e2f3e66d5799ae0b5fbf83800 /compiler/optimizing | |
parent | 3796e88d5d9a6ecc095d32e5ebde11b9f27fef6b (diff) |
Remove dead phis alongside dead instructions in DCE
A dead phi doesn't generate any code, but it may keep
other instructions alive.
Locally speed compiling, it improves generated code 0.01-0.1%.
Test: art/test/testrunner/testrunner.py --host --64 -b --optimizing
Change-Id: Ida024200baa7afeee8c5a729c95b573ed0c6e4e7
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/dead_code_elimination_test.cc | 5 | ||||
-rw-r--r-- | compiler/optimizing/optimizing_compiler_stats.h | 1 |
3 files changed, 14 insertions, 2 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc index 5784b93670..5b420db5be 100644 --- a/compiler/optimizing/dead_code_elimination.cc +++ b/compiler/optimizing/dead_code_elimination.cc @@ -919,6 +919,16 @@ void HDeadCodeElimination::RemoveDeadInstructions() { MaybeRecordStat(stats_, MethodCompilationStat::kRemovedDeadInstruction); } } + + // Same for Phis. + for (HBackwardInstructionIterator phi_it(block->GetPhis()); !phi_it.Done(); phi_it.Advance()) { + DCHECK(phi_it.Current()->IsPhi()); + HPhi* phi = phi_it.Current()->AsPhi(); + if (phi->IsDeadAndRemovable()) { + block->RemovePhi(phi); + MaybeRecordStat(stats_, MethodCompilationStat::kRemovedDeadPhi); + } + } } } diff --git a/compiler/optimizing/dead_code_elimination_test.cc b/compiler/optimizing/dead_code_elimination_test.cc index b789434add..079fff91b6 100644 --- a/compiler/optimizing/dead_code_elimination_test.cc +++ b/compiler/optimizing/dead_code_elimination_test.cc @@ -99,8 +99,9 @@ TEST_F(DeadCodeEliminationTest, AdditionAndConditionalJump) { // Expected difference after dead code elimination. diff_t expected_diff = { - { " 3: IntConstant [9, 8, 5]\n", " 3: IntConstant [8, 5]\n" }, - { " 8: Phi(4, 3) [9]\n", " 8: Phi(4, 3)\n" }, + { " 3: IntConstant [9, 8, 5]\n", " 3: IntConstant [5]\n" }, + { " 4: IntConstant [8, 5]\n", " 4: IntConstant [5]\n" }, + { " 8: Phi(4, 3) [9]\n", removed }, { " 9: Add(8, 3)\n", removed } }; std::string expected_after = Patch(expected_before, expected_diff); diff --git a/compiler/optimizing/optimizing_compiler_stats.h b/compiler/optimizing/optimizing_compiler_stats.h index a1d0a5a845..5d32ea2fbd 100644 --- a/compiler/optimizing/optimizing_compiler_stats.h +++ b/compiler/optimizing/optimizing_compiler_stats.h @@ -47,6 +47,7 @@ enum class MethodCompilationStat { kUnresolvedFieldNotAFastAccess, kRemovedCheckedCast, kRemovedDeadInstruction, + kRemovedDeadPhi, kRemovedTry, kRemovedNullCheck, kNotCompiledSkipped, |