OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
10 #include "src/compiler/bytecode-branch-analysis.h" | 10 #include "src/compiler/bytecode-branch-analysis.h" |
(...skipping 1878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1889 } | 1889 } |
1890 | 1890 |
1891 void BytecodeGraphBuilder::VisitIllegal() { | 1891 void BytecodeGraphBuilder::VisitIllegal() { |
1892 // Not emitted in valid bytecode. | 1892 // Not emitted in valid bytecode. |
1893 UNREACHABLE(); | 1893 UNREACHABLE(); |
1894 } | 1894 } |
1895 | 1895 |
1896 void BytecodeGraphBuilder::VisitNop() {} | 1896 void BytecodeGraphBuilder::VisitNop() {} |
1897 | 1897 |
1898 void BytecodeGraphBuilder::SwitchToMergeEnvironment(int current_offset) { | 1898 void BytecodeGraphBuilder::SwitchToMergeEnvironment(int current_offset) { |
1899 if (merge_environments_[current_offset] != nullptr) { | 1899 auto it = merge_environments_.find(current_offset); |
Michael Starzinger
2016/12/01 14:47:48
question: Any reason to use an iterator here and a
Leszek Swirski
2016/12/01 14:52:36
Indeed there is: the find+iterator does not create
Michael Starzinger
2016/12/01 15:00:51
Yes, I would prefer that. Thanks!
Michael Starzinger
2016/12/01 17:00:43
As discussed offline: Either is fine with me. Take
| |
1900 if (it != merge_environments_.end()) { | |
1900 if (environment() != nullptr) { | 1901 if (environment() != nullptr) { |
1901 merge_environments_[current_offset]->Merge(environment()); | 1902 it->second->Merge(environment()); |
1902 } | 1903 } |
1903 set_environment(merge_environments_[current_offset]); | 1904 set_environment(it->second); |
1904 } | 1905 } |
1905 } | 1906 } |
1906 | 1907 |
1907 void BytecodeGraphBuilder::BuildLoopHeaderEnvironment(int current_offset) { | 1908 void BytecodeGraphBuilder::BuildLoopHeaderEnvironment(int current_offset) { |
1908 if (branch_analysis()->backward_branches_target(current_offset)) { | 1909 if (branch_analysis()->backward_branches_target(current_offset)) { |
1909 // Add loop header and store a copy so we can connect merged back | 1910 // Add loop header and store a copy so we can connect merged back |
1910 // edge inputs to the loop header. | 1911 // edge inputs to the loop header. |
1911 merge_environments_[current_offset] = environment()->CopyForLoop(); | 1912 merge_environments_[current_offset] = environment()->CopyForLoop(); |
1912 } | 1913 } |
1913 } | 1914 } |
1914 | 1915 |
1915 void BytecodeGraphBuilder::MergeIntoSuccessorEnvironment(int target_offset) { | 1916 void BytecodeGraphBuilder::MergeIntoSuccessorEnvironment(int target_offset) { |
1916 BuildLoopExitsForBranch(target_offset); | 1917 BuildLoopExitsForBranch(target_offset); |
1917 if (merge_environments_[target_offset] == nullptr) { | 1918 Environment*& merge_environment = merge_environments_[target_offset]; |
1919 if (merge_environment == nullptr) { | |
1918 // Append merge nodes to the environment. We may merge here with another | 1920 // Append merge nodes to the environment. We may merge here with another |
1919 // environment. So add a place holder for merge nodes. We may add redundant | 1921 // environment. So add a place holder for merge nodes. We may add redundant |
1920 // but will be eliminated in a later pass. | 1922 // but will be eliminated in a later pass. |
1921 // TODO(mstarzinger): Be smarter about this! | 1923 // TODO(mstarzinger): Be smarter about this! |
1922 NewMerge(); | 1924 NewMerge(); |
1923 merge_environments_[target_offset] = environment(); | 1925 merge_environment = environment(); |
1924 } else { | 1926 } else { |
1925 merge_environments_[target_offset]->Merge(environment()); | 1927 merge_environment->Merge(environment()); |
1926 } | 1928 } |
1927 set_environment(nullptr); | 1929 set_environment(nullptr); |
1928 } | 1930 } |
1929 | 1931 |
1930 void BytecodeGraphBuilder::MergeControlToLeaveFunction(Node* exit) { | 1932 void BytecodeGraphBuilder::MergeControlToLeaveFunction(Node* exit) { |
1931 exit_controls_.push_back(exit); | 1933 exit_controls_.push_back(exit); |
1932 set_environment(nullptr); | 1934 set_environment(nullptr); |
1933 } | 1935 } |
1934 | 1936 |
1935 void BytecodeGraphBuilder::BuildOSRLoopEntryPoint(int current_offset) { | 1937 void BytecodeGraphBuilder::BuildOSRLoopEntryPoint(int current_offset) { |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2231 it->source_position().ScriptOffset(), start_position_.InliningId())); | 2233 it->source_position().ScriptOffset(), start_position_.InliningId())); |
2232 it->Advance(); | 2234 it->Advance(); |
2233 } else { | 2235 } else { |
2234 DCHECK_GT(it->code_offset(), offset); | 2236 DCHECK_GT(it->code_offset(), offset); |
2235 } | 2237 } |
2236 } | 2238 } |
2237 | 2239 |
2238 } // namespace compiler | 2240 } // namespace compiler |
2239 } // namespace internal | 2241 } // namespace internal |
2240 } // namespace v8 | 2242 } // namespace v8 |
OLD | NEW |