From cbf82dafb9bfe0543a64a4a471765069516e9456 Mon Sep 17 00:00:00 2001 From: Santiago Aboy Solanes Date: Tue, 29 Oct 2024 11:00:42 +0000 Subject: 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 --- compiler/optimizing/optimization.cc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'compiler/optimizing/optimization.cc') 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 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; -- cgit v1.2.3-59-g8ed1b