< prev index next >

src/share/vm/opto/replacednodes.cpp

Print this page
rev 8216 : maybe fix + debug
rev 8221 : 8174164: SafePointNode::_replaced_nodes breaks with irreducible loops
Reviewed-by: kvn


  74       _replaced_nodes->push(replaced);
  75     }
  76   }
  77 }
  78 
  79 void ReplacedNodes::clone() {
  80   if (_replaced_nodes != NULL) {
  81     GrowableArray<ReplacedNode>* replaced_nodes_clone = new GrowableArray<ReplacedNode>();
  82     replaced_nodes_clone->appendAll(_replaced_nodes);
  83     _replaced_nodes = replaced_nodes_clone;
  84   }
  85 }
  86 
  87 void ReplacedNodes::reset() {
  88   if (_replaced_nodes != NULL) {
  89     _replaced_nodes->clear();
  90   }
  91 }
  92 
  93 // Perfom node replacement (used when returning to caller)
  94 void ReplacedNodes::apply(Node* n) {
  95   if (is_empty()) {
  96     return;
  97   }
  98   for (int i = 0; i < _replaced_nodes->length(); i++) {
  99     ReplacedNode replaced = _replaced_nodes->at(i);



 100     n->replace_edge(replaced.initial(), replaced.improved());

 101   }
 102 }
 103 
 104 static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) {
 105   if (use->is_Phi()) {
 106     Node* r = use->in(0);
 107     assert(r->is_Region(), "Phi should have Region");
 108     for (uint i = 1; i < use->req(); i++) {
 109       if (use->in(i) == n) {
 110         work.push(r->in(i));
 111       }
 112     }
 113   } else {
 114     work.push(use);
 115   }
 116 }
 117 
 118 // Perfom node replacement following late inlining
 119 void ReplacedNodes::apply(Compile* C, Node* ctl) {
 120   // ctl is the control on exit of the method that was late inlined




  74       _replaced_nodes->push(replaced);
  75     }
  76   }
  77 }
  78 
  79 void ReplacedNodes::clone() {
  80   if (_replaced_nodes != NULL) {
  81     GrowableArray<ReplacedNode>* replaced_nodes_clone = new GrowableArray<ReplacedNode>();
  82     replaced_nodes_clone->appendAll(_replaced_nodes);
  83     _replaced_nodes = replaced_nodes_clone;
  84   }
  85 }
  86 
  87 void ReplacedNodes::reset() {
  88   if (_replaced_nodes != NULL) {
  89     _replaced_nodes->clear();
  90   }
  91 }
  92 
  93 // Perfom node replacement (used when returning to caller)
  94 void ReplacedNodes::apply(Node* n, uint idx) {
  95   if (is_empty()) {
  96     return;
  97   }
  98   for (int i = 0; i < _replaced_nodes->length(); i++) {
  99     ReplacedNode replaced = _replaced_nodes->at(i);
 100     // Only apply if improved node was created in a callee to avoid
 101     // issues with irreducible loops in the caller
 102     if (replaced.improved()->_idx >= idx) {
 103       n->replace_edge(replaced.initial(), replaced.improved());
 104     }
 105   }
 106 }
 107 
 108 static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) {
 109   if (use->is_Phi()) {
 110     Node* r = use->in(0);
 111     assert(r->is_Region(), "Phi should have Region");
 112     for (uint i = 1; i < use->req(); i++) {
 113       if (use->in(i) == n) {
 114         work.push(r->in(i));
 115       }
 116     }
 117   } else {
 118     work.push(use);
 119   }
 120 }
 121 
 122 // Perfom node replacement following late inlining
 123 void ReplacedNodes::apply(Compile* C, Node* ctl) {
 124   // ctl is the control on exit of the method that was late inlined


< prev index next >