From 100ab91013d7da4094302a927872702492589fc1 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Wed, 16 Oct 2013 09:16:56 +0000 Subject: [PATCH] Implement fixpoint iteration for escape analysis. R=titzer@chromium.org Review URL: https://codereview.chromium.org/23533003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17235 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/flag-definitions.h | 2 ++ src/hydrogen-escape-analysis.cc | 11 ++++++++--- src/hydrogen-instructions.cc | 6 ++++++ src/hydrogen-instructions.h | 2 ++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/flag-definitions.h b/src/flag-definitions.h index cc317e5..379ae69 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -313,6 +313,8 @@ DEFINE_bool(inline_construct, true, "inline constructor calls") DEFINE_bool(inline_arguments, true, "inline functions with arguments object") DEFINE_bool(inline_accessors, true, "inline JavaScript accessors") DEFINE_int(loop_weight, 1, "loop weight for representation inference") +DEFINE_int(escape_analysis_iterations, 1, + "maximum number of escape analysis fix-point iterations") DEFINE_bool(optimize_for_in, true, "optimize functions containing for-in loops") diff --git a/src/hydrogen-escape-analysis.cc b/src/hydrogen-escape-analysis.cc index 3a7e10d..1023019 100644 --- a/src/hydrogen-escape-analysis.cc +++ b/src/hydrogen-escape-analysis.cc @@ -306,7 +306,7 @@ void HEscapeAnalysisPhase::PerformScalarReplacement() { number_of_objects_++; block_states_.Clear(); - // Perform actual analysis steps. + // Perform actual analysis step. AnalyzeDataFlow(allocate); cumulative_values_ += number_of_values_; @@ -320,8 +320,13 @@ void HEscapeAnalysisPhase::Run() { // TODO(mstarzinger): We disable escape analysis with OSR for now, because // spill slots might be uninitialized. Needs investigation. if (graph()->has_osr()) return; - CollectCapturedValues(); - PerformScalarReplacement(); + int max_fixpoint_iteration_count = FLAG_escape_analysis_iterations; + for (int i = 0; i < max_fixpoint_iteration_count; i++) { + CollectCapturedValues(); + if (captured_.is_empty()) break; + PerformScalarReplacement(); + captured_.Clear(); + } } diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index 31630d1..867fa50 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -2396,6 +2396,12 @@ void HCapturedObject::ReplayEnvironment(HEnvironment* env) { } +void HCapturedObject::PrintDataTo(StringStream* stream) { + stream->Add("#%d ", capture_id()); + HDematerializedObject::PrintDataTo(stream); +} + + void HEnterInlined::RegisterReturnTarget(HBasicBlock* return_target, Zone* zone) { ASSERT(return_target->IsInlineReturnTarget()); diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index bdeec0c..696d8b0 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -3317,6 +3317,8 @@ class HCapturedObject V8_FINAL : public HDematerializedObject { // Replay effects of this instruction on the given environment. void ReplayEnvironment(HEnvironment* env); + virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; + DECLARE_CONCRETE_INSTRUCTION(CapturedObject) private: -- 2.7.4