Make --always-opt also optimize top-level code.
This enables eager optimization of top-level code with TurboFan and extends test coverage by triggering it with the --always-opt flag. Script contexts are now also properly allocated in TurboFan. R=titzer@chromium.org Review URL: https://codereview.chromium.org/1053063003 Cr-Commit-Position: refs/heads/master@{#27633}
This commit is contained in:
parent
cad511f551
commit
2d281e71ac
@ -180,6 +180,7 @@ bool LCodeGen::GeneratePrologue() {
|
||||
Comment(";;; Allocate local context");
|
||||
bool need_write_barrier = true;
|
||||
// Argument to NewContext is the function, which is in r1.
|
||||
DCHECK(!info()->scope()->is_script_scope());
|
||||
if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
||||
FastNewContextStub stub(isolate(), heap_slots);
|
||||
__ CallStub(&stub);
|
||||
|
@ -703,6 +703,7 @@ bool LCodeGen::GeneratePrologue() {
|
||||
Comment(";;; Allocate local context");
|
||||
bool need_write_barrier = true;
|
||||
// Argument to NewContext is the function, which is in x1.
|
||||
DCHECK(!info()->scope()->is_script_scope());
|
||||
if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
||||
FastNewContextStub stub(isolate(), heap_slots);
|
||||
__ CallStub(&stub);
|
||||
|
@ -164,7 +164,6 @@ namespace internal {
|
||||
V(kModuleVariable, "Module variable") \
|
||||
V(kModuleUrl, "Module url") \
|
||||
V(kNativeFunctionLiteral, "Native function literal") \
|
||||
V(kSuperReference, "Super reference") \
|
||||
V(kNeedSmiLiteral, "Need a Smi literal here") \
|
||||
V(kNoCasesLeft, "No cases left") \
|
||||
V(kNoEmptyArraysHereInEmitFastOneByteArrayJoin, \
|
||||
@ -215,10 +214,12 @@ namespace internal {
|
||||
V(kReturnAddressNotFoundInFrame, "Return address not found in frame") \
|
||||
V(kRhsHasBeenClobbered, "Rhs has been clobbered") \
|
||||
V(kScopedBlock, "ScopedBlock") \
|
||||
V(kScriptContext, "Allocation of script context") \
|
||||
V(kSmiAdditionOverflow, "Smi addition overflow") \
|
||||
V(kSmiSubtractionOverflow, "Smi subtraction overflow") \
|
||||
V(kStackAccessBelowStackPointer, "Stack access below stack pointer") \
|
||||
V(kStackFrameTypesMustMatch, "Stack frame types must match") \
|
||||
V(kSuperReference, "Super reference") \
|
||||
V(kTheCurrentStackPointerIsBelowCsp, \
|
||||
"The current stack pointer is below csp") \
|
||||
V(kTheInstructionShouldBeALis, "The instruction should be a lis") \
|
||||
|
@ -1472,6 +1472,24 @@ MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function,
|
||||
}
|
||||
current_code->set_profiler_ticks(0);
|
||||
|
||||
// TODO(mstarzinger): We cannot properly deserialize a scope chain containing
|
||||
// an eval scope and hence would fail at parsing the eval source again.
|
||||
if (shared->disable_optimization_reason() == kEval) {
|
||||
return MaybeHandle<Code>();
|
||||
}
|
||||
|
||||
// TODO(mstarzinger): We cannot properly deserialize a scope chain for the
|
||||
// builtin context, hence Genesis::InstallExperimentalNatives would fail.
|
||||
if (shared->is_toplevel() && isolate->bootstrapper()->IsActive()) {
|
||||
return MaybeHandle<Code>();
|
||||
}
|
||||
|
||||
// TODO(titzer): Some top-level code times out because of missing interrupt
|
||||
// checks at back-branches, these are currently marked with --no-turbo-osr.
|
||||
if (shared->is_toplevel() && !FLAG_turbo_osr) {
|
||||
return MaybeHandle<Code>();
|
||||
}
|
||||
|
||||
info->SetOptimizing(osr_ast_id, current_code);
|
||||
|
||||
if (mode == CONCURRENT) {
|
||||
|
@ -476,9 +476,7 @@ bool AstGraphBuilder::CreateGraph(bool constant_context, bool stack_check) {
|
||||
int heap_slots = info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
|
||||
if (heap_slots > 0) {
|
||||
// Push a new inner context scope for the function.
|
||||
Node* closure = GetFunctionClosure();
|
||||
Node* inner_context =
|
||||
BuildLocalFunctionContext(function_context_.get(), closure);
|
||||
Node* inner_context = BuildLocalFunctionContext(function_context_.get());
|
||||
ContextScope top_context(this, scope, inner_context);
|
||||
CreateGraphBody(stack_check);
|
||||
} else {
|
||||
@ -2474,7 +2472,8 @@ void AstGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) {
|
||||
Node* flags = jsgraph()->Constant(encoded_flags);
|
||||
Node* pairs = jsgraph()->Constant(data);
|
||||
const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 3);
|
||||
NewNode(op, current_context(), pairs, flags);
|
||||
Node* call = NewNode(op, current_context(), pairs, flags);
|
||||
PrepareFrameState(call, BailoutId::Declarations());
|
||||
globals()->clear();
|
||||
}
|
||||
|
||||
@ -2633,10 +2632,14 @@ Node* AstGraphBuilder::BuildPatchReceiverToGlobalProxy(Node* receiver) {
|
||||
}
|
||||
|
||||
|
||||
Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
|
||||
Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context) {
|
||||
Node* closure = GetFunctionClosure();
|
||||
|
||||
// Allocate a new local context.
|
||||
const Operator* op = javascript()->CreateFunctionContext();
|
||||
Node* local_context = NewNode(op, closure);
|
||||
Node* local_context =
|
||||
info()->scope()->is_script_scope()
|
||||
? BuildLocalScriptContext(info()->scope())
|
||||
: NewNode(javascript()->CreateFunctionContext(), closure);
|
||||
|
||||
// Copy parameters into context if necessary.
|
||||
int num_parameters = info()->scope()->num_parameters();
|
||||
@ -2656,12 +2659,25 @@ Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
|
||||
}
|
||||
|
||||
|
||||
Node* AstGraphBuilder::BuildLocalScriptContext(Scope* scope) {
|
||||
Node* closure = GetFunctionClosure();
|
||||
|
||||
// Allocate a new local context.
|
||||
const Operator* op = javascript()->CreateScriptContext();
|
||||
Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
|
||||
Node* local_context = NewNode(op, closure, scope_info);
|
||||
PrepareFrameState(local_context, BailoutId::FunctionEntry());
|
||||
|
||||
return local_context;
|
||||
}
|
||||
|
||||
|
||||
Node* AstGraphBuilder::BuildLocalBlockContext(Scope* scope) {
|
||||
Node* closure = GetFunctionClosure();
|
||||
|
||||
// Allocate a new local context.
|
||||
const Operator* op = javascript()->CreateBlockContext();
|
||||
Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(info_->isolate()));
|
||||
Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
|
||||
Node* local_context = NewNode(op, scope_info, closure);
|
||||
|
||||
return local_context;
|
||||
|
@ -245,8 +245,9 @@ class AstGraphBuilder : public AstVisitor {
|
||||
// Builder to create a receiver check for sloppy mode.
|
||||
Node* BuildPatchReceiverToGlobalProxy(Node* receiver);
|
||||
|
||||
// Builders to create local function and block contexts.
|
||||
Node* BuildLocalFunctionContext(Node* context, Node* closure);
|
||||
// Builders to create local function, script and block contexts.
|
||||
Node* BuildLocalFunctionContext(Node* context);
|
||||
Node* BuildLocalScriptContext(Scope* scope);
|
||||
Node* BuildLocalBlockContext(Scope* scope);
|
||||
|
||||
// Builder to create an arguments object if it is used.
|
||||
|
@ -98,7 +98,7 @@ REPLACE_RUNTIME_CALL(JSCreateFunctionContext, Runtime::kNewFunctionContext)
|
||||
REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext)
|
||||
REPLACE_RUNTIME_CALL(JSCreateBlockContext, Runtime::kPushBlockContext)
|
||||
REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext)
|
||||
REPLACE_RUNTIME_CALL(JSCreateScriptContext, Runtime::kAbort)
|
||||
REPLACE_RUNTIME_CALL(JSCreateScriptContext, Runtime::kNewScriptContext)
|
||||
#undef REPLACE_RUNTIME
|
||||
|
||||
|
||||
|
@ -104,7 +104,6 @@ bool Linkage::NeedsFrameState(Runtime::FunctionId function) {
|
||||
// not to call into arbitrary JavaScript, not to throw, and not to deoptimize
|
||||
// are blacklisted here and can be called without a FrameState.
|
||||
switch (function) {
|
||||
case Runtime::kDeclareGlobals: // TODO(jarin): Is it safe?
|
||||
case Runtime::kDefineClassMethod: // TODO(jarin): Is it safe?
|
||||
case Runtime::kDefineGetterPropertyUnchecked: // TODO(jarin): Is it safe?
|
||||
case Runtime::kDefineSetterPropertyUnchecked: // TODO(jarin): Is it safe?
|
||||
|
@ -52,6 +52,7 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
|
||||
case IrOpcode::kJSNotEqual:
|
||||
|
||||
// Context operations
|
||||
case IrOpcode::kJSCreateScriptContext:
|
||||
case IrOpcode::kJSCreateWithContext:
|
||||
|
||||
// Conversions
|
||||
|
@ -1375,11 +1375,6 @@ Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) {
|
||||
}
|
||||
|
||||
|
||||
static bool ShouldOptimizeNewClosure(Handle<SharedFunctionInfo> info) {
|
||||
return !info->is_toplevel() && info->allows_lazy_compilation();
|
||||
}
|
||||
|
||||
|
||||
Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
|
||||
Handle<SharedFunctionInfo> info,
|
||||
Handle<Context> context,
|
||||
@ -1393,6 +1388,10 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
|
||||
info->ResetForNewContext(isolate()->heap()->global_ic_age());
|
||||
}
|
||||
|
||||
if (FLAG_always_opt && info->allows_lazy_compilation()) {
|
||||
result->MarkForOptimization();
|
||||
}
|
||||
|
||||
int index = info->SearchOptimizedCodeMap(context->native_context(),
|
||||
BailoutId::None());
|
||||
if (!info->bound() && index < 0) {
|
||||
@ -1408,12 +1407,8 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
|
||||
Code* code = info->GetCodeFromOptimizedCodeMap(index);
|
||||
DCHECK(!code->marked_for_deoptimization());
|
||||
result->ReplaceCode(code);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (FLAG_always_opt && ShouldOptimizeNewClosure(info)) {
|
||||
result->MarkForOptimization();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -4220,6 +4220,11 @@ bool HOptimizedGraphBuilder::BuildGraph() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (current_info()->scope()->is_script_scope()) {
|
||||
Bailout(kScriptContext);
|
||||
return false;
|
||||
}
|
||||
|
||||
Scope* scope = current_info()->scope();
|
||||
SetUpScope(scope);
|
||||
|
||||
@ -11435,7 +11440,7 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration(
|
||||
|
||||
void HOptimizedGraphBuilder::VisitModuleDeclaration(
|
||||
ModuleDeclaration* declaration) {
|
||||
UNREACHABLE();
|
||||
return Bailout(kModuleDeclaration);
|
||||
}
|
||||
|
||||
|
||||
|
@ -257,6 +257,7 @@ bool LCodeGen::GeneratePrologue() {
|
||||
Comment(";;; Allocate local context");
|
||||
bool need_write_barrier = true;
|
||||
// Argument to NewContext is the function, which is still in edi.
|
||||
DCHECK(!info()->scope()->is_script_scope());
|
||||
if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
||||
FastNewContextStub stub(isolate(), heap_slots);
|
||||
__ CallStub(&stub);
|
||||
|
@ -200,6 +200,7 @@ bool LCodeGen::GeneratePrologue() {
|
||||
Comment(";;; Allocate local context");
|
||||
bool need_write_barrier = true;
|
||||
// Argument to NewContext is the function, which is in a1.
|
||||
DCHECK(!info()->scope()->is_script_scope());
|
||||
if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
||||
FastNewContextStub stub(isolate(), heap_slots);
|
||||
__ CallStub(&stub);
|
||||
|
@ -195,6 +195,7 @@ bool LCodeGen::GeneratePrologue() {
|
||||
Comment(";;; Allocate local context");
|
||||
bool need_write_barrier = true;
|
||||
// Argument to NewContext is the function, which is still in rdi.
|
||||
DCHECK(!info()->scope()->is_script_scope());
|
||||
if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
||||
FastNewContextStub stub(isolate(), heap_slots);
|
||||
__ CallStub(&stub);
|
||||
|
@ -97,20 +97,28 @@
|
||||
'test-api/Threading*': [PASS, NO_VARIANTS],
|
||||
'test-heap/IncrementalMarkingStepMakesBigProgressWithLargeObjects': [PASS, NO_VARIANTS],
|
||||
'test-heap-profiler/ManyLocalsInSharedContext': [PASS, NO_VARIANTS],
|
||||
'test-serialize/SerializeToplevelLargeCodeObject': [PASS, NO_VARIANTS],
|
||||
'test-debug/ThreadedDebugging': [PASS, NO_VARIANTS],
|
||||
'test-debug/DebugBreakLoop': [PASS, NO_VARIANTS],
|
||||
# BUG(3742).
|
||||
'test-mark-compact/MarkCompactCollector': [PASS, ['arch==arm', NO_VARIANTS]],
|
||||
|
||||
# TODO(mstarzinger): The rewriter is not being called when top-level code is
|
||||
# optimized and hence scripts don't "return" the correct value. Fix this.
|
||||
'test-compiler/CompileFunctionInContext*': [PASS, NO_VARIANTS],
|
||||
|
||||
# TODO(mstarzinger): These tests count the number of optimized code objects
|
||||
# and therefore break because top-level code is optimized. Fix the tests.
|
||||
'test-heap/NextCodeLinkIsWeak': [PASS, NO_VARIANTS],
|
||||
'test-heap/TestInternalWeakLists': [PASS, NO_VARIANTS],
|
||||
'test-heap/TestInternalWeakListsTraverseWithGC': [PASS, NO_VARIANTS],
|
||||
|
||||
# TODO(jarin): Cannot lazy-deoptimize from conversions before comparisons.
|
||||
'test-js-typed-lowering/OrderCompareEffects': [SKIP],
|
||||
|
||||
# TODO(jochen): Reenable after we removed the CHECK() from the marking queue.
|
||||
'test-mark-compact/MarkingDeque': [SKIP],
|
||||
|
||||
'test-heap/TestInternalWeakLists': [PASS, ['arch==arm', NO_VARIANTS]],
|
||||
'test-heap/TestInternalWeakListsTraverseWithGC': [PASS, ['arch==arm', NO_VARIANTS]],
|
||||
|
||||
############################################################################
|
||||
# Slow tests.
|
||||
'test-api/Threading1': [PASS, ['mode == debug', SLOW]],
|
||||
|
@ -5312,7 +5312,8 @@ void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) {
|
||||
CHECK_EQ(0,
|
||||
strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a"));
|
||||
CHECK_EQ(1, message->GetLineNumber());
|
||||
CHECK_EQ(6, message->GetStartColumn());
|
||||
// TODO(3995): Our compilers disagree about the position.
|
||||
if (!i::FLAG_always_opt) CHECK_EQ(6, message->GetStartColumn());
|
||||
}
|
||||
|
||||
|
||||
@ -9794,7 +9795,11 @@ THREADED_TEST(ConstructorForObject) {
|
||||
value = CompileRun("new obj2(28)");
|
||||
CHECK(try_catch.HasCaught());
|
||||
String::Utf8Value exception_value1(try_catch.Exception());
|
||||
CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1));
|
||||
// TODO(3995): Our compilers disagree about the position (and message).
|
||||
if (!i::FLAG_always_opt) {
|
||||
CHECK_EQ(0,
|
||||
strcmp("TypeError: obj2 is not a function", *exception_value1));
|
||||
}
|
||||
try_catch.Reset();
|
||||
|
||||
Local<Value> args[] = {v8_num(29)};
|
||||
|
@ -6732,6 +6732,10 @@ TEST(Backtrace) {
|
||||
|
||||
v8::Debug::SetMessageHandler(BacktraceData::MessageHandler);
|
||||
|
||||
// TODO(3995): This doesn't work with --always-opt because we don't have
|
||||
// correct source positions in optimized code. Enable once we have.
|
||||
i::FLAG_always_opt = false;
|
||||
|
||||
const int kBufferSize = 1000;
|
||||
uint16_t buffer[kBufferSize];
|
||||
const char* scripts_command =
|
||||
@ -6988,7 +6992,6 @@ TEST(DeoptimizeDuringDebugBreak) {
|
||||
frame_function_name_source,
|
||||
"frame_function_name");
|
||||
|
||||
|
||||
// Set a debug event listener which will keep interrupting execution until
|
||||
// debug break. When inside function bar it will deoptimize all functions.
|
||||
// This tests lazy deoptimization bailout for the stack check, as the first
|
||||
@ -6997,13 +7000,12 @@ TEST(DeoptimizeDuringDebugBreak) {
|
||||
v8::Debug::SetDebugEventListener(DebugEventBreakDeoptimize);
|
||||
|
||||
// Compile and run function bar which will optimize it for some flag settings.
|
||||
v8::Script::Compile(v8::String::NewFromUtf8(
|
||||
env->GetIsolate(), "function bar(){}; bar()"))->Run();
|
||||
v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar");
|
||||
f->Call(v8::Undefined(env->GetIsolate()), 0, NULL);
|
||||
|
||||
// Set debug break and call bar again.
|
||||
v8::Debug::DebugBreak(env->GetIsolate());
|
||||
v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar()"))
|
||||
->Run();
|
||||
f->Call(v8::Undefined(env->GetIsolate()), 0, NULL);
|
||||
|
||||
CHECK(debug_event_break_deoptimize_done);
|
||||
|
||||
|
@ -3433,7 +3433,8 @@ TEST(UseAsmUseCount) {
|
||||
"var foo = 1;\n"
|
||||
"\"use asm\";\n" // Only the first one counts.
|
||||
"function bar() { \"use asm\"; var baz = 1; }");
|
||||
CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]);
|
||||
// Optimizing will double-count because the source is parsed twice.
|
||||
CHECK_EQ(i::FLAG_always_opt ? 4 : 2, use_counts[v8::Isolate::kUseAsm]);
|
||||
}
|
||||
|
||||
|
||||
@ -3452,7 +3453,8 @@ TEST(UseConstLegacyCount) {
|
||||
" const z = 1; var baz = 1;\n"
|
||||
" function q() { const k = 42; }\n"
|
||||
"}");
|
||||
CHECK_EQ(4, use_counts[v8::Isolate::kLegacyConst]);
|
||||
// Optimizing will double-count because the source is parsed twice.
|
||||
CHECK_EQ(i::FLAG_always_opt ? 8 : 4, use_counts[v8::Isolate::kLegacyConst]);
|
||||
}
|
||||
|
||||
|
||||
|
@ -152,6 +152,7 @@ TEST(TerminateOnlyV8ThreadFromThreadItselfNoLoop) {
|
||||
// Run a loop that will be infinite if thread termination does not work.
|
||||
v8::Handle<v8::String> source = v8::String::NewFromUtf8(
|
||||
CcTest::isolate(), "try { loop(); fail(); } catch(e) { fail(); }");
|
||||
i::FLAG_turbo_osr = false; // TODO(titzer): interrupts in TF loops.
|
||||
v8::Script::Compile(source)->Run();
|
||||
CHECK(!v8::V8::IsExecutionTerminating(CcTest::isolate()));
|
||||
// Test that we can run the code again after thread termination.
|
||||
@ -361,6 +362,7 @@ TEST(TerminateCancelTerminateFromThreadItself) {
|
||||
CHECK(!v8::V8::IsExecutionTerminating(CcTest::isolate()));
|
||||
v8::Handle<v8::String> source = v8::String::NewFromUtf8(
|
||||
isolate, "try { doloop(); } catch(e) { fail(); } 'completed';");
|
||||
i::FLAG_turbo_osr = false; // TODO(titzer): interrupts in TF loops.
|
||||
// Check that execution completed with correct return value.
|
||||
CHECK(v8::Script::Compile(source)->Run()->Equals(v8_str("completed")));
|
||||
}
|
||||
@ -507,6 +509,7 @@ TEST(TerminationInInnerTryCall) {
|
||||
v8::Context::Scope context_scope(context);
|
||||
{
|
||||
v8::TryCatch try_catch;
|
||||
i::FLAG_turbo_osr = false; // TODO(titzer): interrupts in TF loops.
|
||||
CompileRun("inner_try_call_terminate()");
|
||||
CHECK(try_catch.HasTerminated());
|
||||
}
|
||||
|
@ -76,6 +76,7 @@
|
||||
'json2': [PASS, NO_VARIANTS],
|
||||
'packed-elements': [PASS, NO_VARIANTS],
|
||||
'unbox-double-arrays': [PASS, NO_VARIANTS],
|
||||
'unicode-test': [PASS, NO_VARIANTS],
|
||||
'whitespaces': [PASS, NO_VARIANTS],
|
||||
'compiler/osr-assert': [PASS, NO_VARIANTS],
|
||||
'regress/regress-2185-2': [PASS, NO_VARIANTS],
|
||||
@ -91,6 +92,17 @@
|
||||
# not work, but we expect it to not crash.
|
||||
'debug-step-turbofan': [PASS, FAIL],
|
||||
|
||||
# TODO(mstarzinger): Optimizing top-level code revealed some issues. Fix!
|
||||
'debug-compile-event-newfunction': [PASS, NO_VARIANTS],
|
||||
'debug-evaluate-locals-optimized': [PASS, NO_VARIANTS],
|
||||
'debug-evaluate-locals-optimized-double': [PASS, NO_VARIANTS],
|
||||
'debug-evaluate-recursive': [PASS, NO_VARIANTS], # only in no-snap debug.
|
||||
|
||||
# TODO(mstarzinger): Optimizing top-level code flushed out some correctness
|
||||
# issues on ARM and ARM64.
|
||||
'es6/math-log2-log10': [PASS, NO_VARIANTS], # on ARM and ARM64.
|
||||
'mirror-script': [PASS, NO_VARIANTS], # on ARM64 only.
|
||||
|
||||
# TODO(jarin/mstarzinger): Investigate debugger issues with TurboFan.
|
||||
'debug-evaluate-const': [PASS, NO_VARIANTS],
|
||||
'debug-evaluate-locals': [PASS, NO_VARIANTS],
|
||||
@ -119,8 +131,9 @@
|
||||
'regress/regress-crbug-217858': [PASS, ['mode == debug', SKIP]],
|
||||
|
||||
##############################################################################
|
||||
# Only regexp stuff tested, no need for extensive Crankshaft tests.
|
||||
# Only RegExp stuff tested, no need for extensive optimizing compiler tests.
|
||||
'regexp-global': [PASS, NO_VARIANTS],
|
||||
'third_party/regexp-pcre': [PASS, NO_VARIANTS],
|
||||
|
||||
##############################################################################
|
||||
# No need to waste time for this test.
|
||||
|
@ -58,9 +58,20 @@
|
||||
'js1_4/Functions/function-001': [PASS, NO_VARIANTS],
|
||||
'js1_5/Regress/regress-80981': [PASS, NO_VARIANTS],
|
||||
|
||||
# TODO(turbofan): Causes timeouts since top-level code is optimized.
|
||||
'ecma_3/Statements/regress-324650': [PASS, NO_VARIANTS],
|
||||
'ecma_3/Statements/regress-74474-002': [PASS, NO_VARIANTS],
|
||||
'ecma_3/Statements/regress-74474-003': [PASS, NO_VARIANTS],
|
||||
'js1_5/Regress/regress-111557': [PASS, NO_VARIANTS],
|
||||
'js1_5/Regress/regress-155081-2': [PASS, NO_VARIANTS],
|
||||
'js1_5/Regress/regress-451322': [PASS, NO_VARIANTS],
|
||||
|
||||
# TODO(turbofan): Large switch statements crash.
|
||||
'js1_5/Regress/regress-398085-01': [PASS, NO_VARIANTS],
|
||||
|
||||
# TODO(mstarzinger): Investigate failure with lookup slot declaration.
|
||||
'js1_5/Regress/regress-343713': [PASS, NO_VARIANTS],
|
||||
|
||||
############################ INVALID TESTS #############################
|
||||
|
||||
# Function length properties are configurable in ES6
|
||||
|
@ -81,7 +81,7 @@ const SharedOperator kSharedOperators[] = {
|
||||
SHARED(CreateWithContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
|
||||
SHARED(CreateBlockContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
|
||||
SHARED(CreateModuleContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
|
||||
SHARED(CreateScriptContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2)
|
||||
SHARED(CreateScriptContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2)
|
||||
#undef SHARED
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user