272 // Add a deferred edge from node given by "from_i" to any field
273 // of adr_i whose offset matches "offset"
274 void add_deferred_edge_to_fields(uint from_i, uint adr, int offs);
275
276
277 // Remove outgoing deferred edges from the node referenced by "ni".
278 // Any outgoing edges from the target of the deferred edge are copied
279 // to "ni".
280 void remove_deferred(uint ni, GrowableArray<uint>* deferred_edges, VectorSet* visited);
281
282 Node_Array _node_map; // used for bookeeping during type splitting
283 // Used for the following purposes:
284 // Memory Phi - most recent unique Phi split out
285 // from this Phi
286 // MemNode - new memory input for this node
287 // ChecCastPP - allocation that this is a cast of
288 // allocation - CheckCastPP of the allocation
289 bool split_AddP(Node *addp, Node *base, PhaseGVN *igvn);
290 PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn, bool &new_created);
291 PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
292 Node *find_mem(Node *mem, int alias_idx, PhaseGVN *igvn);
293 Node *find_inst_mem(Node *mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
294
295 // Propagate unique types created for unescaped allocated objects
296 // through the graph
297 void split_unique_types(GrowableArray<Node *> &alloc_worklist);
298
299 // manage entries in _node_map
300 void set_map(int idx, Node *n) { _node_map.map(idx, n); }
301 void set_map_phi(int idx, PhiNode *p) { _node_map.map(idx, (Node *) p); }
302 Node *get_map(int idx) { return _node_map[idx]; }
303 PhiNode *get_map_phi(int idx) {
304 Node *phi = _node_map[idx];
305 return (phi == NULL) ? NULL : phi->as_Phi();
306 }
307
308 // Notify optimizer that a node has been modified
309 // Node: This assumes that escape analysis is run before
310 // PhaseIterGVN creation
311 void record_for_optimizer(Node *n) {
312 _compile->record_for_igvn(n);
313 }
314
315 // Set the escape state of a node
316 void set_escape_state(uint ni, PointsToNode::EscapeState es);
317
318 public:
319 ConnectionGraph(Compile *C);
320
321 // Check for non-escaping candidates
|
272 // Add a deferred edge from node given by "from_i" to any field
273 // of adr_i whose offset matches "offset"
274 void add_deferred_edge_to_fields(uint from_i, uint adr, int offs);
275
276
277 // Remove outgoing deferred edges from the node referenced by "ni".
278 // Any outgoing edges from the target of the deferred edge are copied
279 // to "ni".
280 void remove_deferred(uint ni, GrowableArray<uint>* deferred_edges, VectorSet* visited);
281
282 Node_Array _node_map; // used for bookeeping during type splitting
283 // Used for the following purposes:
284 // Memory Phi - most recent unique Phi split out
285 // from this Phi
286 // MemNode - new memory input for this node
287 // ChecCastPP - allocation that this is a cast of
288 // allocation - CheckCastPP of the allocation
289 bool split_AddP(Node *addp, Node *base, PhaseGVN *igvn);
290 PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn, bool &new_created);
291 PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
292 void move_inst_mem(Node* n, GrowableArray<PhiNode *> &orig_phis, PhaseGVN *igvn);
293 Node *find_inst_mem(Node *mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
294
295 // Propagate unique types created for unescaped allocated objects
296 // through the graph
297 void split_unique_types(GrowableArray<Node *> &alloc_worklist);
298
299 // manage entries in _node_map
300 void set_map(int idx, Node *n) { _node_map.map(idx, n); }
301 Node *get_map(int idx) { return _node_map[idx]; }
302 PhiNode *get_map_phi(int idx) {
303 Node *phi = _node_map[idx];
304 return (phi == NULL) ? NULL : phi->as_Phi();
305 }
306
307 // Notify optimizer that a node has been modified
308 // Node: This assumes that escape analysis is run before
309 // PhaseIterGVN creation
310 void record_for_optimizer(Node *n) {
311 _compile->record_for_igvn(n);
312 }
313
314 // Set the escape state of a node
315 void set_escape_state(uint ni, PointsToNode::EscapeState es);
316
317 public:
318 ConnectionGraph(Compile *C);
319
320 // Check for non-escaping candidates
|