From 67388ea26a0124ef57764e1dad82de57eef7c248 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Thu, 31 Jul 2014 11:20:36 +0000 Subject: [PATCH] Implement lowering of JSLoadContext to machine operators. R=titzer@chromium.org Review URL: https://codereview.chromium.org/433853002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22748 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/compiler/js-generic-lowering.cc | 15 ++++++++++++--- src/compiler/pipeline.cc | 2 ++ src/runtime.cc | 14 -------------- src/runtime.h | 1 - tools/generate-runtime-tests.py | 4 ++-- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc index 5085e9f..4679e4c 100644 --- a/src/compiler/js-generic-lowering.cc +++ b/src/compiler/js-generic-lowering.cc @@ -370,9 +370,18 @@ Node* JSGenericLowering::LowerJSInstanceOf(Node* node) { Node* JSGenericLowering::LowerJSLoadContext(Node* node) { ContextAccess access = OpParameter(node); - PatchInsertInput(node, 1, SmiConstant(access.depth())); - PatchInsertInput(node, 2, SmiConstant(access.index())); - ReplaceWithRuntimeCall(node, Runtime::kLoadContextRelative, 3); + // TODO(mstarzinger): Use simplified operators instead of machine operators + // here so that load/store optimization can be applied afterwards. + for (int i = 0; i < access.depth(); ++i) { + node->ReplaceInput( + 0, graph()->NewNode( + machine()->Load(kMachineTagged), + NodeProperties::GetValueInput(node, 0), + Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)), + NodeProperties::GetEffectInput(node))); + } + node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); + PatchOperator(node, machine()->Load(kMachineTagged)); return node; } diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc index 3086e68..ef071bb 100644 --- a/src/compiler/pipeline.cc +++ b/src/compiler/pipeline.cc @@ -177,6 +177,8 @@ Handle Pipeline::GenerateCode() { MachineOperatorBuilder machine(zone()); JSGenericLowering lowering(info(), &jsgraph, &machine, &source_positions); lowering.LowerAllNodes(); + + VerifyAndPrintGraph(&graph, "Lowered generic"); } // Compute a schedule. diff --git a/src/runtime.cc b/src/runtime.cc index cb2e8df..7afa3a6 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -9408,20 +9408,6 @@ RUNTIME_FUNCTION(Runtime_StoreLookupSlot) { } -RUNTIME_FUNCTION(Runtime_LoadContextRelative) { - SealHandleScope shs(isolate); - ASSERT(args.length() == 3); - CONVERT_ARG_CHECKED(Context, context, 0); - CONVERT_SMI_ARG_CHECKED(depth, 1); - CONVERT_SMI_ARG_CHECKED(index, 2); - while (depth-- > 0) { - context = context->previous(); - ASSERT(context->IsContext()); - } - return context->get(index); -} - - RUNTIME_FUNCTION(Runtime_StoreContextRelative) { SealHandleScope shs(isolate); ASSERT(args.length() == 4); diff --git a/src/runtime.h b/src/runtime.h index ca5a3f1..67e6148 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -479,7 +479,6 @@ namespace internal { F(PushModuleContext, 2, 1) \ F(DeleteLookupSlot, 2, 1) \ F(LoadLookupSlot, 2, 2) \ - F(LoadContextRelative, 3, 1) /* TODO(turbofan): Only temporary */ \ F(LoadLookupSlotNoReferenceError, 2, 2) \ F(StoreLookupSlot, 4, 1) \ F(StoreContextRelative, 4, 1) /* TODO(turbofan): Only temporary */ \ diff --git a/tools/generate-runtime-tests.py b/tools/generate-runtime-tests.py index a22ac16..d766409 100755 --- a/tools/generate-runtime-tests.py +++ b/tools/generate-runtime-tests.py @@ -47,9 +47,9 @@ EXPAND_MACROS = [ # that the parser doesn't bit-rot. Change the values as needed when you add, # remove or change runtime functions, but make sure we don't lose our ability # to parse them! -EXPECTED_FUNCTION_COUNT = 427 +EXPECTED_FUNCTION_COUNT = 426 EXPECTED_FUZZABLE_COUNT = 338 -EXPECTED_CCTEST_COUNT = 11 +EXPECTED_CCTEST_COUNT = 10 EXPECTED_UNKNOWN_COUNT = 4 EXPECTED_BUILTINS_COUNT = 816 -- 2.7.4