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
|