Commit 9a0a86fd authored by bmeurer@chromium.org's avatar bmeurer@chromium.org

Get rid of the function sorting in for polymorphic calls.

The idea of this code was to sort functions according to
ticks spend executing them, but now these ticks are always
zero and therefore we fall back to sorting by AST length (or
even worse by source length) all the time, which is a bad,
arbitrary measure.

R=verwaest@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19267 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f78bfaa8
...@@ -6772,44 +6772,13 @@ HInstruction* HOptimizedGraphBuilder::BuildCallConstantFunction( ...@@ -6772,44 +6772,13 @@ HInstruction* HOptimizedGraphBuilder::BuildCallConstantFunction(
} }
class FunctionSorter {
public:
FunctionSorter() : index_(0), ticks_(0), ast_length_(0), src_length_(0) { }
FunctionSorter(int index, int ticks, int ast_length, int src_length)
: index_(index),
ticks_(ticks),
ast_length_(ast_length),
src_length_(src_length) { }
int index() const { return index_; }
int ticks() const { return ticks_; }
int ast_length() const { return ast_length_; }
int src_length() const { return src_length_; }
private:
int index_;
int ticks_;
int ast_length_;
int src_length_;
};
inline bool operator<(const FunctionSorter& lhs, const FunctionSorter& rhs) {
int diff = lhs.ticks() - rhs.ticks();
if (diff != 0) return diff > 0;
diff = lhs.ast_length() - rhs.ast_length();
if (diff != 0) return diff < 0;
return lhs.src_length() < rhs.src_length();
}
void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(
Call* expr, Call* expr,
HValue* receiver, HValue* receiver,
SmallMapList* types, SmallMapList* types,
Handle<String> name) { Handle<String> name) {
int argument_count = expr->arguments()->length() + 1; // Includes receiver. int argument_count = expr->arguments()->length() + 1; // Includes receiver.
FunctionSorter order[kMaxCallPolymorphism]; int order[kMaxCallPolymorphism];
bool handle_smi = false; bool handle_smi = false;
bool handled_string = false; bool handled_string = false;
...@@ -6831,23 +6800,17 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( ...@@ -6831,23 +6800,17 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(
handle_smi = true; handle_smi = true;
} }
expr->set_target(target); expr->set_target(target);
order[ordered_functions++] = order[ordered_functions++] = i;
FunctionSorter(i,
expr->target()->shared()->profiler_ticks(),
InliningAstSize(expr->target()),
expr->target()->shared()->SourceSize());
} }
} }
std::sort(order, order + ordered_functions);
HBasicBlock* number_block = NULL; HBasicBlock* number_block = NULL;
HBasicBlock* join = NULL; HBasicBlock* join = NULL;
handled_string = false; handled_string = false;
int count = 0; int count = 0;
for (int fn = 0; fn < ordered_functions; ++fn) { for (int fn = 0; fn < ordered_functions; ++fn) {
int i = order[fn].index(); int i = order[fn];
PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name); PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name);
if (info.type()->Is(Type::String())) { if (info.type()->Is(Type::String())) {
if (handled_string) continue; if (handled_string) continue;
......
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