changeset 7686:7c5babab479b

8144935: C2: safepoint is pruned from a non-counted loop Reviewed-by: roland
author vlivanov
date Thu, 10 Dec 2015 14:51:53 +0300
parents cf93dd06db0f
children d06b64fc150f 6fb4d6e02e92
files src/share/vm/opto/loopnode.cpp src/share/vm/opto/node.cpp src/share/vm/opto/node.hpp
diffstat 3 files changed, 28 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/loopnode.cpp	Fri Dec 04 14:06:38 2015 +0100
+++ b/src/share/vm/opto/loopnode.cpp	Thu Dec 10 14:51:53 2015 +0300
@@ -1811,10 +1811,9 @@
 }
 
 void IdealLoopTree::remove_safepoints(PhaseIdealLoop* phase, bool keep_one) {
-  // Look for a safepoint on the idom-path.
   Node* keep = NULL;
   if (keep_one) {
-    // Keep one if possible
+    // Look for a safepoint on the idom-path.
     for (Node* i = tail(); i != _head; i = phase->idom(i)) {
       if (i->Opcode() == Op_SafePoint && phase->get_loop(i) == this) {
         keep = i;
@@ -1823,9 +1822,14 @@
     }
   }
 
+  // Don't remove any safepoints if it is requested to keep a single safepoint and
+  // no safepoint was found on idom-path. It is not safe to remove any safepoint
+  // in this case since there's no safepoint dominating all paths in the loop body.
+  bool prune = !keep_one || keep != NULL;
+
   // Delete other safepoints in this loop.
   Node_List* sfpts = _safepts;
-  if (sfpts != NULL) {
+  if (prune && sfpts != NULL) {
     assert(keep == NULL || keep->Opcode() == Op_SafePoint, "not safepoint");
     for (uint i = 0; i < sfpts->size(); i++) {
       Node* n = sfpts->at(i);
@@ -1918,6 +1922,15 @@
     if (cl->is_main_loop()) tty->print(" main");
     if (cl->is_post_loop()) tty->print(" post");
   }
+  if (_has_call) tty->print(" has_call");
+  if (_has_sfpt) tty->print(" has_sfpt");
+  if (_rce_candidate) tty->print(" rce");
+  if (_safepts != NULL && _safepts->size() > 0) {
+    tty->print(" sfpts={"); _safepts->dump_simple(); tty->print(" }");
+  }
+  if (_required_safept != NULL && _required_safept->size() > 0) {
+    tty->print(" req={"); _required_safept->dump_simple(); tty->print(" }");
+  }
   tty->cr();
 }
 
--- a/src/share/vm/opto/node.cpp	Fri Dec 04 14:06:38 2015 +0100
+++ b/src/share/vm/opto/node.cpp	Thu Dec 10 14:51:53 2015 +0300
@@ -2107,6 +2107,17 @@
 #endif
 }
 
+void Node_List::dump_simple() const {
+#ifndef PRODUCT
+  for( uint i = 0; i < _cnt; i++ )
+    if( _nodes[i] ) {
+      tty->print(" %d", _nodes[i]->_idx);
+    } else {
+      tty->print(" NULL");
+    }
+#endif
+}
+
 //=============================================================================
 //------------------------------remove-----------------------------------------
 void Unique_Node_List::remove( Node *n ) {
--- a/src/share/vm/opto/node.hpp	Fri Dec 04 14:06:38 2015 +0100
+++ b/src/share/vm/opto/node.hpp	Thu Dec 10 14:51:53 2015 +0300
@@ -1374,6 +1374,7 @@
   void clear() { _cnt = 0; Node_Array::clear(); } // retain storage
   uint size() const { return _cnt; }
   void dump() const;
+  void dump_simple() const;
 };
 
 //------------------------------Unique_Node_List-------------------------------