From a2bbdc3d475e3c116f14d70eadfac2b963ec8abc Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Thu, 14 Apr 2016 16:36:15 +0100 Subject: [PATCH] ART: Save a bit of memory in production LICM LICM uses a bit vector to DCHECK that inner loops are visited before outer loops. Allocate the bit vector only if kIsDebugBuild. Bug: 28173563 Change-Id: Ic2641607ebe55ad8974de2ebe03973f0bf182e42 (cherry picked from commit aa680e89cf35ac3af7d3344d7960ba2f055e16d8) --- compiler/optimizing/licm.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/optimizing/licm.cc b/compiler/optimizing/licm.cc index 7a1e06b95..5a0b89c90 100644 --- a/compiler/optimizing/licm.cc +++ b/compiler/optimizing/licm.cc @@ -79,8 +79,15 @@ static void UpdateLoopPhisIn(HEnvironment* environment, HLoopInformation* info) void LICM::Run() { DCHECK(side_effects_.HasRun()); + // Only used during debug. - ArenaBitVector visited(graph_->GetArena(), graph_->GetBlocks().size(), false, kArenaAllocLICM); + ArenaBitVector* visited = nullptr; + if (kIsDebugBuild) { + visited = new (graph_->GetArena()) ArenaBitVector(graph_->GetArena(), + graph_->GetBlocks().size(), + false, + kArenaAllocLICM); + } // Post order visit to visit inner loops before outer loops. for (HPostOrderIterator it(*graph_); !it.Done(); it.Advance()) { @@ -109,10 +116,12 @@ void LICM::Run() { DCHECK(inner->IsInLoop()); if (inner->GetLoopInformation() != loop_info) { // Thanks to post order visit, inner loops were already visited. - DCHECK(visited.IsBitSet(inner->GetBlockId())); + DCHECK(visited->IsBitSet(inner->GetBlockId())); continue; } - visited.SetBit(inner->GetBlockId()); + if (kIsDebugBuild) { + visited->SetBit(inner->GetBlockId()); + } if (contains_irreducible_loop) { // We cannot licm in an irreducible loop, or in a natural loop containing an -- 2.11.0