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

Side by Side Diff: src/compiler.cc

Issue 1110573002: Allow TurboFan to compile more methods. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « no previous file | src/lithium.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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.h" 5 #include "src/compiler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "src/ast-numbering.h" 9 #include "src/ast-numbering.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 315
316 OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { 316 OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() {
317 DCHECK(info()->IsOptimizing()); 317 DCHECK(info()->IsOptimizing());
318 DCHECK(!info()->IsCompilingForDebugging()); 318 DCHECK(!info()->IsCompilingForDebugging());
319 319
320 // Do not use Crankshaft/TurboFan if we need to be able to set break points. 320 // Do not use Crankshaft/TurboFan if we need to be able to set break points.
321 if (isolate()->debug()->has_break_points()) { 321 if (isolate()->debug()->has_break_points()) {
322 return RetryOptimization(kDebuggerHasBreakPoints); 322 return RetryOptimization(kDebuggerHasBreakPoints);
323 } 323 }
324 324
325 // Limit the number of times we re-compile a functions with 325 // Limit the number of times we try to optimize functions.
326 // the optimizing compiler.
327 const int kMaxOptCount = 326 const int kMaxOptCount =
328 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; 327 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000;
329 if (info()->opt_count() > kMaxOptCount) { 328 if (info()->opt_count() > kMaxOptCount) {
330 return AbortOptimization(kOptimizedTooManyTimes); 329 return AbortOptimization(kOptimizedTooManyTimes);
331 } 330 }
332 331
333 // Due to an encoding limit on LUnallocated operands in the Lithium
334 // language, we cannot optimize functions with too many formal parameters
335 // or perform on-stack replacement for function with too many
336 // stack-allocated local variables.
337 //
338 // The encoding is as a signed value, with parameters and receiver using
339 // the negative indices and locals the non-negative ones.
340 const int parameter_limit = -LUnallocated::kMinFixedSlotIndex;
341 Scope* scope = info()->scope();
342 if ((scope->num_parameters() + 1) > parameter_limit) {
343 return AbortOptimization(kTooManyParameters);
344 }
345
346 const int locals_limit = LUnallocated::kMaxFixedSlotIndex;
347 if (info()->is_osr() &&
348 scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) {
349 return AbortOptimization(kTooManyParametersLocals);
350 }
351
352 // Check the whitelist for Crankshaft. 332 // Check the whitelist for Crankshaft.
353 if (!info()->closure()->PassesFilter(FLAG_hydrogen_filter)) { 333 if (!info()->closure()->PassesFilter(FLAG_hydrogen_filter)) {
354 return AbortOptimization(kHydrogenFilter); 334 return AbortOptimization(kHydrogenFilter);
355 } 335 }
356 336
357 // Optimization requires a version of fullcode with deoptimization support. 337 // Optimization requires a version of fullcode with deoptimization support.
358 // Recompile the unoptimized version of the code if the current version 338 // Recompile the unoptimized version of the code if the current version
359 // doesn't have deoptimization support already. 339 // doesn't have deoptimization support already.
360 // Otherwise, if we are gathering compilation time and space statistics 340 // Otherwise, if we are gathering compilation time and space statistics
361 // for hydrogen, gather baseline statistics for a fullcode compilation. 341 // for hydrogen, gather baseline statistics for a fullcode compilation.
(...skipping 10 matching lines...) Expand all
372 isolate()->GetHStatistics()->IncrementFullCodeGen(timer.Elapsed()); 352 isolate()->GetHStatistics()->IncrementFullCodeGen(timer.Elapsed());
373 } 353 }
374 } 354 }
375 355
376 DCHECK(info()->shared_info()->has_deoptimization_support()); 356 DCHECK(info()->shared_info()->has_deoptimization_support());
377 357
378 // Check the enabling conditions for TurboFan. 358 // Check the enabling conditions for TurboFan.
379 if (((FLAG_turbo_asm && info()->shared_info()->asm_function()) || 359 if (((FLAG_turbo_asm && info()->shared_info()->asm_function()) ||
380 info()->closure()->PassesFilter(FLAG_turbo_filter)) && 360 info()->closure()->PassesFilter(FLAG_turbo_filter)) &&
381 (FLAG_turbo_osr || !info()->is_osr())) { 361 (FLAG_turbo_osr || !info()->is_osr())) {
362 // Use TurboFan for the compilation.
382 if (FLAG_trace_opt) { 363 if (FLAG_trace_opt) {
383 OFStream os(stdout); 364 OFStream os(stdout);
384 os << "[compiling method " << Brief(*info()->closure()) 365 os << "[compiling method " << Brief(*info()->closure())
385 << " using TurboFan"; 366 << " using TurboFan";
386 if (info()->is_osr()) os << " OSR"; 367 if (info()->is_osr()) os << " OSR";
387 os << "]" << std::endl; 368 os << "]" << std::endl;
388 } 369 }
389 370
390 if (info()->shared_info()->asm_function()) { 371 if (info()->shared_info()->asm_function()) {
391 info()->MarkAsContextSpecializing(); 372 info()->MarkAsContextSpecializing();
392 } else if (FLAG_turbo_type_feedback) { 373 } else if (FLAG_turbo_type_feedback) {
393 info()->MarkAsTypeFeedbackEnabled(); 374 info()->MarkAsTypeFeedbackEnabled();
394 info()->EnsureFeedbackVector(); 375 info()->EnsureFeedbackVector();
395 } 376 }
396 377
397 Timer t(this, &time_taken_to_create_graph_); 378 Timer t(this, &time_taken_to_create_graph_);
398 compiler::Pipeline pipeline(info()); 379 compiler::Pipeline pipeline(info());
399 pipeline.GenerateCode(); 380 pipeline.GenerateCode();
400 if (!info()->code().is_null()) { 381 if (!info()->code().is_null()) {
401 info()->dependencies()->Commit(info()->code()); 382 info()->dependencies()->Commit(info()->code());
402 return SetLastStatus(SUCCEEDED); 383 return SetLastStatus(SUCCEEDED);
403 } 384 }
404 } 385 }
405 386
406 // Do not use Crankshaft if the code is intended to be serialized. 387 if (!isolate()->use_crankshaft()) {
407 if (!isolate()->use_crankshaft()) return SetLastStatus(FAILED); 388 // Crankshaft is entirely disabled.
389 return SetLastStatus(FAILED);
390 }
391
392 Scope* scope = info()->scope();
393 if (LUnallocated::TooManyParameters(scope->num_parameters())) {
394 // Crankshaft would require too many Lithium operands.
395 return AbortOptimization(kTooManyParameters);
396 }
397
398 if (info()->is_osr() &&
399 LUnallocated::TooManyParametersOrStackSlots(scope->num_parameters(),
400 scope->num_stack_slots())) {
401 // Crankshaft would require too many Lithium operands.
402 return AbortOptimization(kTooManyParametersLocals);
403 }
408 404
409 if (scope->HasIllegalRedeclaration()) { 405 if (scope->HasIllegalRedeclaration()) {
410 // Crankshaft cannot handle illegal redeclarations. 406 // Crankshaft cannot handle illegal redeclarations.
411 return AbortOptimization(kFunctionWithIllegalRedeclaration); 407 return AbortOptimization(kFunctionWithIllegalRedeclaration);
412 } 408 }
413 409
414 if (FLAG_trace_opt) { 410 if (FLAG_trace_opt) {
415 OFStream os(stdout); 411 OFStream os(stdout);
416 os << "[compiling method " << Brief(*info()->closure()) 412 os << "[compiling method " << Brief(*info()->closure())
417 << " using Crankshaft"; 413 << " using Crankshaft";
(...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 } 1541 }
1546 1542
1547 1543
1548 #if DEBUG 1544 #if DEBUG
1549 void CompilationInfo::PrintAstForTesting() { 1545 void CompilationInfo::PrintAstForTesting() {
1550 PrintF("--- Source from AST ---\n%s\n", 1546 PrintF("--- Source from AST ---\n%s\n",
1551 PrettyPrinter(isolate(), zone()).PrintProgram(function())); 1547 PrettyPrinter(isolate(), zone()).PrintProgram(function()));
1552 } 1548 }
1553 #endif 1549 #endif
1554 } } // namespace v8::internal 1550 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/lithium.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698