Reduce Partial LSE memory usage.
Instantiate ExecutionSubgraph only for partial singleton
candidates (currently NewInstance, possibly NewArray in the
future). This reduces "LSA" allocations.
Reserve memory for PartialLoadStoreEliminationHelper members
based on the number of partial singletons instead of the
number of reference infos. This reduces "LSE" allocations.
The peak scoped arena allocation for one compiled method
is reduced from
MEM: used: 97424004, allocated: 99006568, lost: 1115968
LSA 46015104
LSE 51408900
down to
MEM: used: 17000744, allocated: 26713880, lost: 3332496
GVN 17000744
where the LSA+LSE memory use is lower than GVN use.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 33650849
Change-Id: I323b9f144b258f0fab034794770971547ce94b59
diff --git a/compiler/optimizing/execution_subgraph_test.cc b/compiler/optimizing/execution_subgraph_test.cc
index 98e642f..74c243b 100644
--- a/compiler/optimizing/execution_subgraph_test.cc
+++ b/compiler/optimizing/execution_subgraph_test.cc
@@ -142,7 +142,7 @@
"exit",
{ { "entry", "left" }, { "entry", "right" }, { "left", "exit" }, { "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("left"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -229,7 +229,7 @@
{ "entry", "right" },
{ "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l2"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -292,7 +292,7 @@
{ "entry", "right" },
{ "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l2"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -348,7 +348,7 @@
{ "entry", "right" },
{ "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l1"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -403,7 +403,7 @@
{ "entry", "right" },
{ "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l1loop"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -478,7 +478,7 @@
{"entry", "right"},
{"right", "exit"}}));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l1loop_left"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -545,7 +545,7 @@
{"entry", "right"},
{"right", "exit"}}));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("l1loop_left"));
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
@@ -575,7 +575,7 @@
"exit",
{ { "entry", "left" }, { "entry", "right" }, { "left", "exit" }, { "right", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("left"));
esg.RemoveBlock(blks.Get("right"));
esg.Finalize();
@@ -598,7 +598,7 @@
{ "b", "exit" },
{ "c", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("a"));
esg.RemoveBlock(blks.Get("c"));
esg.Finalize();
@@ -703,7 +703,7 @@
{ "c_end_1", "exit" },
{ "c_end_2", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("a"));
esg.RemoveBlock(blks.Get("c_mid"));
esg.Finalize();
@@ -787,7 +787,7 @@
{ "esc_bottom", "exit" } }));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("esc_top"));
esg.RemoveBlock(blks.Get("esc_bottom"));
esg.Finalize();
@@ -817,7 +817,7 @@
}
AdjacencyListGraph blks(SetupFromAdjacencyList("entry", "exit", edges));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
ASSERT_TRUE(IsValidSubgraph(esg));
@@ -846,7 +846,7 @@
}
AdjacencyListGraph blks(SetupFromAdjacencyList("entry", "exit", edges));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.RemoveBlock(blks.Get("blk2"));
esg.RemoveBlock(blks.Get("blk4"));
esg.Finalize();
@@ -877,7 +877,7 @@
}
AdjacencyListGraph blks(SetupFromAdjacencyList("entry", "exit", edges));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
for (const auto& mid : mid_blocks) {
esg.RemoveBlock(blks.Get(mid));
}
@@ -907,7 +907,7 @@
AdjacencyListGraph blks(SetupFromAdjacencyList(mid_blocks.front(), mid_blocks.back(), edges));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
esg.Finalize();
ASSERT_TRUE(esg.IsValid());
ASSERT_TRUE(IsValidSubgraph(esg));
@@ -937,7 +937,7 @@
edges.emplace_back(mid_blocks.front(), mid_blocks.back());
AdjacencyListGraph blks(SetupFromAdjacencyList(mid_blocks.front(), mid_blocks.back(), edges));
ASSERT_TRUE(ExecutionSubgraph::CanAnalyse(graph_));
- ExecutionSubgraph esg(graph_, /*analysis_possible=*/true, GetScopedAllocator());
+ ExecutionSubgraph esg(graph_, GetScopedAllocator());
constexpr size_t kToRemoveIdx = kNumBlocks / 2;
HBasicBlock* remove_implicit = blks.Get(mid_blocks[kToRemoveIdx]);
for (HBasicBlock* pred : remove_implicit->GetPredecessors()) {