Index: src/compiler/bytecode-analysis.h |
diff --git a/src/compiler/bytecode-analysis.h b/src/compiler/bytecode-analysis.h |
index 1e443575b59090b5d2eba40e1ba73c16e35b856b..1c4e4aa6c3467cc80a6f62042c6564a33e5dc84f 100644 |
--- a/src/compiler/bytecode-analysis.h |
+++ b/src/compiler/bytecode-analysis.h |
@@ -9,6 +9,7 @@ |
#include "src/bit-vector.h" |
#include "src/compiler/bytecode-liveness-map.h" |
#include "src/handles.h" |
+#include "src/interpreter/bytecode-register.h" |
#include "src/zone/zone-containers.h" |
namespace v8 { |
@@ -18,6 +19,42 @@ class BytecodeArray; |
namespace compiler { |
+class V8_EXPORT_PRIVATE BytecodeLoopAssignments { |
+ public: |
+ BytecodeLoopAssignments(int parameter_count, int register_count, Zone* zone); |
+ |
+ void Add(interpreter::Register r); |
+ void AddPair(interpreter::Register r); |
+ void AddTriple(interpreter::Register r); |
+ void AddAll(); |
+ void Union(const BytecodeLoopAssignments& other); |
+ |
+ bool ContainsParameter(int index) const; |
+ bool ContainsLocal(int index) const; |
+ |
+ private: |
+ int parameter_count_; |
+ BitVector* bit_vector_; |
+}; |
+ |
+struct V8_EXPORT_PRIVATE LoopInfo { |
+ public: |
+ LoopInfo(int parent_offset, int parameter_count, int register_count, |
+ Zone* zone) |
+ : parent_offset_(parent_offset), |
+ assignments_(parameter_count, register_count, zone) {} |
+ |
+ int parent_offset() const { return parent_offset_; } |
+ |
+ BytecodeLoopAssignments& assignments() { return assignments_; } |
+ const BytecodeLoopAssignments& assignments() const { return assignments_; } |
+ |
+ private: |
+ // The offset to the parent loop, or -1 if there is no parent. |
+ int parent_offset_; |
+ BytecodeLoopAssignments assignments_; |
+}; |
+ |
class V8_EXPORT_PRIVATE BytecodeAnalysis BASE_EMBEDDED { |
public: |
BytecodeAnalysis(Handle<BytecodeArray> bytecode_array, Zone* zone, |
@@ -25,16 +62,15 @@ class V8_EXPORT_PRIVATE BytecodeAnalysis BASE_EMBEDDED { |
// Analyze the bytecodes to find the loop ranges and nesting. No other |
// methods in this class return valid information until this has been called. |
- void Analyze(); |
+ void Analyze(BailoutId osr_bailout_id); |
Jarin
2016/12/12 06:53:37
Please explain in the comment what is the paramete
|
// Return true if the given offset is a loop header |
bool IsLoopHeader(int offset) const; |
// Get the loop header offset of the containing loop for arbitrary |
// {offset}, or -1 if the {offset} is not inside any loop. |
int GetLoopOffsetFor(int offset) const; |
- // Gets the loop header offset of the parent loop of the loop header |
- // at {header_offset}, or -1 for outer-most loops. |
- int GetParentLoopFor(int header_offset) const; |
+ // Get the loop info of the loop header at {header_offset}. |
+ const LoopInfo& GetLoopInfoFor(int header_offset) const; |
// Gets the in-liveness for the bytecode at {offset}. |
const BytecodeLivenessState* GetInLivenessFor(int offset) const; |
@@ -45,28 +81,32 @@ class V8_EXPORT_PRIVATE BytecodeAnalysis BASE_EMBEDDED { |
std::ostream& PrintLivenessTo(std::ostream& os) const; |
private: |
- void PushLoop(int loop_header, int loop_end); |
- |
-#if DEBUG |
- bool LivenessIsValid(); |
-#endif |
- |
- Zone* zone() const { return zone_; } |
- Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; } |
+ struct LoopStackEntry { |
+ int header_offset; |
+ LoopInfo* loop_info; |
+ }; |
- private: |
Handle<BytecodeArray> bytecode_array_; |
bool do_liveness_analysis_; |
Zone* zone_; |
- ZoneStack<int> loop_stack_; |
+ ZoneStack<LoopStackEntry> loop_stack_; |
ZoneVector<int> loop_end_index_queue_; |
ZoneMap<int, int> end_to_header_; |
- ZoneMap<int, int> header_to_parent_; |
+ ZoneMap<int, LoopInfo> header_to_info_; |
BytecodeLivenessMap liveness_map_; |
+ void PushLoop(int loop_header, int loop_end); |
+ |
+#if DEBUG |
+ bool LivenessIsValid(); |
+#endif |
+ |
+ Zone* zone() const { return zone_; } |
+ Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; } |
+ |
DISALLOW_COPY_AND_ASSIGN(BytecodeAnalysis); |
}; |