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/graph_visualizer.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'compiler/optimizing/graph_visualizer.cc') diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc index f6076525d8..96eaa61209 100644 --- a/compiler/optimizing/graph_visualizer.cc +++ b/compiler/optimizing/graph_visualizer.cc @@ -483,6 +483,7 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { StartAttributeStream("can_trigger_gc") << std::boolalpha << array_set->GetSideEffects().Includes(SideEffects::CanTriggerGC()) << std::noboolalpha; + StartAttributeStream("write_barrier_kind") << array_set->GetWriteBarrierKind(); } void VisitCompare(HCompare* compare) override { @@ -552,7 +553,9 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { iset->GetFieldInfo().GetDexFile().PrettyField(iset->GetFieldInfo().GetFieldIndex(), /* with type */ false); StartAttributeStream("field_type") << iset->GetFieldType(); - StartAttributeStream("predicated") << std::boolalpha << iset->GetIsPredicatedSet(); + StartAttributeStream("predicated") + << std::boolalpha << iset->GetIsPredicatedSet() << std::noboolalpha; + StartAttributeStream("write_barrier_kind") << iset->GetWriteBarrierKind(); } void VisitStaticFieldGet(HStaticFieldGet* sget) override { @@ -567,6 +570,7 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { sset->GetFieldInfo().GetDexFile().PrettyField(sset->GetFieldInfo().GetFieldIndex(), /* with type */ false); StartAttributeStream("field_type") << sset->GetFieldType(); + StartAttributeStream("write_barrier_kind") << sset->GetWriteBarrierKind(); } void VisitUnresolvedInstanceFieldGet(HUnresolvedInstanceFieldGet* field_access) override { -- cgit v1.2.3-59-g8ed1b