diff options
author | 2015-01-26 18:54:32 +0000 | |
---|---|---|
committer | 2015-01-29 12:01:26 +0000 | |
commit | 10e244f9e7f6d96a95c910a2bedef5bd3810c637 (patch) | |
tree | bc2b90ce716129115c05f79e21c58fe13b01fd20 /compiler/optimizing/optimizing_compiler.cc | |
parent | ab7f56d9b9838811cb01773e45999e2cda4aa03a (diff) |
optimizing: NullCheck elimination
How it works:
- run a type analysis to propagate null information on instructions
- during the last instruction simplifier remove null checks for which
the input is known to be not null
The current type analysis is actually a nullability analysis but it will
be reused in follow up CLs to propagate type information: so it keeps
the more convenient name.
Change-Id: I54bb1d32ab24604b4d677d1ecdaf8d60a5ff5ce9
Diffstat (limited to 'compiler/optimizing/optimizing_compiler.cc')
-rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 4f05afa1a6..705345b279 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -43,6 +43,7 @@ #include "ssa_builder.h" #include "ssa_phi_elimination.h" #include "ssa_liveness_analysis.h" +#include "reference_type_propagation.h" #include "utils/arena_allocator.h" namespace art { @@ -196,6 +197,18 @@ static bool CanOptimize(const DexFile::CodeItem& code_item) { return code_item.tries_size_ == 0; } +static void RunOptimizations(HOptimization* optimizations[], + size_t length, + const HGraphVisualizer& visualizer) { + for (size_t i = 0; i < length; ++i) { + HOptimization* optimization = optimizations[i]; + visualizer.DumpGraph(optimization->GetPassName(), /*is_after=*/false); + optimization->Run(); + visualizer.DumpGraph(optimization->GetPassName(), /*is_after=*/true); + optimization->Check(); + } +} + static void RunOptimizations(HGraph* graph, CompilerDriver* driver, OptimizingCompilerStats* stats, @@ -213,7 +226,8 @@ static void RunOptimizations(HGraph* graph, SideEffectsAnalysis side_effects(graph); GVNOptimization gvn(graph, side_effects); BoundsCheckElimination bce(graph); - InstructionSimplifier simplify2(graph); + ReferenceTypePropagation type_propagation(graph); + InstructionSimplifier simplify2(graph, "instruction_simplifier_after_types"); IntrinsicsRecognizer intrinsics(graph, dex_compilation_unit.GetDexFile(), driver); @@ -229,16 +243,11 @@ static void RunOptimizations(HGraph* graph, &side_effects, &gvn, &bce, + &type_propagation, &simplify2 }; - for (size_t i = 0; i < arraysize(optimizations); ++i) { - HOptimization* optimization = optimizations[i]; - visualizer.DumpGraph(optimization->GetPassName(), /*is_after=*/false); - optimization->Run(); - visualizer.DumpGraph(optimization->GetPassName(), /*is_after=*/true); - optimization->Check(); - } + RunOptimizations(optimizations, arraysize(optimizations), visualizer); } // The stack map we generate must be 4-byte aligned on ARM. Since existing |