From 5fa73a95fcfc638c155511305382ecbe4b75fe43 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Thu, 21 Jul 2022 23:37:18 +0100 Subject: ART: Add two extra DCE passes Add two DCE passes to eliminate dead instructions left by: - Loop optimization unrolling. After loop optimization, dead instructions are often left that, when removed can simplify the structure of the loop and remove basic blocks. This extra DCE pass creates an opportunity for the load store elimination pass to remove some loads/stores. - The last instruction simplification pass. Authors: Hari Limaye, Chris Jones Test: 458-checker-instruct-simplification Test: 530-checker-lse, 530-checker-lse-simd, 706-checker-scheduler Test: test-art-target, test-art-host Change-Id: I6e14cbfc3c320af5f507135a067bb7b5bc4df8f4 --- compiler/optimizing/optimizing_compiler.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'compiler/optimizing/optimizing_compiler.cc') diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index f394635ede..7cb4b29c87 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -670,17 +670,25 @@ void OptimizingCompiler::RunOptimizations(HGraph* graph, "constant_folding$after_bce"), OptDef(OptimizationPass::kAggressiveInstructionSimplifier, "instruction_simplifier$after_bce"), + OptDef(OptimizationPass::kDeadCodeElimination, + "dead_code_elimination$after_bce"), // Other high-level optimizations. OptDef(OptimizationPass::kLoadStoreElimination), - OptDef(OptimizationPass::kCHAGuardOptimization), OptDef(OptimizationPass::kDeadCodeElimination, - "dead_code_elimination$after_bce"), + "dead_code_elimination$after_lse", + OptimizationPass::kLoadStoreElimination), + OptDef(OptimizationPass::kCHAGuardOptimization), OptDef(OptimizationPass::kCodeSinking), // The codegen has a few assumptions that only the instruction simplifier // can satisfy. For example, the code generator does not expect to see a // HTypeConversion from a type to the same type. OptDef(OptimizationPass::kAggressiveInstructionSimplifier, "instruction_simplifier$before_codegen"), + // Simplification may result in dead code that should be removed prior to + // code generation. + OptDef(OptimizationPass::kDeadCodeElimination, + "dead_code_elimination$before_codegen", + OptimizationPass::kAggressiveInstructionSimplifier), // Eliminate constructor fences after code sinking to avoid // complicated sinking logic to split a fence with many inputs. OptDef(OptimizationPass::kConstructorFenceRedundancyElimination) -- cgit v1.2.3-59-g8ed1b