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
This commit is contained in:
parent
74c2bdc3fe
commit
1528bf7240
@ -2352,16 +2352,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
}
|
||||
}
|
||||
} 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());
|
||||
VisitForStackValue(fun);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -1743,7 +1743,6 @@ class FunctionLiteral: public Expression {
|
||||
contains_loops_(contains_loops),
|
||||
function_token_position_(RelocInfo::kNoPosition),
|
||||
inferred_name_(HEAP->empty_string()),
|
||||
try_full_codegen_(false),
|
||||
pretenure_(false) { }
|
||||
|
||||
DECLARE_NODE_TYPE(FunctionLiteral)
|
||||
@ -1781,9 +1780,6 @@ class FunctionLiteral: public Expression {
|
||||
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_; }
|
||||
void set_pretenure(bool value) { pretenure_ = value; }
|
||||
|
||||
@ -1803,7 +1799,6 @@ class FunctionLiteral: public Expression {
|
||||
bool strict_mode_;
|
||||
int function_token_position_;
|
||||
Handle<String> inferred_name_;
|
||||
bool try_full_codegen_;
|
||||
bool pretenure_;
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -326,30 +326,9 @@ static bool MakeCode(CompilationInfo* info) {
|
||||
|
||||
if (Rewriter::Rewrite(info) && Scope::Analyze(info)) {
|
||||
if (V8::UseCrankshaft()) return MakeCrankshaftCode(info);
|
||||
|
||||
// Generate code and return it. Code generator selection is governed by
|
||||
// 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);
|
||||
} else {
|
||||
return AssignedVariablesAnalyzer::Analyze(info) &&
|
||||
CodeGenerator::MakeCode(info);
|
||||
}
|
||||
}
|
||||
// If crankshaft is not supported fall back to full code generator
|
||||
// for all compilation.
|
||||
return FullCodeGenerator::MakeCode(info);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -721,35 +700,12 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
|
||||
if (FLAG_lazy && allow_lazy) {
|
||||
Handle<Code> code = info.isolate()->builtins()->LazyCompile();
|
||||
info.SetCode(code);
|
||||
} else {
|
||||
if (V8::UseCrankshaft()) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ((V8::UseCrankshaft() && MakeCrankshaftCode(&info)) ||
|
||||
(!V8::UseCrankshaft() && FullCodeGenerator::MakeCode(&info))) {
|
||||
ASSERT(!info.code().is_null());
|
||||
|
||||
// Function compilation complete.
|
||||
scope_info = SerializedScopeInfo::Create(info.scope());
|
||||
} else {
|
||||
return Handle<SharedFunctionInfo>::null();
|
||||
}
|
||||
|
||||
// Create a shared function info object.
|
||||
@ -791,7 +747,6 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
|
||||
function_info->SetThisPropertyAssignmentsInfo(
|
||||
lit->has_only_simple_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_strict_mode(lit->strict_mode());
|
||||
}
|
||||
|
@ -97,11 +97,6 @@ private:
|
||||
#define FLAG FLAG_FULL
|
||||
|
||||
// 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_bool(use_hydrogen, true, "use generated hydrogen for compilation")
|
||||
DEFINE_bool(build_lithium, true, "use lithium chunk builder")
|
||||
|
@ -2268,15 +2268,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
}
|
||||
}
|
||||
} 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());
|
||||
VisitForStackValue(fun);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -3054,10 +3054,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
|
||||
BOOL_GETTER(SharedFunctionInfo, compiler_hints,
|
||||
has_only_simple_this_property_assignments,
|
||||
kHasOnlySimpleThisPropertyAssignments)
|
||||
BOOL_ACCESSORS(SharedFunctionInfo,
|
||||
compiler_hints,
|
||||
try_full_codegen,
|
||||
kTryFullCodegen)
|
||||
BOOL_ACCESSORS(SharedFunctionInfo,
|
||||
compiler_hints,
|
||||
allows_lazy_compilation,
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -4259,9 +4259,6 @@ class SharedFunctionInfo: public HeapObject {
|
||||
// this.x = y; where y is either a constant or refers to an argument.
|
||||
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.
|
||||
// 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.
|
||||
@ -4461,13 +4458,12 @@ class SharedFunctionInfo: public HeapObject {
|
||||
|
||||
// Bit positions in compiler_hints.
|
||||
static const int kHasOnlySimpleThisPropertyAssignments = 0;
|
||||
static const int kTryFullCodegen = 1;
|
||||
static const int kAllowLazyCompilation = 2;
|
||||
static const int kLiveObjectsMayExist = 3;
|
||||
static const int kCodeAgeShift = 4;
|
||||
static const int kAllowLazyCompilation = 1;
|
||||
static const int kLiveObjectsMayExist = 2;
|
||||
static const int kCodeAgeShift = 3;
|
||||
static const int kCodeAgeMask = 0x7;
|
||||
static const int kOptimizationDisabled = 7;
|
||||
static const int kStrictModeFunction = 8;
|
||||
static const int kOptimizationDisabled = 6;
|
||||
static const int kStrictModeFunction = 7;
|
||||
|
||||
private:
|
||||
#if V8_HOST_ARCH_32_BIT
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -196,7 +196,7 @@ void V8::InitializeOncePerProcess() {
|
||||
#if defined(V8_TARGET_ARCH_ARM) && !defined(USE_ARM_EABI)
|
||||
use_crankshaft_ = false;
|
||||
#else
|
||||
use_crankshaft_ = FLAG_crankshaft;
|
||||
use_crankshaft_ = true;
|
||||
#endif
|
||||
|
||||
if (Serializer::enabled()) {
|
||||
|
@ -2248,15 +2248,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
||||
}
|
||||
}
|
||||
} 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());
|
||||
VisitForStackValue(fun);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -371,7 +371,7 @@ TEST(DeoptimizeBinaryOperationADDString) {
|
||||
i::FLAG_always_opt = true;
|
||||
CompileRun(f_source);
|
||||
CompileRun("f('a+', new X());");
|
||||
CHECK(!i::V8::UseCrankshaft() ||
|
||||
CHECK(i::FLAG_always_full_compiler ||
|
||||
GetJSFunction(env->Global(), "f")->IsOptimized());
|
||||
|
||||
// Call f and force deoptimization while processing the binary operation.
|
||||
@ -423,7 +423,7 @@ static void TestDeoptimizeBinaryOpHelper(LocalContext* env,
|
||||
i::FLAG_always_opt = true;
|
||||
CompileRun(f_source);
|
||||
CompileRun("f(7, new X());");
|
||||
CHECK(!i::V8::UseCrankshaft() ||
|
||||
CHECK(i::FLAG_always_full_compiler ||
|
||||
GetJSFunction((*env)->Global(), "f")->IsOptimized());
|
||||
|
||||
// Call f and force deoptimization while processing the binary operation.
|
||||
@ -534,7 +534,7 @@ TEST(DeoptimizeCompare) {
|
||||
i::FLAG_always_opt = true;
|
||||
CompileRun(f_source);
|
||||
CompileRun("f('a', new X());");
|
||||
CHECK(!i::V8::UseCrankshaft() ||
|
||||
CHECK(i::FLAG_always_full_compiler ||
|
||||
GetJSFunction(env->Global(), "f")->IsOptimized());
|
||||
|
||||
// Call f and force deoptimization while processing the comparison.
|
||||
@ -606,7 +606,7 @@ TEST(DeoptimizeLoadICStoreIC) {
|
||||
CompileRun("g1(new X());");
|
||||
CompileRun("f2(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(), "g1")->IsOptimized());
|
||||
CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
||||
@ -692,7 +692,7 @@ TEST(DeoptimizeLoadICStoreICNested) {
|
||||
CompileRun("g1(new X());");
|
||||
CompileRun("f2(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(), "g1")->IsOptimized());
|
||||
CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -1070,7 +1070,7 @@ TEST(TestInternalWeakLists) {
|
||||
for (int i = 0; i < kNumTestContexts; i++) {
|
||||
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());
|
||||
|
||||
@ -1204,7 +1204,7 @@ TEST(TestInternalWeakListsTraverseWithGC) {
|
||||
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
|
||||
// functions both with and without GCs while iterating the list.
|
||||
|
@ -1,4 +1,4 @@
|
||||
// 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
|
||||
|
||||
@ -294,7 +294,7 @@ static void CheckThatProfilerWorks(LogBufferMatcher* matcher) {
|
||||
TEST(ProfLazyMode) {
|
||||
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
|
||||
// are runtime profiling.
|
||||
|
@ -584,7 +584,9 @@ class TestSuite(object):
|
||||
|
||||
# Use this to run several variants of the tests, e.g.:
|
||||
# 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):
|
||||
|
Loading…
Reference in New Issue
Block a user