changeset 1571:e3339b19c3d9

2009-05-29 Gary Benson <gbenson@redhat.com> * ports/hotspot/src/share/vm/shark/sharkBlock.hpp (SharkBlock::maybe_add_safepoint): Replaced with... (SharkBlock::maybe_add_backedge_safepoint): New method. * ports/hotspot/src/share/vm/shark/sharkBlock.cpp (SharkBlock::maybe_add_safepoint): Replaced with... (SharkBlock::maybe_add_backedge_safepoint): New method. (SharkBlock::parse_bytecode): Updated for above. * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.hpp (SharkBlock::maybe_add_backedge_safepoint): New method. (SharkBlock::_can_reach_visited): New field. (SharkBlock::can_reach): New method. (SharkBlock::can_reach_helper): Likewise. * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp (SharkBlock::maybe_add_backedge_safepoint): New method. (SharkBlock::can_reach): Likewise. (SharkBlock::can_reach_helper): Likewise.
author Gary Benson <gbenson@redhat.com>
date Fri, 29 May 2009 12:38:51 +0100
parents 1c47ca6df830
children 6b95c888541f
files ChangeLog ports/hotspot/src/share/vm/shark/sharkBlock.cpp ports/hotspot/src/share/vm/shark/sharkBlock.hpp ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.hpp
diffstat 5 files changed, 79 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri May 29 10:12:01 2009 +0100
+++ b/ChangeLog	Fri May 29 12:38:51 2009 +0100
@@ -1,3 +1,23 @@
+2009-05-29  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/share/vm/shark/sharkBlock.hpp
+	(SharkBlock::maybe_add_safepoint): Replaced with...
+	(SharkBlock::maybe_add_backedge_safepoint): New method.
+	* ports/hotspot/src/share/vm/shark/sharkBlock.cpp
+	(SharkBlock::maybe_add_safepoint): Replaced with...
+	(SharkBlock::maybe_add_backedge_safepoint): New method.
+	(SharkBlock::parse_bytecode): Updated for above.
+
+	* ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.hpp
+	(SharkBlock::maybe_add_backedge_safepoint): New method.
+	(SharkBlock::_can_reach_visited): New field.
+	(SharkBlock::can_reach): New method.
+	(SharkBlock::can_reach_helper): Likewise.
+	* ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
+	(SharkBlock::maybe_add_backedge_safepoint): New method.
+	(SharkBlock::can_reach): Likewise.
+	(SharkBlock::can_reach_helper): Likewise.
+
 2009-05-29  Gary Benson  <gbenson@redhat.com>
 
 	* ports/hotspot/src/share/vm/shark/sharkState.hpp
--- a/ports/hotspot/src/share/vm/shark/sharkBlock.cpp	Fri May 29 10:12:01 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBlock.cpp	Fri May 29 12:38:51 2009 +0100
@@ -74,24 +74,24 @@
       case Bytecodes::_if_icmpgt:
       case Bytecodes::_if_icmpge:
         if (iter()->get_dest() <= bci())
-          maybe_add_safepoint();
+          maybe_add_backedge_safepoint();
         break;
 
       case Bytecodes::_goto_w:
         if (iter()->get_far_dest() <= bci())
-          maybe_add_safepoint();
+          maybe_add_backedge_safepoint();
         break;
 
       case Bytecodes::_tableswitch:
       case Bytecodes::_lookupswitch:
         if (switch_default_dest() <= bci()) {
-          maybe_add_safepoint();
+          maybe_add_backedge_safepoint();
           break;
         }
         int len = switch_table_length();
         for (int i = 0; i < len; i++) {
           if (switch_dest(i) <= bci()) {
-            maybe_add_safepoint();
+            maybe_add_backedge_safepoint();
             break;
           }
         }
@@ -1138,7 +1138,7 @@
   ShouldNotCallThis();
 }
 
-void SharkBlock::maybe_add_safepoint()
+void SharkBlock::maybe_add_backedge_safepoint()
 {
   ShouldNotCallThis();
 }
--- a/ports/hotspot/src/share/vm/shark/sharkBlock.hpp	Fri May 29 10:12:01 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBlock.hpp	Fri May 29 12:38:51 2009 +0100
@@ -231,7 +231,7 @@
 
   // Safepoints
  protected:
-  virtual void maybe_add_safepoint();
+  virtual void maybe_add_backedge_safepoint();
 
   // Traps
  protected:
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri May 29 10:12:01 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri May 29 12:38:51 2009 +0100
@@ -469,6 +469,51 @@
   current_state()->set_has_safepointed(true);
 }
 
+void SharkTopLevelBlock::maybe_add_backedge_safepoint()
+{
+  if (current_state()->has_safepointed())
+    return;
+
+  for (int i = 0; i < num_successors(); i++) {
+    if (successor(i)->can_reach(this)) {
+      maybe_add_safepoint();
+      break;
+    }
+  }
+}
+
+bool SharkTopLevelBlock::can_reach(SharkTopLevelBlock* other)
+{
+  for (int i = 0; i < function()->block_count(); i++)
+    function()->block(i)->_can_reach_visited = false;
+
+  return can_reach_helper(other);
+}
+
+bool SharkTopLevelBlock::can_reach_helper(SharkTopLevelBlock* other)
+{
+  if (this == other)
+    return true;
+
+  if (_can_reach_visited)
+    return false;
+  _can_reach_visited = true;
+  
+  if (!has_trap()) {
+    for (int i = 0; i < num_successors(); i++) {
+      if (successor(i)->can_reach_helper(other))
+        return true;
+    }
+  }
+
+  for (int i = 0; i < num_exceptions(); i++) {
+    if (exception(i)->can_reach_helper(other))
+      return true;
+  }
+
+  return false;
+}
+
 void SharkTopLevelBlock::do_trap(int trap_request)
 {
   current_state()->decache_for_trap();
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.hpp	Fri May 29 10:12:01 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.hpp	Fri May 29 12:38:51 2009 +0100
@@ -311,6 +311,14 @@
   // Safepoints
  private:
   void maybe_add_safepoint();
+  void maybe_add_backedge_safepoint();
+
+  // Loop safepoint removal
+ private:
+  bool _can_reach_visited;
+
+  bool can_reach(SharkTopLevelBlock* other);
+  bool can_reach_helper(SharkTopLevelBlock* other);
 
   // Traps
  private: