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