src/share/vm/opto/escape.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/escape.hpp	Thu Jul  3 10:48:08 2008
--- new/src/share/vm/opto/escape.hpp	Thu Jul  3 10:48:07 2008

*** 1,7 **** --- 1,7 ---- /* ! * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. ! * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 176,202 **** --- 176,212 ---- _type = ntype; } // count of outgoing edges uint edge_count() const { return (_edges == NULL) ? 0 : _edges->length(); } + // node index of target of outgoing edge "e" ! uint edge_target(uint e) const; ! uint edge_target(uint e) const { + assert(_edges != NULL, "valid edge index"); + return (_edges->at(e) >> EdgeShift); + } // type of outgoing edge "e" ! EdgeType edge_type(uint e) const; ! EdgeType edge_type(uint e) const { + assert(_edges != NULL, "valid edge index"); + return (EdgeType) (_edges->at(e) & EdgeMask); + } + // add a edge of the specified type pointing to the specified target void add_edge(uint targIdx, EdgeType et); + // remove an edge of the specified type pointing to the specified target void remove_edge(uint targIdx, EdgeType et); + #ifndef PRODUCT void dump() const; #endif }; class ConnectionGraph: public ResourceObj { private: ! GrowableArray* _nodes; // Connection graph nodes indexed ! GrowableArray _nodes; // Connection graph nodes indexed // by ideal node index. Unique_Node_List _delayed_worklist; // Nodes to be processed before // the call build_connection_graph().
*** 205,232 **** --- 215,238 ---- bool _collecting; // Indicates whether escape information // is still being collected. If false, // no new nodes will be processed. bool _has_allocations; // Indicates whether method has any // non-escaping allocations. uint _phantom_object; // Index of globally escaping object // that pointer values loaded from // a field which has not been set // are assumed to point to. Compile * _compile; // Compile object for current compilation ! // address of an element in _nodes. Used when the element is to be modified ! PointsToNode *ptnode_adr(uint idx) { if ((uint)_nodes->length() <= idx) { // expand _nodes array ! PointsToNode dummy = _nodes->at_grow(idx); ! // Address of an element in _nodes. Used when the element is to be modified ! PointsToNode *ptnode_adr(uint idx) const { + // There should be no new ideal nodes during ConnectionGraph build, + // growableArray::adr_at() will throw assert otherwise. ! return _nodes.adr_at(idx); } return _nodes->adr_at(idx); } + uint nodes_size() const { return _nodes.length(); } // Add node to ConnectionGraph. void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done); // offset of a field reference
*** 305,338 **** --- 311,344 ---- } // Set the escape state of a node void set_escape_state(uint ni, PointsToNode::EscapeState es); // Get Compile object for current compilation. Compile *C() const { return _compile; } public: ConnectionGraph(Compile *C); + // Check for non-escaping candidates + static bool has_candidates(Compile *C); + // Compute the escape information ! void compute_escape(); ! bool compute_escape(); // escape state of a node PointsToNode::EscapeState escape_state(Node *n, PhaseTransform *phase); // other information we have collected bool is_scalar_replaceable(Node *n) { ! if (_collecting || (n->_idx >= nodes_size())) return false; ! PointsToNode ptn = _nodes->at_grow(n->_idx); ! return ptn.escape_state() == PointsToNode::NoEscape && ptn._scalar_replaceable; ! PointsToNode* ptn = ptnode_adr(n->_idx); ! return ptn->escape_state() == PointsToNode::NoEscape && ptn->_scalar_replaceable; } bool hidden_alias(Node *n) { ! if (_collecting || (n->_idx >= nodes_size())) return true; ! PointsToNode ptn = _nodes->at_grow(n->_idx); ! return (ptn.escape_state() != PointsToNode::NoEscape) || ptn._hidden_alias; ! PointsToNode* ptn = ptnode_adr(n->_idx); ! return (ptn->escape_state() != PointsToNode::NoEscape) || ptn->_hidden_alias; } #ifndef PRODUCT void dump(); #endif

src/share/vm/opto/escape.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File