Reviewers: Jakob,

Message:
Could please take a quick look?

Description:
Revert r11425 because of V8 benchmark performance regression.

Original CL: https://chromiumcodereview.appspot.com/10202007 "Re-enable
optimization for hot functions that have optimization disabled due to many
deopts."


Please review this at https://chromiumcodereview.appspot.com/10265008/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/heap.cc
  M src/objects-inl.h
  M src/objects.h
  M src/objects.cc
  M src/runtime-profiler.cc


Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index 322a9067437217653739f95a68a8a0d3046ad3dc..023d99a933e5b844125227724965fe281f1d6689 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -3015,6 +3015,7 @@ MaybeObject* Heap::AllocateSharedFunctionInfo(Object* name) { share->set_this_property_assignments(undefined_value(), SKIP_WRITE_BARRIER);
   share->set_ast_node_count(0);
   share->set_deopt_counter(FLAG_deopt_every_n_times);
+  share->set_ic_age(0);

   // Set integer fields (smi or int, depending on the architecture).
   share->set_length(0);
@@ -3028,8 +3029,6 @@ MaybeObject* Heap::AllocateSharedFunctionInfo(Object* name) {
   share->set_compiler_hints(0);
   share->set_this_property_assignments_count(0);
   share->set_opt_count(0);
-  share->set_ic_age(0);
-  share->set_opt_reenable_tries(0);

   return share;
 }
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 15bdc5221ebf221e1a05c9d7a65a4c268243daa8..677d567b7a323441078714b02ebc87c18864b404 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -3511,6 +3511,7 @@ ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
 ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
 ACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
           kThisPropertyAssignmentsOffset)
+SMI_ACCESSORS(SharedFunctionInfo, ic_age, kICAgeOffset)


 BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
@@ -3561,8 +3562,6 @@ SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
 SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset)
 SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
 SMI_ACCESSORS(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset)
-SMI_ACCESSORS(SharedFunctionInfo, ic_age, kICAgeOffset)
-SMI_ACCESSORS(SharedFunctionInfo, opt_reenable_tries, kOptReenableTriesOffset)
 #else

 #define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)             \
@@ -3616,11 +3615,6 @@ PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset)

PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset)
-
-PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, ic_age, kICAgeOffset)
-PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
-                        opt_reenable_tries,
-                        kOptReenableTriesOffset)
 #endif


@@ -3660,7 +3654,6 @@ void SharedFunctionInfo::set_optimization_disabled(bool disable) {
   // it will not be counted as optimizable code.
   if ((code()->kind() == Code::FUNCTION) && disable) {
     code()->set_optimizable(false);
-    code()->set_profiler_ticks(0);
   }
 }

@@ -3696,23 +3689,6 @@ bool SharedFunctionInfo::is_classic_mode() {
   return !BooleanBit::get(compiler_hints(), kStrictModeFunction);
 }

-
-void SharedFunctionInfo::TryReenableOptimization() {
-  int tries = opt_reenable_tries();
-  if (tries == Smi::kMaxValue) {
-    tries = 0;
-  }
-  set_opt_reenable_tries(tries + 1);
-  // We reenable optimization whenever the number of tries is a large
-  // enough power of 2.
-  if (tries >= 4 && (((tries - 1) & tries) == 0)) {
-    set_optimization_disabled(false);
-    set_opt_count(0);
-    code()->set_optimizable(true);
-  }
-}
-
-
 BOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode,
             kExtendedModeFunction)
 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 96b42286e88f03c1772e204d04497c22f38456ab..76a8266f0f008c160d483787c4b6090fe6203b34 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -7871,7 +7871,6 @@ void SharedFunctionInfo::ResetForNewContext(int new_ic_age) {
       code()->set_optimizable(true);
     }
     set_opt_count(0);
-    set_opt_reenable_tries(0);
   }
 }

Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 3ec9428ab255d48da40b5537a8961cc559186906..80d1fd47d02ab60dd015704d7836b20bf9b9189a 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -5461,13 +5461,6 @@ class SharedFunctionInfo: public HeapObject {
   inline int opt_count();
   inline void set_opt_count(int opt_count);

-  // Number of times we tried to reenable optimization.
-  inline int opt_reenable_tries();
-  inline void set_opt_reenable_tries(int opt_reenable_tries);
-
-  inline void TryReenableOptimization();
-
-
   // Source size of this function.
   int SourceSize();

@@ -5524,10 +5517,13 @@ class SharedFunctionInfo: public HeapObject {
       kInferredNameOffset + kPointerSize;
   static const int kThisPropertyAssignmentsOffset =
       kInitialMapOffset + kPointerSize;
+ // ic_age is a Smi field. It could be grouped with another Smi field into a
+  // PSEUDO_SMI_ACCESSORS pair (on x64), if one becomes available.
+ static const int kICAgeOffset = kThisPropertyAssignmentsOffset + kPointerSize;
 #if V8_HOST_ARCH_32_BIT
   // Smi fields.
   static const int kLengthOffset =
-      kThisPropertyAssignmentsOffset + kPointerSize;
+      kICAgeOffset + kPointerSize;
static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize;
   static const int kExpectedNofPropertiesOffset =
       kFormalParameterCountOffset + kPointerSize;
@@ -5547,10 +5543,10 @@ class SharedFunctionInfo: public HeapObject {
       kThisPropertyAssignmentsCountOffset + kPointerSize;
   static const int kAstNodeCountOffset = kOptCountOffset + kPointerSize;
static const int kDeoptCounterOffset = kAstNodeCountOffset + kPointerSize;
-  static const int kICAgeOffset = kDeoptCounterOffset + kPointerSize;
-  static const int kOptReenableTriesOffset = kICAgeOffset + kPointerSize;
+
+
   // Total size.
-  static const int kSize = kOptReenableTriesOffset + kPointerSize;
+  static const int kSize = kDeoptCounterOffset + kPointerSize;
 #else
   // The only reason to use smi fields instead of int fields
   // is to allow iteration without maps decoding during
@@ -5562,7 +5558,7 @@ class SharedFunctionInfo: public HeapObject {
   // word is not set and thus this word cannot be treated as pointer
   // to HeapObject during old space traversal.
   static const int kLengthOffset =
-      kThisPropertyAssignmentsOffset + kPointerSize;
+      kICAgeOffset + kPointerSize;
   static const int kFormalParameterCountOffset =
       kLengthOffset + kIntSize;

@@ -5589,11 +5585,8 @@ class SharedFunctionInfo: public HeapObject {
   static const int kAstNodeCountOffset = kOptCountOffset + kIntSize;
   static const int kDeoptCounterOffset = kAstNodeCountOffset + kIntSize;

-  static const int kICAgeOffset = kDeoptCounterOffset + kIntSize;
-  static const int kOptReenableTriesOffset = kICAgeOffset + kIntSize;
-
   // Total size.
-  static const int kSize = kOptReenableTriesOffset + kIntSize;
+  static const int kSize = kDeoptCounterOffset + kIntSize;

 #endif

Index: src/runtime-profiler.cc
diff --git a/src/runtime-profiler.cc b/src/runtime-profiler.cc
index 33481d45b9ab607f59fde6dd4c3e078de7cec507..568e48e412c03f4151f6fb9ae30323efd0a0182b 100644
--- a/src/runtime-profiler.cc
+++ b/src/runtime-profiler.cc
@@ -65,17 +65,11 @@ static const int kSizeLimit = 1500;
 // Number of times a function has to be seen on the stack before it is
 // optimized.
 static const int kProfilerTicksBeforeOptimization = 2;
-// If the function optimization was disabled due to high deoptimization count, -// but the function is hot and has been seen on the stack this number of times,
-// then we try to reenable optimization for this function.
-static const int kProfilerTicksBeforeReenablingOptimization = 250;
 // If a function does not have enough type info (according to
 // FLAG_type_info_threshold), but has seen a huge number of ticks,
 // optimize it as it is.
 static const int kTicksWhenNotEnoughTypeInfo = 100;
 // We only have one byte to store the number of ticks.
-STATIC_ASSERT(kProfilerTicksBeforeOptimization < 256);
-STATIC_ASSERT(kProfilerTicksBeforeReenablingOptimization < 256);
 STATIC_ASSERT(kTicksWhenNotEnoughTypeInfo < 256);

 // Maximum size in bytes of generated code for a function to be optimized
@@ -269,8 +263,7 @@ void RuntimeProfiler::OptimizeNow() {
       }
     }

-    SharedFunctionInfo* shared = function->shared();
-    Code* shared_code = shared->code();
+    Code* shared_code = function->shared()->code();
     if (shared_code->kind() != Code::FUNCTION) continue;

     if (function->IsMarkedForLazyRecompilation()) {
@@ -280,31 +273,19 @@ void RuntimeProfiler::OptimizeNow() {
       shared_code->set_allow_osr_at_loop_nesting_level(new_nesting);
     }

+    // Do not record non-optimizable functions.
+    if (!function->IsOptimizable()) continue;
+    if (function->shared()->optimization_disabled()) continue;
+
     // Only record top-level code on top of the execution stack and
     // avoid optimizing excessively large scripts since top-level code
     // will be executed only once.
     const int kMaxToplevelSourceSize = 10 * 1024;
-    if (shared->is_toplevel() &&
- (frame_count > 1 || shared->SourceSize() > kMaxToplevelSourceSize)) {
-      continue;
-    }
-
-    // Do not record non-optimizable functions.
-    if (shared->optimization_disabled()) {
-      if (shared->opt_count() >= Compiler::kDefaultMaxOptCount) {
-        // If optimization was disabled due to many deoptimizations,
- // then check if the function is hot and try to reenable optimization.
-        int ticks = shared_code->profiler_ticks();
-        if (ticks >= kProfilerTicksBeforeReenablingOptimization) {
-          shared_code->set_profiler_ticks(0);
-          shared->TryReenableOptimization();
-        } else {
-          shared_code->set_profiler_ticks(ticks + 1);
-        }
-      }
+    if (function->shared()->is_toplevel()
+        && (frame_count > 1
+ || function->shared()->SourceSize() > kMaxToplevelSourceSize)) {
       continue;
     }
-    if (!function->IsOptimizable()) continue;

     if (FLAG_watch_ic_patching) {
       int ticks = shared_code->profiler_ticks();
@@ -328,7 +309,7 @@ void RuntimeProfiler::OptimizeNow() {
           }
         }
       } else if (!any_ic_changed_ &&
-                 shared_code->instruction_size() < kMaxSizeEarlyOpt) {
+          shared_code->instruction_size() < kMaxSizeEarlyOpt) {
// If no IC was patched since the last tick and this function is very
         // small, optimistically optimize it now.
         Optimize(function, "small function");
@@ -338,7 +319,7 @@ void RuntimeProfiler::OptimizeNow() {
     } else {  // !FLAG_watch_ic_patching
       samples[sample_count++] = function;

-      int function_size = shared->SourceSize();
+      int function_size = function->shared()->SourceSize();
       int threshold_size_factor = (function_size > kSizeLimit)
           ? sampler_threshold_size_factor_
           : 1;


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to