Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: src/compiler/pipeline.cc

Issue 509343002: Better typing and type verification (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Small refactoring Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/pipeline.h" 5 #include "src/compiler/pipeline.h"
6 6
7 #include "src/base/platform/elapsed-timer.h" 7 #include "src/base/platform/elapsed-timer.h"
8 #include "src/compiler/ast-graph-builder.h" 8 #include "src/compiler/ast-graph-builder.h"
9 #include "src/compiler/code-generator.h" 9 #include "src/compiler/code-generator.h"
10 #include "src/compiler/graph-replay.h" 10 #include "src/compiler/graph-replay.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 76
77 static inline bool VerifyGraphs() { 77 static inline bool VerifyGraphs() {
78 #ifdef DEBUG 78 #ifdef DEBUG
79 return true; 79 return true;
80 #else 80 #else
81 return FLAG_turbo_verify; 81 return FLAG_turbo_verify;
82 #endif 82 #endif
83 } 83 }
84 84
85 85
86 void Pipeline::VerifyAndPrintGraph(Graph* graph, const char* phase) { 86 void Pipeline::VerifyAndPrintGraph(
87 Graph* graph, const char* phase, Verifier::Typing typing) {
87 if (FLAG_trace_turbo) { 88 if (FLAG_trace_turbo) {
88 char buffer[256]; 89 char buffer[256];
89 Vector<char> filename(buffer, sizeof(buffer)); 90 Vector<char> filename(buffer, sizeof(buffer));
90 SmartArrayPointer<char> functionname = 91 SmartArrayPointer<char> functionname =
91 info_->shared_info()->DebugName()->ToCString(); 92 info_->shared_info()->DebugName()->ToCString();
92 if (strlen(functionname.get()) > 0) { 93 if (strlen(functionname.get()) > 0) {
93 SNPrintF(filename, "turbo-%s-%s.dot", functionname.get(), phase); 94 SNPrintF(filename, "turbo-%s-%s.dot", functionname.get(), phase);
94 } else { 95 } else {
95 SNPrintF(filename, "turbo-%p-%s.dot", static_cast<void*>(info_), phase); 96 SNPrintF(filename, "turbo-%p-%s.dot", static_cast<void*>(info_), phase);
96 } 97 }
97 std::replace(filename.start(), filename.start() + filename.length(), ' ', 98 std::replace(filename.start(), filename.start() + filename.length(), ' ',
98 '_'); 99 '_');
99 FILE* file = base::OS::FOpen(filename.start(), "w+"); 100 FILE* file = base::OS::FOpen(filename.start(), "w+");
100 OFStream of(file); 101 OFStream of(file);
101 of << AsDOT(*graph); 102 of << AsDOT(*graph);
102 fclose(file); 103 fclose(file);
103 104
104 OFStream os(stdout); 105 OFStream os(stdout);
105 os << "-- " << phase << " graph printed to file " << filename.start() 106 os << "-- " << phase << " graph printed to file " << filename.start()
106 << "\n"; 107 << "\n";
107 } 108 }
108 if (VerifyGraphs()) Verifier::Run(graph); 109 if (VerifyGraphs()) {
110 Verifier::Run(graph, FLAG_turbo_types ? typing : Verifier::UNTYPED);
111 }
109 } 112 }
110 113
111 114
112 class AstGraphBuilderWithPositions : public AstGraphBuilder { 115 class AstGraphBuilderWithPositions : public AstGraphBuilder {
113 public: 116 public:
114 explicit AstGraphBuilderWithPositions(CompilationInfo* info, JSGraph* jsgraph, 117 explicit AstGraphBuilderWithPositions(CompilationInfo* info, JSGraph* jsgraph,
115 SourcePositionTable* source_positions) 118 SourcePositionTable* source_positions)
116 : AstGraphBuilder(info, jsgraph), source_positions_(source_positions) {} 119 : AstGraphBuilder(info, jsgraph), source_positions_(source_positions) {}
117 120
118 bool CreateGraph() { 121 bool CreateGraph() {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 os << "---------------------------------------------------\n" 153 os << "---------------------------------------------------\n"
151 << "Begin compiling method " 154 << "Begin compiling method "
152 << info()->function()->debug_name()->ToCString().get() 155 << info()->function()->debug_name()->ToCString().get()
153 << " using Turbofan" << endl; 156 << " using Turbofan" << endl;
154 } 157 }
155 158
156 // Build the graph. 159 // Build the graph.
157 Graph graph(zone()); 160 Graph graph(zone());
158 SourcePositionTable source_positions(&graph); 161 SourcePositionTable source_positions(&graph);
159 source_positions.AddDecorator(); 162 source_positions.AddDecorator();
160 // TODO(turbofan): there is no need to type anything during initial graph 163 Typer typer(&graph, info()->context());
161 // construction. This is currently only needed for the node cache, which the
162 // typer could sweep over later.
163 Typer typer(zone());
164 CommonOperatorBuilder common(zone()); 164 CommonOperatorBuilder common(zone());
165 JSGraph jsgraph(&graph, &common, &typer); 165 JSGraph jsgraph(&graph, &common);
166 Node* context_node; 166 Node* context_node;
167 { 167 {
168 PhaseStats graph_builder_stats(info(), PhaseStats::CREATE_GRAPH, 168 PhaseStats graph_builder_stats(info(), PhaseStats::CREATE_GRAPH,
169 "graph builder"); 169 "graph builder");
170 AstGraphBuilderWithPositions graph_builder(info(), &jsgraph, 170 AstGraphBuilderWithPositions graph_builder(info(), &jsgraph,
171 &source_positions); 171 &source_positions);
172 graph_builder.CreateGraph(); 172 graph_builder.CreateGraph();
173 context_node = graph_builder.GetFunctionContext(); 173 context_node = graph_builder.GetFunctionContext();
174 } 174 }
175 { 175 {
176 PhaseStats phi_reducer_stats(info(), PhaseStats::CREATE_GRAPH, 176 PhaseStats phi_reducer_stats(info(), PhaseStats::CREATE_GRAPH,
177 "phi reduction"); 177 "phi reduction");
178 PhiReducer phi_reducer; 178 PhiReducer phi_reducer;
179 GraphReducer graph_reducer(&graph); 179 GraphReducer graph_reducer(&graph);
180 graph_reducer.AddReducer(&phi_reducer); 180 graph_reducer.AddReducer(&phi_reducer);
181 graph_reducer.ReduceGraph(); 181 graph_reducer.ReduceGraph();
182 // TODO(mstarzinger): Running reducer once ought to be enough for everyone. 182 // TODO(mstarzinger): Running reducer once ought to be enough for everyone.
183 graph_reducer.ReduceGraph(); 183 graph_reducer.ReduceGraph();
184 graph_reducer.ReduceGraph(); 184 graph_reducer.ReduceGraph();
185 } 185 }
186 186
187 VerifyAndPrintGraph(&graph, "Initial untyped"); 187 VerifyAndPrintGraph(&graph, "Initial untyped", Verifier::UNTYPED);
188 188
189 if (context_specialization_) { 189 if (context_specialization_) {
190 SourcePositionTable::Scope pos(&source_positions, 190 SourcePositionTable::Scope pos(&source_positions,
191 SourcePosition::Unknown()); 191 SourcePosition::Unknown());
192 // Specialize the code to the context as aggressively as possible. 192 // Specialize the code to the context as aggressively as possible.
193 JSContextSpecializer spec(info(), &jsgraph, context_node); 193 JSContextSpecializer spec(info(), &jsgraph, context_node);
194 spec.SpecializeToContext(); 194 spec.SpecializeToContext();
195 VerifyAndPrintGraph(&graph, "Context specialized"); 195 VerifyAndPrintGraph(&graph, "Context specialized", Verifier::UNTYPED);
196 } 196 }
197 197
198 if (FLAG_turbo_inlining) { 198 if (FLAG_turbo_inlining) {
199 SourcePositionTable::Scope pos(&source_positions, 199 SourcePositionTable::Scope pos(&source_positions,
200 SourcePosition::Unknown()); 200 SourcePosition::Unknown());
201 JSInliner inliner(info(), &jsgraph); 201 JSInliner inliner(info(), &jsgraph);
202 inliner.Inline(); 202 inliner.Inline();
203 VerifyAndPrintGraph(&graph, "Inlined"); 203 VerifyAndPrintGraph(&graph, "Inlined", Verifier::UNTYPED);
204 } 204 }
205 205
206 // Print a replay of the initial graph. 206 // Print a replay of the initial graph.
207 if (FLAG_print_turbo_replay) { 207 if (FLAG_print_turbo_replay) {
208 GraphReplayPrinter::PrintReplay(&graph); 208 GraphReplayPrinter::PrintReplay(&graph);
209 } 209 }
210 210
211 if (FLAG_turbo_types) { 211 if (FLAG_turbo_types) {
212 { 212 {
213 // Type the graph. 213 // Type the graph.
214 PhaseStats typer_stats(info(), PhaseStats::CREATE_GRAPH, "typer"); 214 PhaseStats typer_stats(info(), PhaseStats::CREATE_GRAPH, "typer");
215 typer.Run(&graph, info()->context()); 215 typer.Run();
216 } 216 }
217 // All new nodes must be typed.
218 typer.DecorateGraph(&graph);
219 { 217 {
220 // Lower JSOperators where we can determine types. 218 // Lower JSOperators where we can determine types.
221 PhaseStats lowering_stats(info(), PhaseStats::CREATE_GRAPH, 219 PhaseStats lowering_stats(info(), PhaseStats::CREATE_GRAPH,
222 "typed lowering"); 220 "typed lowering");
223 SourcePositionTable::Scope pos(&source_positions, 221 SourcePositionTable::Scope pos(&source_positions,
224 SourcePosition::Unknown()); 222 SourcePosition::Unknown());
225 JSTypedLowering lowering(&jsgraph); 223 JSTypedLowering lowering(&jsgraph);
226 GraphReducer graph_reducer(&graph); 224 GraphReducer graph_reducer(&graph);
227 graph_reducer.AddReducer(&lowering); 225 graph_reducer.AddReducer(&lowering);
228 graph_reducer.ReduceGraph(); 226 graph_reducer.ReduceGraph();
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 } 357 }
360 358
361 359
362 void Pipeline::TearDown() { 360 void Pipeline::TearDown() {
363 InstructionOperand::TearDownCaches(); 361 InstructionOperand::TearDownCaches();
364 } 362 }
365 363
366 } // namespace compiler 364 } // namespace compiler
367 } // namespace internal 365 } // namespace internal
368 } // namespace v8 366 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698