Commit 1528bf72 authored by ager@chromium.org's avatar ager@chromium.org

Never use classic code generator.

Crankshaft is now the default on all platforms. This is the first
patch on the way to removing the classic code generator from the
system.

R=kmillikin@chromium.org
BUG=
TEST=

Review URL: http://codereview.chromium.org/6771045

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7469 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 74c2bdc3
...@@ -2352,16 +2352,6 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2352,16 +2352,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
} }
} }
} else { } else {
// Call to some other expression. If the expression is an anonymous
// function literal not called in a loop, mark it as one that should
// also use the fast code generator.
FunctionLiteral* lit = fun->AsFunctionLiteral();
if (lit != NULL &&
lit->name()->Equals(isolate()->heap()->empty_string()) &&
loop_depth() == 0) {
lit->set_try_full_codegen(true);
}
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
} }
......
// Copyright 2010 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -1743,7 +1743,6 @@ class FunctionLiteral: public Expression { ...@@ -1743,7 +1743,6 @@ class FunctionLiteral: public Expression {
contains_loops_(contains_loops), contains_loops_(contains_loops),
function_token_position_(RelocInfo::kNoPosition), function_token_position_(RelocInfo::kNoPosition),
inferred_name_(HEAP->empty_string()), inferred_name_(HEAP->empty_string()),
try_full_codegen_(false),
pretenure_(false) { } pretenure_(false) { }
DECLARE_NODE_TYPE(FunctionLiteral) DECLARE_NODE_TYPE(FunctionLiteral)
...@@ -1781,9 +1780,6 @@ class FunctionLiteral: public Expression { ...@@ -1781,9 +1780,6 @@ class FunctionLiteral: public Expression {
inferred_name_ = inferred_name; inferred_name_ = inferred_name;
} }
bool try_full_codegen() { return try_full_codegen_; }
void set_try_full_codegen(bool flag) { try_full_codegen_ = flag; }
bool pretenure() { return pretenure_; } bool pretenure() { return pretenure_; }
void set_pretenure(bool value) { pretenure_ = value; } void set_pretenure(bool value) { pretenure_ = value; }
...@@ -1803,7 +1799,6 @@ class FunctionLiteral: public Expression { ...@@ -1803,7 +1799,6 @@ class FunctionLiteral: public Expression {
bool strict_mode_; bool strict_mode_;
int function_token_position_; int function_token_position_;
Handle<String> inferred_name_; Handle<String> inferred_name_;
bool try_full_codegen_;
bool pretenure_; bool pretenure_;
}; };
......
// Copyright 2010 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -326,30 +326,9 @@ static bool MakeCode(CompilationInfo* info) { ...@@ -326,30 +326,9 @@ static bool MakeCode(CompilationInfo* info) {
if (Rewriter::Rewrite(info) && Scope::Analyze(info)) { if (Rewriter::Rewrite(info) && Scope::Analyze(info)) {
if (V8::UseCrankshaft()) return MakeCrankshaftCode(info); if (V8::UseCrankshaft()) return MakeCrankshaftCode(info);
// If crankshaft is not supported fall back to full code generator
// Generate code and return it. Code generator selection is governed by // for all compilation.
// which backends are enabled and whether the function is considered
// run-once code or not.
//
// --full-compiler enables the dedicated backend for code we expect to
// be run once
//
// The normal choice of backend can be overridden with the flags
// --always-full-compiler.
if (Rewriter::Analyze(info)) {
Handle<SharedFunctionInfo> shared = info->shared_info();
bool is_run_once = (shared.is_null())
? info->scope()->is_global_scope()
: (shared->is_toplevel() || shared->try_full_codegen());
bool can_use_full =
FLAG_full_compiler && !info->function()->contains_loops();
if (AlwaysFullCompiler() || (is_run_once && can_use_full)) {
return FullCodeGenerator::MakeCode(info); return FullCodeGenerator::MakeCode(info);
} else {
return AssignedVariablesAnalyzer::Analyze(info) &&
CodeGenerator::MakeCode(info);
}
}
} }
return false; return false;
...@@ -721,35 +700,12 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, ...@@ -721,35 +700,12 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
if (FLAG_lazy && allow_lazy) { if (FLAG_lazy && allow_lazy) {
Handle<Code> code = info.isolate()->builtins()->LazyCompile(); Handle<Code> code = info.isolate()->builtins()->LazyCompile();
info.SetCode(code); info.SetCode(code);
} else { } else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) ||
if (V8::UseCrankshaft()) { (!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) {
if (!MakeCrankshaftCode(&info)) {
return Handle<SharedFunctionInfo>::null();
}
} else {
// The bodies of function literals have not yet been visited by the
// AST optimizer/analyzer.
if (!Rewriter::Analyze(&info)) return Handle<SharedFunctionInfo>::null();
bool is_run_once = literal->try_full_codegen();
bool can_use_full = FLAG_full_compiler && !literal->contains_loops();
if (AlwaysFullCompiler() || (is_run_once && can_use_full)) {
if (!FullCodeGenerator::MakeCode(&info)) {
return Handle<SharedFunctionInfo>::null();
}
} else {
// We fall back to the classic V8 code generator.
if (!AssignedVariablesAnalyzer::Analyze(&info) ||
!CodeGenerator::MakeCode(&info)) {
return Handle<SharedFunctionInfo>::null();
}
}
}
ASSERT(!info.code().is_null()); ASSERT(!info.code().is_null());
// Function compilation complete.
scope_info = SerializedScopeInfo::Create(info.scope()); scope_info = SerializedScopeInfo::Create(info.scope());
} else {
return Handle<SharedFunctionInfo>::null();
} }
// Create a shared function info object. // Create a shared function info object.
...@@ -791,7 +747,6 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, ...@@ -791,7 +747,6 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
function_info->SetThisPropertyAssignmentsInfo( function_info->SetThisPropertyAssignmentsInfo(
lit->has_only_simple_this_property_assignments(), lit->has_only_simple_this_property_assignments(),
*lit->this_property_assignments()); *lit->this_property_assignments());
function_info->set_try_full_codegen(lit->try_full_codegen());
function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation()); function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation());
function_info->set_strict_mode(lit->strict_mode()); function_info->set_strict_mode(lit->strict_mode());
} }
......
...@@ -97,11 +97,6 @@ private: ...@@ -97,11 +97,6 @@ private:
#define FLAG FLAG_FULL #define FLAG FLAG_FULL
// Flags for Crankshaft. // Flags for Crankshaft.
#ifdef V8_TARGET_ARCH_MIPS
DEFINE_bool(crankshaft, false, "use crankshaft")
#else
DEFINE_bool(crankshaft, true, "use crankshaft")
#endif
DEFINE_string(hydrogen_filter, "", "hydrogen use/trace filter") DEFINE_string(hydrogen_filter, "", "hydrogen use/trace filter")
DEFINE_bool(use_hydrogen, true, "use generated hydrogen for compilation") DEFINE_bool(use_hydrogen, true, "use generated hydrogen for compilation")
DEFINE_bool(build_lithium, true, "use lithium chunk builder") DEFINE_bool(build_lithium, true, "use lithium chunk builder")
......
...@@ -2268,15 +2268,6 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2268,15 +2268,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
} }
} }
} else { } else {
// Call to some other expression. If the expression is an anonymous
// function literal not called in a loop, mark it as one that should
// also use the full code generator.
FunctionLiteral* lit = fun->AsFunctionLiteral();
if (lit != NULL &&
lit->name()->Equals(isolate()->heap()->empty_string()) &&
loop_depth() == 0) {
lit->set_try_full_codegen(true);
}
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
} }
......
// Copyright 2010 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -3054,10 +3054,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, ...@@ -3054,10 +3054,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
BOOL_GETTER(SharedFunctionInfo, compiler_hints, BOOL_GETTER(SharedFunctionInfo, compiler_hints,
has_only_simple_this_property_assignments, has_only_simple_this_property_assignments,
kHasOnlySimpleThisPropertyAssignments) kHasOnlySimpleThisPropertyAssignments)
BOOL_ACCESSORS(SharedFunctionInfo,
compiler_hints,
try_full_codegen,
kTryFullCodegen)
BOOL_ACCESSORS(SharedFunctionInfo, BOOL_ACCESSORS(SharedFunctionInfo,
compiler_hints, compiler_hints,
allows_lazy_compilation, allows_lazy_compilation,
......
// Copyright 2010 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -4259,9 +4259,6 @@ class SharedFunctionInfo: public HeapObject { ...@@ -4259,9 +4259,6 @@ class SharedFunctionInfo: public HeapObject {
// this.x = y; where y is either a constant or refers to an argument. // this.x = y; where y is either a constant or refers to an argument.
inline bool has_only_simple_this_property_assignments(); inline bool has_only_simple_this_property_assignments();
inline bool try_full_codegen();
inline void set_try_full_codegen(bool flag);
// Indicates if this function can be lazy compiled. // Indicates if this function can be lazy compiled.
// This is used to determine if we can safely flush code from a function // This is used to determine if we can safely flush code from a function
// when doing GC if we expect that the function will no longer be used. // when doing GC if we expect that the function will no longer be used.
...@@ -4461,13 +4458,12 @@ class SharedFunctionInfo: public HeapObject { ...@@ -4461,13 +4458,12 @@ class SharedFunctionInfo: public HeapObject {
// Bit positions in compiler_hints. // Bit positions in compiler_hints.
static const int kHasOnlySimpleThisPropertyAssignments = 0; static const int kHasOnlySimpleThisPropertyAssignments = 0;
static const int kTryFullCodegen = 1; static const int kAllowLazyCompilation = 1;
static const int kAllowLazyCompilation = 2; static const int kLiveObjectsMayExist = 2;
static const int kLiveObjectsMayExist = 3; static const int kCodeAgeShift = 3;
static const int kCodeAgeShift = 4;
static const int kCodeAgeMask = 0x7; static const int kCodeAgeMask = 0x7;
static const int kOptimizationDisabled = 7; static const int kOptimizationDisabled = 6;
static const int kStrictModeFunction = 8; static const int kStrictModeFunction = 7;
private: private:
#if V8_HOST_ARCH_32_BIT #if V8_HOST_ARCH_32_BIT
......
// Copyright 2006-2009 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -196,7 +196,7 @@ void V8::InitializeOncePerProcess() { ...@@ -196,7 +196,7 @@ void V8::InitializeOncePerProcess() {
#if defined(V8_TARGET_ARCH_ARM) && !defined(USE_ARM_EABI) #if defined(V8_TARGET_ARCH_ARM) && !defined(USE_ARM_EABI)
use_crankshaft_ = false; use_crankshaft_ = false;
#else #else
use_crankshaft_ = FLAG_crankshaft; use_crankshaft_ = true;
#endif #endif
if (Serializer::enabled()) { if (Serializer::enabled()) {
......
...@@ -2248,15 +2248,6 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2248,15 +2248,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
} }
} }
} else { } else {
// Call to some other expression. If the expression is an anonymous
// function literal not called in a loop, mark it as one that should
// also use the full code generator.
FunctionLiteral* lit = fun->AsFunctionLiteral();
if (lit != NULL &&
lit->name()->Equals(isolate()->heap()->empty_string()) &&
loop_depth() == 0) {
lit->set_try_full_codegen(true);
}
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
} }
......
// Copyright 2007-2010 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
...@@ -371,7 +371,7 @@ TEST(DeoptimizeBinaryOperationADDString) { ...@@ -371,7 +371,7 @@ TEST(DeoptimizeBinaryOperationADDString) {
i::FLAG_always_opt = true; i::FLAG_always_opt = true;
CompileRun(f_source); CompileRun(f_source);
CompileRun("f('a+', new X());"); CompileRun("f('a+', new X());");
CHECK(!i::V8::UseCrankshaft() || CHECK(i::FLAG_always_full_compiler ||
GetJSFunction(env->Global(), "f")->IsOptimized()); GetJSFunction(env->Global(), "f")->IsOptimized());
// Call f and force deoptimization while processing the binary operation. // Call f and force deoptimization while processing the binary operation.
...@@ -423,7 +423,7 @@ static void TestDeoptimizeBinaryOpHelper(LocalContext* env, ...@@ -423,7 +423,7 @@ static void TestDeoptimizeBinaryOpHelper(LocalContext* env,
i::FLAG_always_opt = true; i::FLAG_always_opt = true;
CompileRun(f_source); CompileRun(f_source);
CompileRun("f(7, new X());"); CompileRun("f(7, new X());");
CHECK(!i::V8::UseCrankshaft() || CHECK(i::FLAG_always_full_compiler ||
GetJSFunction((*env)->Global(), "f")->IsOptimized()); GetJSFunction((*env)->Global(), "f")->IsOptimized());
// Call f and force deoptimization while processing the binary operation. // Call f and force deoptimization while processing the binary operation.
...@@ -534,7 +534,7 @@ TEST(DeoptimizeCompare) { ...@@ -534,7 +534,7 @@ TEST(DeoptimizeCompare) {
i::FLAG_always_opt = true; i::FLAG_always_opt = true;
CompileRun(f_source); CompileRun(f_source);
CompileRun("f('a', new X());"); CompileRun("f('a', new X());");
CHECK(!i::V8::UseCrankshaft() || CHECK(i::FLAG_always_full_compiler ||
GetJSFunction(env->Global(), "f")->IsOptimized()); GetJSFunction(env->Global(), "f")->IsOptimized());
// Call f and force deoptimization while processing the comparison. // Call f and force deoptimization while processing the comparison.
...@@ -606,7 +606,7 @@ TEST(DeoptimizeLoadICStoreIC) { ...@@ -606,7 +606,7 @@ TEST(DeoptimizeLoadICStoreIC) {
CompileRun("g1(new X());"); CompileRun("g1(new X());");
CompileRun("f2(new X(), 'z');"); CompileRun("f2(new X(), 'z');");
CompileRun("g2(new X(), 'z');"); CompileRun("g2(new X(), 'z');");
if (i::V8::UseCrankshaft()) { if (!i::FLAG_always_full_compiler) {
CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
...@@ -692,7 +692,7 @@ TEST(DeoptimizeLoadICStoreICNested) { ...@@ -692,7 +692,7 @@ TEST(DeoptimizeLoadICStoreICNested) {
CompileRun("g1(new X());"); CompileRun("g1(new X());");
CompileRun("f2(new X(), 'z');"); CompileRun("f2(new X(), 'z');");
CompileRun("g2(new X(), 'z');"); CompileRun("g2(new X(), 'z');");
if (i::V8::UseCrankshaft()) { if (!i::FLAG_always_full_compiler) {
CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized()); CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
......
// Copyright 2006-2008 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
#include <stdlib.h> #include <stdlib.h>
...@@ -1070,7 +1070,7 @@ TEST(TestInternalWeakLists) { ...@@ -1070,7 +1070,7 @@ TEST(TestInternalWeakLists) {
for (int i = 0; i < kNumTestContexts; i++) { for (int i = 0; i < kNumTestContexts; i++) {
ctx[i] = v8::Context::New(); ctx[i] = v8::Context::New();
bool opt = (FLAG_always_opt && i::V8::UseCrankshaft()); bool opt = (FLAG_always_opt && !i::FLAG_always_full_compiler);
CHECK_EQ(i + 1, CountGlobalContexts()); CHECK_EQ(i + 1, CountGlobalContexts());
...@@ -1204,7 +1204,7 @@ TEST(TestInternalWeakListsTraverseWithGC) { ...@@ -1204,7 +1204,7 @@ TEST(TestInternalWeakListsTraverseWithGC) {
CHECK_EQ(i + 1, CountGlobalContextsWithGC(i / 2 + 1)); CHECK_EQ(i + 1, CountGlobalContextsWithGC(i / 2 + 1));
} }
bool opt = (FLAG_always_opt && i::V8::UseCrankshaft()); bool opt = (FLAG_always_opt && !i::FLAG_always_full_compiler);
// Compile a number of functions the length of the weak list of optimized // Compile a number of functions the length of the weak list of optimized
// functions both with and without GCs while iterating the list. // functions both with and without GCs while iterating the list.
......
// Copyright 2006-2009 the V8 project authors. All rights reserved. // Copyright 2011 the V8 project authors. All rights reserved.
// //
// Tests of logging functions from log.h // Tests of logging functions from log.h
...@@ -294,7 +294,7 @@ static void CheckThatProfilerWorks(LogBufferMatcher* matcher) { ...@@ -294,7 +294,7 @@ static void CheckThatProfilerWorks(LogBufferMatcher* matcher) {
TEST(ProfLazyMode) { TEST(ProfLazyMode) {
ScopedLoggerInitializer initialize_logger(true); ScopedLoggerInitializer initialize_logger(true);
if (!i::V8::UseCrankshaft()) return; if (i::FLAG_always_full_compiler) return;
// No sampling should happen prior to resuming profiler unless we // No sampling should happen prior to resuming profiler unless we
// are runtime profiling. // are runtime profiling.
......
...@@ -584,7 +584,9 @@ class TestSuite(object): ...@@ -584,7 +584,9 @@ class TestSuite(object):
# Use this to run several variants of the tests, e.g.: # Use this to run several variants of the tests, e.g.:
# VARIANT_FLAGS = [[], ['--always_compact', '--noflush_code']] # VARIANT_FLAGS = [[], ['--always_compact', '--noflush_code']]
VARIANT_FLAGS = [[], ['--stress-opt', '--always-opt'], ['--nocrankshaft']] VARIANT_FLAGS = [[],
['--stress-opt', '--always-opt'],
['--always-full-compiler']]
class TestRepository(TestSuite): class TestRepository(TestSuite):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment