Commit 6935e013 authored by jarin@chromium.org's avatar jarin@chromium.org

Revert "Skip the CallFunctionStub when the callee function can be statically determined."

This reverts commit 9845dfad (r25042) for failing tests.

TBR=titzer@chromium.org
BUG=

Review URL: https://codereview.chromium.org/693103004

Cr-Commit-Position: refs/heads/master@{#25044}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25044 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 66dd92f7
...@@ -35,9 +35,8 @@ struct ArmLinkageHelperTraits { ...@@ -35,9 +35,8 @@ struct ArmLinkageHelperTraits {
typedef LinkageHelper<ArmLinkageHelperTraits> LH; typedef LinkageHelper<ArmLinkageHelperTraits> LH;
CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone, CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone) {
CallDescriptor::Flags flags) { return LH::GetJSCallDescriptor(zone, parameter_count);
return LH::GetJSCallDescriptor(zone, parameter_count, flags);
} }
......
...@@ -35,9 +35,8 @@ struct Arm64LinkageHelperTraits { ...@@ -35,9 +35,8 @@ struct Arm64LinkageHelperTraits {
typedef LinkageHelper<Arm64LinkageHelperTraits> LH; typedef LinkageHelper<Arm64LinkageHelperTraits> LH;
CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone, CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone) {
CallDescriptor::Flags flags) { return LH::GetJSCallDescriptor(zone, parameter_count);
return LH::GetJSCallDescriptor(zone, parameter_count, flags);
} }
......
...@@ -30,9 +30,8 @@ struct IA32LinkageHelperTraits { ...@@ -30,9 +30,8 @@ struct IA32LinkageHelperTraits {
typedef LinkageHelper<IA32LinkageHelperTraits> LH; typedef LinkageHelper<IA32LinkageHelperTraits> LH;
CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone, CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone) {
CallDescriptor::Flags flags) { return LH::GetJSCallDescriptor(zone, parameter_count);
return LH::GetJSCallDescriptor(zone, parameter_count, flags);
} }
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "src/compiler/js-generic-lowering.h" #include "src/compiler/js-generic-lowering.h"
#include "src/compiler/machine-operator.h" #include "src/compiler/machine-operator.h"
#include "src/compiler/node-aux-data-inl.h" #include "src/compiler/node-aux-data-inl.h"
#include "src/compiler/node-matchers.h"
#include "src/compiler/node-properties-inl.h" #include "src/compiler/node-properties-inl.h"
#include "src/unique.h" #include "src/unique.h"
...@@ -406,47 +405,15 @@ void JSGenericLowering::LowerJSCallConstruct(Node* node) { ...@@ -406,47 +405,15 @@ void JSGenericLowering::LowerJSCallConstruct(Node* node) {
} }
bool JSGenericLowering::TryLowerDirectJSCall(Node* node) { void JSGenericLowering::LowerJSCallFunction(Node* node) {
// Lower to a direct call to a constant JSFunction if the arity matches.
const CallFunctionParameters& p = CallFunctionParametersOf(node->op()); const CallFunctionParameters& p = CallFunctionParametersOf(node->op());
int arg_count = static_cast<int>(p.arity() - 2); CallFunctionStub stub(isolate(), static_cast<int>(p.arity() - 2), p.flags());
HeapObjectMatcher<JSFunction> func(node->InputAt(0)); CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
if (!func.HasValue()) return false; CallDescriptor* desc = linkage()->GetStubCallDescriptor(
d, static_cast<int>(p.arity() - 1), FlagsForNode(node));
Handle<JSFunction> function = func.Value().handle(); Node* stub_code = CodeConstant(stub.GetCode());
if (arg_count != function->shared()->formal_parameter_count()) return false; PatchInsertInput(node, 0, stub_code);
int index = NodeProperties::FirstContextIndex(node);
// TODO(titzer): total hack to share function context constants.
// Remove this when the JSGraph canonicalizes heap constants.
Node* context = node->InputAt(index);
HeapObjectMatcher<Context> context_const(context);
if (!context_const.HasValue() ||
*(context_const.Value().handle()) != function->context()) {
context = jsgraph()->HeapConstant(Handle<Context>(function->context()));
}
node->ReplaceInput(index, context);
CallDescriptor* desc = linkage()->GetJSCallDescriptor(
1 + arg_count, jsgraph()->zone(), FlagsForNode(node));
PatchOperator(node, common()->Call(desc)); PatchOperator(node, common()->Call(desc));
return true;
}
void JSGenericLowering::LowerJSCallFunction(Node* node) {
if (!TryLowerDirectJSCall(node)) {
// Call to computed function; use CallFunctionStub;
const CallFunctionParameters& p = CallFunctionParametersOf(node->op());
int arg_count = static_cast<int>(p.arity() - 2);
CallFunctionStub stub(isolate(), arg_count, p.flags());
CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
CallDescriptor* desc = linkage()->GetStubCallDescriptor(
d, static_cast<int>(p.arity() - 1), FlagsForNode(node));
Node* stub_code = CodeConstant(stub.GetCode());
PatchInsertInput(node, 0, stub_code);
PatchOperator(node, common()->Call(desc));
}
} }
......
...@@ -66,8 +66,6 @@ class JSGenericLowering : public Reducer { ...@@ -66,8 +66,6 @@ class JSGenericLowering : public Reducer {
CompilationInfo* info_; CompilationInfo* info_;
JSGraph* jsgraph_; JSGraph* jsgraph_;
Linkage* linkage_; Linkage* linkage_;
bool TryLowerDirectJSCall(Node* node);
}; };
} // namespace compiler } // namespace compiler
......
...@@ -28,8 +28,8 @@ class LinkageHelper { ...@@ -28,8 +28,8 @@ class LinkageHelper {
} }
// TODO(turbofan): cache call descriptors for JSFunction calls. // TODO(turbofan): cache call descriptors for JSFunction calls.
static CallDescriptor* GetJSCallDescriptor(Zone* zone, int js_parameter_count, static CallDescriptor* GetJSCallDescriptor(Zone* zone,
CallDescriptor::Flags flags) { int js_parameter_count) {
const size_t return_count = 1; const size_t return_count = 1;
const size_t context_count = 1; const size_t context_count = 1;
const size_t parameter_count = js_parameter_count + context_count; const size_t parameter_count = js_parameter_count + context_count;
...@@ -56,17 +56,16 @@ class LinkageHelper { ...@@ -56,17 +56,16 @@ class LinkageHelper {
// The target for JS function calls is the JSFunction object. // The target for JS function calls is the JSFunction object.
MachineType target_type = kMachAnyTagged; MachineType target_type = kMachAnyTagged;
LinkageLocation target_loc = regloc(LinkageTraits::JSCallFunctionReg()); LinkageLocation target_loc = regloc(LinkageTraits::JSCallFunctionReg());
return new (zone) CallDescriptor( // -- return new (zone) CallDescriptor(CallDescriptor::kCallJSFunction, // kind
CallDescriptor::kCallJSFunction, // kind target_type, // target MachineType
target_type, // target MachineType target_loc, // target location
target_loc, // target location types.Build(), // machine_sig
types.Build(), // machine_sig locations.Build(), // location_sig
locations.Build(), // location_sig js_parameter_count, // js_parameter_count
js_parameter_count, // js_parameter_count Operator::kNoProperties, // properties
Operator::kNoProperties, // properties kNoCalleeSaved, // callee-saved
kNoCalleeSaved, // callee-saved CallDescriptor::kNeedsFrameState, // flags
flags, // flags "js-call");
"js-call");
} }
...@@ -117,17 +116,16 @@ class LinkageHelper { ...@@ -117,17 +116,16 @@ class LinkageHelper {
// The target for runtime calls is a code object. // The target for runtime calls is a code object.
MachineType target_type = kMachAnyTagged; MachineType target_type = kMachAnyTagged;
LinkageLocation target_loc = LinkageLocation::AnyRegister(); LinkageLocation target_loc = LinkageLocation::AnyRegister();
return new (zone) CallDescriptor( // -- return new (zone) CallDescriptor(CallDescriptor::kCallCodeObject, // kind
CallDescriptor::kCallCodeObject, // kind target_type, // target MachineType
target_type, // target MachineType target_loc, // target location
target_loc, // target location types.Build(), // machine_sig
types.Build(), // machine_sig locations.Build(), // location_sig
locations.Build(), // location_sig js_parameter_count, // js_parameter_count
js_parameter_count, // js_parameter_count properties, // properties
properties, // properties kNoCalleeSaved, // callee-saved
kNoCalleeSaved, // callee-saved flags, // flags
flags, // flags function->name); // debug name
function->name); // debug name
} }
...@@ -171,17 +169,16 @@ class LinkageHelper { ...@@ -171,17 +169,16 @@ class LinkageHelper {
// The target for stub calls is a code object. // The target for stub calls is a code object.
MachineType target_type = kMachAnyTagged; MachineType target_type = kMachAnyTagged;
LinkageLocation target_loc = LinkageLocation::AnyRegister(); LinkageLocation target_loc = LinkageLocation::AnyRegister();
return new (zone) CallDescriptor( // -- return new (zone) CallDescriptor(CallDescriptor::kCallCodeObject, // kind
CallDescriptor::kCallCodeObject, // kind target_type, // target MachineType
target_type, // target MachineType target_loc, // target location
target_loc, // target location types.Build(), // machine_sig
types.Build(), // machine_sig locations.Build(), // location_sig
locations.Build(), // location_sig js_parameter_count, // js_parameter_count
js_parameter_count, // js_parameter_count Operator::kNoProperties, // properties
Operator::kNoProperties, // properties kNoCalleeSaved, // callee-saved registers
kNoCalleeSaved, // callee-saved registers flags, // flags
flags, // flags descriptor.DebugName(zone->isolate()));
descriptor.DebugName(zone->isolate()));
} }
static CallDescriptor* GetSimplifiedCDescriptor(Zone* zone, static CallDescriptor* GetSimplifiedCDescriptor(Zone* zone,
...@@ -204,16 +201,15 @@ class LinkageHelper { ...@@ -204,16 +201,15 @@ class LinkageHelper {
// The target for C calls is always an address (i.e. machine pointer). // The target for C calls is always an address (i.e. machine pointer).
MachineType target_type = kMachPtr; MachineType target_type = kMachPtr;
LinkageLocation target_loc = LinkageLocation::AnyRegister(); LinkageLocation target_loc = LinkageLocation::AnyRegister();
return new (zone) CallDescriptor( // -- return new (zone) CallDescriptor(CallDescriptor::kCallAddress, // kind
CallDescriptor::kCallAddress, // kind target_type, // target MachineType
target_type, // target MachineType target_loc, // target location
target_loc, // target location msig, // machine_sig
msig, // machine_sig locations.Build(), // location_sig
locations.Build(), // location_sig 0, // js_parameter_count
0, // js_parameter_count Operator::kNoProperties, // properties
Operator::kNoProperties, // properties LinkageTraits::CCalleeSaveRegisters(),
LinkageTraits::CCalleeSaveRegisters(), CallDescriptor::kNoFlags, CallDescriptor::kNoFlags, "c-call");
"c-call");
} }
static LinkageLocation regloc(Register reg) { static LinkageLocation regloc(Register reg) {
......
...@@ -42,15 +42,13 @@ CallDescriptor* Linkage::ComputeIncoming(Zone* zone, CompilationInfo* info) { ...@@ -42,15 +42,13 @@ CallDescriptor* Linkage::ComputeIncoming(Zone* zone, CompilationInfo* info) {
if (info->function() != NULL) { if (info->function() != NULL) {
// If we already have the function literal, use the number of parameters // If we already have the function literal, use the number of parameters
// plus the receiver. // plus the receiver.
return GetJSCallDescriptor(1 + info->function()->parameter_count(), zone, return GetJSCallDescriptor(1 + info->function()->parameter_count(), zone);
CallDescriptor::kNoFlags);
} }
if (!info->closure().is_null()) { if (!info->closure().is_null()) {
// If we are compiling a JS function, use a JS call descriptor, // If we are compiling a JS function, use a JS call descriptor,
// plus the receiver. // plus the receiver.
SharedFunctionInfo* shared = info->closure()->shared(); SharedFunctionInfo* shared = info->closure()->shared();
return GetJSCallDescriptor(1 + shared->formal_parameter_count(), zone, return GetJSCallDescriptor(1 + shared->formal_parameter_count(), zone);
CallDescriptor::kNoFlags);
} }
if (info->code_stub() != NULL) { if (info->code_stub() != NULL) {
// Use the code stub interface descriptor. // Use the code stub interface descriptor.
...@@ -90,9 +88,8 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame, ...@@ -90,9 +88,8 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame,
} }
CallDescriptor* Linkage::GetJSCallDescriptor( CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count) const {
int parameter_count, CallDescriptor::Flags flags) const { return GetJSCallDescriptor(parameter_count, zone_);
return GetJSCallDescriptor(parameter_count, zone_, flags);
} }
......
...@@ -174,10 +174,8 @@ class Linkage : public ZoneObject { ...@@ -174,10 +174,8 @@ class Linkage : public ZoneObject {
// The call descriptor for this compilation unit describes the locations // The call descriptor for this compilation unit describes the locations
// of incoming parameters and the outgoing return value(s). // of incoming parameters and the outgoing return value(s).
CallDescriptor* GetIncomingDescriptor() const { return incoming_; } CallDescriptor* GetIncomingDescriptor() const { return incoming_; }
CallDescriptor* GetJSCallDescriptor(int parameter_count, CallDescriptor* GetJSCallDescriptor(int parameter_count) const;
CallDescriptor::Flags flags) const; static CallDescriptor* GetJSCallDescriptor(int parameter_count, Zone* zone);
static CallDescriptor* GetJSCallDescriptor(int parameter_count, Zone* zone,
CallDescriptor::Flags flags);
CallDescriptor* GetRuntimeCallDescriptor( CallDescriptor* GetRuntimeCallDescriptor(
Runtime::FunctionId function, int parameter_count, Runtime::FunctionId function, int parameter_count,
Operator::Properties properties) const; Operator::Properties properties) const;
......
...@@ -35,9 +35,8 @@ struct MipsLinkageHelperTraits { ...@@ -35,9 +35,8 @@ struct MipsLinkageHelperTraits {
typedef LinkageHelper<MipsLinkageHelperTraits> LH; typedef LinkageHelper<MipsLinkageHelperTraits> LH;
CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone, CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone) {
CallDescriptor::Flags flags) { return LH::GetJSCallDescriptor(zone, parameter_count);
return LH::GetJSCallDescriptor(zone, parameter_count, flags);
} }
......
...@@ -99,8 +99,7 @@ Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, ...@@ -99,8 +99,7 @@ Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver,
Node* RawMachineAssembler::CallJS0(Node* function, Node* receiver, Node* RawMachineAssembler::CallJS0(Node* function, Node* receiver,
Node* context, Node* frame_state) { Node* context, Node* frame_state) {
CallDescriptor* descriptor = CallDescriptor* descriptor = Linkage::GetJSCallDescriptor(1, zone());
Linkage::GetJSCallDescriptor(1, zone(), CallDescriptor::kNeedsFrameState);
Node* call = graph()->NewNode(common()->Call(descriptor), function, receiver, Node* call = graph()->NewNode(common()->Call(descriptor), function, receiver,
context, frame_state); context, frame_state);
schedule()->AddNode(CurrentBlock(), call); schedule()->AddNode(CurrentBlock(), call);
......
...@@ -49,9 +49,8 @@ struct X64LinkageHelperTraits { ...@@ -49,9 +49,8 @@ struct X64LinkageHelperTraits {
typedef LinkageHelper<X64LinkageHelperTraits> LH; typedef LinkageHelper<X64LinkageHelperTraits> LH;
CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone, CallDescriptor* Linkage::GetJSCallDescriptor(int parameter_count, Zone* zone) {
CallDescriptor::Flags flags) { return LH::GetJSCallDescriptor(zone, parameter_count);
return LH::GetJSCallDescriptor(zone, parameter_count, flags);
} }
......
...@@ -90,8 +90,7 @@ TEST(TestLinkageJSCall) { ...@@ -90,8 +90,7 @@ TEST(TestLinkageJSCall) {
Linkage linkage(info.zone(), &info); Linkage linkage(info.zone(), &info);
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
CallDescriptor* descriptor = CallDescriptor* descriptor = linkage.GetJSCallDescriptor(i);
linkage.GetJSCallDescriptor(i, CallDescriptor::kNoFlags);
CHECK_NE(NULL, descriptor); CHECK_NE(NULL, descriptor);
CHECK_EQ(i, descriptor->JSParameterCount()); CHECK_EQ(i, descriptor->JSParameterCount());
CHECK_EQ(1, descriptor->ReturnCount()); CHECK_EQ(1, descriptor->ReturnCount());
......
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