Revision: 10573
Author:   [email protected]
Date:     Wed Feb  1 00:49:18 2012
Log: Give uses within a loop a greater weight when doing representation inference.

Uses of a value are weighted by a factor of FLAG_loop_weight (default: 10) for every loop they are in. This makes uses in inner loops "more important", which
should improve the result of the representation inference.

Review URL: https://chromiumcodereview.appspot.com/8277031
http://code.google.com/p/v8/source/detail?r=10573

Modified:
 /branches/bleeding_edge/src/flag-definitions.h
 /branches/bleeding_edge/src/hydrogen-instructions.cc
 /branches/bleeding_edge/src/hydrogen-instructions.h
 /branches/bleeding_edge/src/hydrogen.cc

=======================================
--- /branches/bleeding_edge/src/flag-definitions.h      Mon Jan 30 04:25:29 2012
+++ /branches/bleeding_edge/src/flag-definitions.h      Wed Feb  1 00:49:18 2012
@@ -166,6 +166,7 @@
 DEFINE_bool(trace_osr, false, "trace on-stack replacement")
 DEFINE_int(stress_runs, 0, "number of stress runs")
 DEFINE_bool(optimize_closures, true, "optimize closures")
+DEFINE_int(loop_weight, 1, "loop weight for representation inference")

 // assembler-ia32.cc / assembler-arm.cc / assembler-x64.cc
 DEFINE_bool(debug_code, false,
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Mon Jan 23 10:11:36 2012 +++ /branches/bleeding_edge/src/hydrogen-instructions.cc Wed Feb 1 00:49:18 2012
@@ -65,6 +65,14 @@
       return NULL;
   }
 }
+
+
+int HValue::LoopWeight() const {
+  const int w = FLAG_loop_weight;
+  static const int weights[] = { 1, w, w*w, w*w*w, w*w*w*w };
+  return weights[Min(block()->LoopNestingDepth(),
+                     static_cast<int>(ARRAY_SIZE(weights)-1))];
+}


 void HValue::AssumeRepresentation(Representation r) {
@@ -1139,7 +1147,7 @@
     HValue* value = it.value();
     if (!value->IsPhi()) {
       Representation rep = value->RequiredInputRepresentation(it.index());
-      ++non_phi_uses_[rep.kind()];
+      non_phi_uses_[rep.kind()] += value->LoopWeight();
     }
   }
 }
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Wed Jan 25 04:32:05 2012 +++ /branches/bleeding_edge/src/hydrogen-instructions.h Wed Feb 1 00:49:18 2012
@@ -569,6 +569,7 @@

   HBasicBlock* block() const { return block_; }
   void SetBlock(HBasicBlock* block);
+  int LoopWeight() const;

   int id() const { return id_; }
   void set_id(int id) { id_ = id; }
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Mon Jan 30 07:40:50 2012
+++ /branches/bleeding_edge/src/hydrogen.cc     Wed Feb  1 00:49:18 2012
@@ -1672,7 +1672,7 @@
     Representation rep = use->RequiredInputRepresentation(it.index());
     if (rep.IsNone()) continue;
     if (use->IsPhi()) HPhi::cast(use)->AddIndirectUsesTo(&use_count[0]);
-    ++use_count[rep.kind()];
+    use_count[rep.kind()] += use->LoopWeight();
   }
   int tagged_count = use_count[Representation::kTagged];
   int double_count = use_count[Representation::kDouble];

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

Reply via email to