193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// modification, are permitted provided that the following conditions are
493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// met:
593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//
693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       copyright notice, this list of conditions and the following
1093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
1193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       with the distribution.
1293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
1393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       contributors may be used to endorse or promote products derived
1493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//       from this software without specific prior written permission.
1593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//
1693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
2893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#ifndef V8_HYDROGEN_ESCAPE_ANALYSIS_H_
2993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#define V8_HYDROGEN_ESCAPE_ANALYSIS_H_
3093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
3193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#include "allocation.h"
3293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#include "hydrogen.h"
3393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
3493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgnamespace v8 {
3593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgnamespace internal {
3693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
3793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
3893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgclass HEscapeAnalysisPhase : public HPhase {
3993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org public:
4093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  explicit HEscapeAnalysisPhase(HGraph* graph)
41594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      : HPhase("H_Escape analysis", graph),
42594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        captured_(0, zone()),
43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        number_of_values_(0),
44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        cumulative_values_(0),
45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        block_states_(graph->blocks()->length(), zone()) { }
4693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
4793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void Run() {
4893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    CollectCapturedValues();
49594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    PerformScalarReplacement();
5093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  }
5193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
5293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org private:
5393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void CollectCapturedValues();
5493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void CollectIfNoEscapingUses(HInstruction* instr);
55594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void PerformScalarReplacement();
56594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void AnalyzeDataFlow(HInstruction* instr);
5793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
58594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HCapturedObject* NewState(HInstruction* prev);
59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HCapturedObject* NewStateForAllocation(HInstruction* prev);
60594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HCapturedObject* NewStateForLoopHeader(HInstruction* prev, HCapturedObject*);
61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HCapturedObject* NewStateCopy(HInstruction* prev, HCapturedObject* state);
62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HPhi* NewPhiAndInsert(HBasicBlock* block, HValue* incoming_value, int index);
64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
65594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HCapturedObject* StateAt(HBasicBlock* block) {
66594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return block_states_.at(block->block_id());
67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
68594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void SetStateAt(HBasicBlock* block, HCapturedObject* state) {
70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    block_states_.Set(block->block_id(), state);
71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // List of allocations captured during collection phase.
74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  ZoneList<HInstruction*> captured_;
75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Number of scalar values tracked during scalar replacement phase.
77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int number_of_values_;
78594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int cumulative_values_;
79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Map of block IDs to the data-flow state at block entry during the
81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // scalar replacement phase.
82594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  ZoneList<HCapturedObject*> block_states_;
8393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org};
8493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
8593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
8693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org} }  // namespace v8::internal
8793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
8893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#endif  // V8_HYDROGEN_ESCAPE_ANALYSIS_H_
89