Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Side by Side Diff: src/hydrogen.cc

Issue 248953002: Sort functions in polymorphic calls based on overall profiling ticks and inlined AST size. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 6944 matching lines...) Expand 10 before | Expand all | Expand 10 after
6955 target, static_cast<HValue*>(NULL), 6955 target, static_cast<HValue*>(NULL),
6956 HObjectAccess::ForFunctionContextPointer()); 6956 HObjectAccess::ForFunctionContextPointer());
6957 return NewArgumentAdaptorCall(target, context, 6957 return NewArgumentAdaptorCall(target, context,
6958 argument_count, param_count_value); 6958 argument_count, param_count_value);
6959 } 6959 }
6960 UNREACHABLE(); 6960 UNREACHABLE();
6961 return NULL; 6961 return NULL;
6962 } 6962 }
6963 6963
6964 6964
6965 class FunctionSorter {
6966 public:
6967 FunctionSorter(int index = 0, int ticks = 0, int size = 0)
6968 : index_(index), ticks_(ticks), size_(size) { }
6969
6970 int index() const { return index_; }
6971 int ticks() const { return ticks_; }
6972 int size() const { return size_; }
6973
6974 private:
6975 int index_;
6976 int ticks_;
6977 int size_;
6978 };
6979
6980
6981 inline bool operator<(const FunctionSorter& lhs, const FunctionSorter& rhs) {
6982 int diff = lhs.ticks() - rhs.ticks();
6983 if (diff != 0) return diff > 0;
6984 return lhs.size() < rhs.size();
6985 }
6986
6987
6965 void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( 6988 void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(
6966 Call* expr, 6989 Call* expr,
6967 HValue* receiver, 6990 HValue* receiver,
6968 SmallMapList* types, 6991 SmallMapList* types,
6969 Handle<String> name) { 6992 Handle<String> name) {
6970 int argument_count = expr->arguments()->length() + 1; // Includes receiver. 6993 int argument_count = expr->arguments()->length() + 1; // Includes receiver.
6971 int order[kMaxCallPolymorphism]; 6994 FunctionSorter order[kMaxCallPolymorphism];
6972 6995
6973 bool handle_smi = false; 6996 bool handle_smi = false;
6974 bool handled_string = false; 6997 bool handled_string = false;
6975 int ordered_functions = 0; 6998 int ordered_functions = 0;
6976 6999
6977 for (int i = 0; 7000 for (int i = 0;
6978 i < types->length() && ordered_functions < kMaxCallPolymorphism; 7001 i < types->length() && ordered_functions < kMaxCallPolymorphism;
6979 ++i) { 7002 ++i) {
6980 PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name); 7003 PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name);
6981 if (info.CanAccessMonomorphic() && 7004 if (info.CanAccessMonomorphic() &&
6982 info.lookup()->IsConstant() && 7005 info.lookup()->IsConstant() &&
6983 info.constant()->IsJSFunction()) { 7006 info.constant()->IsJSFunction()) {
6984 if (info.type()->Is(Type::String())) { 7007 if (info.type()->Is(Type::String())) {
6985 if (handled_string) continue; 7008 if (handled_string) continue;
6986 handled_string = true; 7009 handled_string = true;
6987 } 7010 }
6988 Handle<JSFunction> target = Handle<JSFunction>::cast(info.constant()); 7011 Handle<JSFunction> target = Handle<JSFunction>::cast(info.constant());
6989 if (info.type()->Is(Type::Number())) { 7012 if (info.type()->Is(Type::Number())) {
6990 handle_smi = true; 7013 handle_smi = true;
6991 } 7014 }
6992 expr->set_target(target); 7015 expr->set_target(target);
6993 order[ordered_functions++] = i; 7016 order[ordered_functions++] = FunctionSorter(
7017 i, target->shared()->profiler_ticks(), InliningAstSize(target));
6994 } 7018 }
6995 } 7019 }
6996 7020
7021 std::sort(order, order + ordered_functions);
7022
6997 HBasicBlock* number_block = NULL; 7023 HBasicBlock* number_block = NULL;
6998 HBasicBlock* join = NULL; 7024 HBasicBlock* join = NULL;
6999 handled_string = false; 7025 handled_string = false;
7000 int count = 0; 7026 int count = 0;
7001 7027
7002 for (int fn = 0; fn < ordered_functions; ++fn) { 7028 for (int fn = 0; fn < ordered_functions; ++fn) {
7003 int i = order[fn]; 7029 int i = order[fn].index();
7004 PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name); 7030 PropertyAccessInfo info(this, LOAD, ToType(types->at(i)), name);
7005 if (info.type()->Is(Type::String())) { 7031 if (info.type()->Is(Type::String())) {
7006 if (handled_string) continue; 7032 if (handled_string) continue;
7007 handled_string = true; 7033 handled_string = true;
7008 } 7034 }
7009 // Reloads the target. 7035 // Reloads the target.
7010 info.CanAccessMonomorphic(); 7036 info.CanAccessMonomorphic();
7011 Handle<JSFunction> target = Handle<JSFunction>::cast(info.constant()); 7037 Handle<JSFunction> target = Handle<JSFunction>::cast(info.constant());
7012 7038
7013 expr->set_target(target); 7039 expr->set_target(target);
(...skipping 4632 matching lines...) Expand 10 before | Expand all | Expand 10 after
11646 if (ShouldProduceTraceOutput()) { 11672 if (ShouldProduceTraceOutput()) {
11647 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11673 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11648 } 11674 }
11649 11675
11650 #ifdef DEBUG 11676 #ifdef DEBUG
11651 graph_->Verify(false); // No full verify. 11677 graph_->Verify(false); // No full verify.
11652 #endif 11678 #endif
11653 } 11679 }
11654 11680
11655 } } // namespace v8::internal 11681 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698