diff options
author | 2024-10-29 11:00:42 +0000 | |
---|---|---|
committer | 2024-10-30 10:07:41 +0000 | |
commit | cbf82dafb9bfe0543a64a4a471765069516e9456 (patch) | |
tree | 46d9b25f06c986e2f77a3d95401b2490d8a3110a /compiler/optimizing/optimization.cc | |
parent | 33499d1f02d048392e6320dbbe4c86ab1ad48216 (diff) |
Run RTP after GVN to remove more NullCheck instructions
After GVN, we deduplicate instructions and we might have more
information regarding the nullability of the SSA variable. We can
run RTP to insert the BoundType instructions, which will later be
used by InstructionSimplifier to remove the NullCheck. RTP will be
run conditionally, only if GVN did at least one replacement.
It improves ~0.1% of odex size for speed compiled apps.
Bug: 369206455
Test: art/test/testrunner/testrunner.py --host --64 -b --optimizing
Change-Id: I0a4a104690b3fe9ac4118642ab9e9916dc30a9c5
Diffstat (limited to 'compiler/optimizing/optimization.cc')
-rw-r--r-- | compiler/optimizing/optimization.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/optimizing/optimization.cc b/compiler/optimizing/optimization.cc index ef1f36ab08..bd8fbdf1d2 100644 --- a/compiler/optimizing/optimization.cc +++ b/compiler/optimizing/optimization.cc @@ -55,6 +55,7 @@ #include "licm.h" #include "load_store_elimination.h" #include "loop_optimization.h" +#include "reference_type_propagation.h" #include "scheduler.h" #include "select_generator.h" #include "sharpening.h" @@ -98,6 +99,8 @@ const char* OptimizationPassName(OptimizationPass pass) { return CodeSinking::kCodeSinkingPassName; case OptimizationPass::kConstructorFenceRedundancyElimination: return ConstructorFenceRedundancyElimination::kCFREPassName; + case OptimizationPass::kReferenceTypePropagation: + return ReferenceTypePropagation::kReferenceTypePropagationPassName; case OptimizationPass::kScheduling: return HInstructionScheduling::kInstructionSchedulingPassName; case OptimizationPass::kWriteBarrierElimination: @@ -154,6 +157,7 @@ OptimizationPass OptimizationPassByName(const std::string& pass_name) { X(OptimizationPass::kInvariantCodeMotion); X(OptimizationPass::kLoadStoreElimination); X(OptimizationPass::kLoopOptimization); + X(OptimizationPass::kReferenceTypePropagation); X(OptimizationPass::kScheduling); X(OptimizationPass::kSelectGenerator); X(OptimizationPass::kSideEffectsAnalysis); @@ -287,6 +291,10 @@ ArenaVector<HOptimization*> ConstructOptimizations( case OptimizationPass::kLoadStoreElimination: opt = new (allocator) LoadStoreElimination(graph, stats, pass_name); break; + case OptimizationPass::kReferenceTypePropagation: + opt = new (allocator) ReferenceTypePropagation( + graph, dex_compilation_unit.GetDexCache(), /* is_first_run= */ false, pass_name); + break; case OptimizationPass::kWriteBarrierElimination: opt = new (allocator) WriteBarrierElimination(graph, stats, pass_name); break; |