From 5ed20f90acd05e1f8697340f11113f0c61c22492 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Wed, 5 Oct 2016 13:49:44 +0100 Subject: Make it possible to pass an arena allocator to HLoopOptimization. loop_optimization_test uses memory from HLoopOptimization's allocator, which is scoped by the Run method. Fix is to pass custom allocator. test: m test-art-host-gtest Change-Id: I359330e22202519f400a26da5403eeb00f0b2db4 --- compiler/optimizing/loop_optimization.cc | 15 ++++++++++++--- compiler/optimizing/loop_optimization.h | 3 +++ compiler/optimizing/loop_optimization_test.cc | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) (limited to 'compiler') diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index 383a0278c6..b12a7f76c6 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -126,9 +126,14 @@ static void RemoveFromCycle(HInstruction* instruction) { HLoopOptimization::HLoopOptimization(HGraph* graph, HInductionVarAnalysis* induction_analysis) + : HLoopOptimization(graph, induction_analysis, nullptr) {} + +HLoopOptimization::HLoopOptimization(HGraph* graph, + HInductionVarAnalysis* induction_analysis, + ArenaAllocator* allocator) : HOptimization(graph, kLoopOptimizationPassName), induction_range_(induction_analysis), - loop_allocator_(nullptr), + loop_allocator_(allocator), top_loop_(nullptr), last_loop_(nullptr) { } @@ -141,7 +146,9 @@ void HLoopOptimization::Run() { } ArenaAllocator allocator(graph_->GetArena()->GetArenaPool()); - loop_allocator_ = &allocator; + if (loop_allocator_ == nullptr) { + loop_allocator_ = &allocator; + } // Build the linear order. This step enables building a loop hierarchy that // properly reflects the outer-inner and previous-next relation. @@ -157,7 +164,9 @@ void HLoopOptimization::Run() { // Traverse the loop hierarchy inner-to-outer and optimize. TraverseLoopsInnerToOuter(top_loop_); } - loop_allocator_ = nullptr; + if (loop_allocator_ == &allocator) { + loop_allocator_ = nullptr; + } } void HLoopOptimization::AddLoop(HLoopInformation* loop_info) { diff --git a/compiler/optimizing/loop_optimization.h b/compiler/optimizing/loop_optimization.h index d12fe5ee18..591e45a7fb 100644 --- a/compiler/optimizing/loop_optimization.h +++ b/compiler/optimizing/loop_optimization.h @@ -32,6 +32,9 @@ namespace art { class HLoopOptimization : public HOptimization { public: HLoopOptimization(HGraph* graph, HInductionVarAnalysis* induction_analysis); + HLoopOptimization(HGraph* graph, + HInductionVarAnalysis* induction_analysis, + ArenaAllocator* allocator); void Run() OVERRIDE; diff --git a/compiler/optimizing/loop_optimization_test.cc b/compiler/optimizing/loop_optimization_test.cc index 4e007d4e9a..4d54afd14d 100644 --- a/compiler/optimizing/loop_optimization_test.cc +++ b/compiler/optimizing/loop_optimization_test.cc @@ -31,7 +31,7 @@ class LoopOptimizationTest : public CommonCompilerTest { allocator_(&pool_), graph_(CreateGraph(&allocator_)), iva_(new (&allocator_) HInductionVarAnalysis(graph_)), - loop_opt_(new (&allocator_) HLoopOptimization(graph_, iva_)) { + loop_opt_(new (&allocator_) HLoopOptimization(graph_, iva_, &allocator_)) { BuildGraph(); } -- cgit v1.2.3-59-g8ed1b