From d4229601e0fb46b0a013b52370aeda3887aea8e9 Mon Sep 17 00:00:00 2001 From: Santiago Aboy Solanes Date: Tue, 3 Jan 2023 16:20:50 +0000 Subject: Add a write barrier elimination pass We can eliminate redundant write barriers as we don't need several for the same receiver. For example: ``` MyObject o; o.inner_obj = io; o.inner_obj2 = io2; o.inner_obj3 = io3; ``` We can keep the write barrier for `inner_obj` and remove the other two. Note that we cannot perform this optimization across invokes, suspend check, or instructions that can throw. Local improvements (pixel 5, speed compile): * System server: -280KB (-0.56%) * SystemUIGoogle: -330KB (-1.16%) * AGSA: -3876KB (-1.19%) Bug: 260843353 Fixes: 260843353 Change-Id: Ibf98efbe891ee00e46125853c3e97ae30aa3ff30 --- compiler/optimizing/optimization.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'compiler/optimizing/optimization.cc') diff --git a/compiler/optimizing/optimization.cc b/compiler/optimizing/optimization.cc index e0c5933657..73a47517bf 100644 --- a/compiler/optimizing/optimization.cc +++ b/compiler/optimizing/optimization.cc @@ -55,6 +55,7 @@ #include "select_generator.h" #include "sharpening.h" #include "side_effects_analysis.h" +#include "write_barrier_elimination.h" // Decide between default or alternative pass name. @@ -95,6 +96,8 @@ const char* OptimizationPassName(OptimizationPass pass) { return ConstructorFenceRedundancyElimination::kCFREPassName; case OptimizationPass::kScheduling: return HInstructionScheduling::kInstructionSchedulingPassName; + case OptimizationPass::kWriteBarrierElimination: + return WriteBarrierElimination::kWBEPassName; #ifdef ART_ENABLE_CODEGEN_arm case OptimizationPass::kInstructionSimplifierArm: return arm::InstructionSimplifierArm::kInstructionSimplifierArmPassName; @@ -268,6 +271,9 @@ ArenaVector ConstructOptimizations( case OptimizationPass::kLoadStoreElimination: opt = new (allocator) LoadStoreElimination(graph, stats, pass_name); break; + case OptimizationPass::kWriteBarrierElimination: + opt = new (allocator) WriteBarrierElimination(graph, stats, pass_name); + break; case OptimizationPass::kScheduling: opt = new (allocator) HInstructionScheduling( graph, codegen->GetCompilerOptions().GetInstructionSet(), codegen, pass_name); -- cgit v1.2.3-59-g8ed1b