summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2023-11-02 13:01:39 +0000
committer Santiago Aboy Solanes <solanes@google.com> 2023-11-06 13:13:13 +0000
commit666cbfbb2091a6c12552ebaccc07c087ec756aff (patch)
tree7ef2d86f97bd524e2f3e66d5799ae0b5fbf83800 /compiler/optimizing
parent3796e88d5d9a6ecc095d32e5ebde11b9f27fef6b (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.cc10
-rw-r--r--compiler/optimizing/dead_code_elimination_test.cc5
-rw-r--r--compiler/optimizing/optimizing_compiler_stats.h1
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,