comparison src/share/vm/opto/escape.hpp @ 4122:cc81b9c09bbb

7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE Summary: Fixed several EA issues with Connection Graph construction. Reviewed-by: never, twisti
author kvn
date Mon, 28 Nov 2011 15:46:31 -0800
parents 8c57262447d3
children ee138854b3a6
comparison
equal deleted inserted replaced
4121:db2e64ca2d5a 4122:cc81b9c09bbb
158 EscapeState _escape; 158 EscapeState _escape;
159 GrowableArray<uint>* _edges; // outgoing edges 159 GrowableArray<uint>* _edges; // outgoing edges
160 Node* _node; // Ideal node corresponding to this PointsTo node. 160 Node* _node; // Ideal node corresponding to this PointsTo node.
161 int _offset; // Object fields offsets. 161 int _offset; // Object fields offsets.
162 bool _scalar_replaceable; // Not escaped object could be replaced with scalar 162 bool _scalar_replaceable; // Not escaped object could be replaced with scalar
163 bool _has_unknown_ptr; // Has edge to phantom_object
163 164
164 public: 165 public:
165 PointsToNode(): 166 PointsToNode():
166 _type(UnknownType), 167 _type(UnknownType),
167 _escape(UnknownEscape), 168 _escape(UnknownEscape),
168 _edges(NULL), 169 _edges(NULL),
169 _node(NULL), 170 _node(NULL),
170 _offset(-1), 171 _offset(-1),
172 _has_unknown_ptr(false),
171 _scalar_replaceable(true) {} 173 _scalar_replaceable(true) {}
172 174
173 175
174 EscapeState escape_state() const { return _escape; } 176 EscapeState escape_state() const { return _escape; }
175 NodeType node_type() const { return _type;} 177 NodeType node_type() const { return _type;}
176 int offset() { return _offset;} 178 int offset() { return _offset;}
177 bool scalar_replaceable() { return _scalar_replaceable;} 179 bool scalar_replaceable() { return _scalar_replaceable;}
180 bool has_unknown_ptr() { return _has_unknown_ptr;}
178 181
179 void set_offset(int offs) { _offset = offs;} 182 void set_offset(int offs) { _offset = offs;}
180 void set_escape_state(EscapeState state) { _escape = state; } 183 void set_escape_state(EscapeState state) { _escape = state; }
181 void set_node_type(NodeType ntype) { 184 void set_node_type(NodeType ntype) {
182 assert(_type == UnknownType || _type == ntype, "Can't change node type"); 185 assert(_type == UnknownType || _type == ntype, "Can't change node type");
183 _type = ntype; 186 _type = ntype;
184 } 187 }
185 void set_scalar_replaceable(bool v) { _scalar_replaceable = v; } 188 void set_scalar_replaceable(bool v) { _scalar_replaceable = v; }
189 void set_has_unknown_ptr() { _has_unknown_ptr = true; }
186 190
187 // count of outgoing edges 191 // count of outgoing edges
188 uint edge_count() const { return (_edges == NULL) ? 0 : _edges->length(); } 192 uint edge_count() const { return (_edges == NULL) ? 0 : _edges->length(); }
189 193
190 // node index of target of outgoing edge "e" 194 // node index of target of outgoing edge "e"
247 // There should be no new ideal nodes during ConnectionGraph build, 251 // There should be no new ideal nodes during ConnectionGraph build,
248 // growableArray::adr_at() will throw assert otherwise. 252 // growableArray::adr_at() will throw assert otherwise.
249 return _nodes.adr_at(idx); 253 return _nodes.adr_at(idx);
250 } 254 }
251 uint nodes_size() const { return _nodes.length(); } 255 uint nodes_size() const { return _nodes.length(); }
256
257 bool is_null_ptr(uint idx) const { return (idx == _noop_null || idx == _oop_null); }
252 258
253 // Add node to ConnectionGraph. 259 // Add node to ConnectionGraph.
254 void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done); 260 void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done);
255 261
256 // offset of a field reference 262 // offset of a field reference
331 Node *phi = _node_map[idx]; 337 Node *phi = _node_map[idx];
332 return (phi == NULL) ? NULL : phi->as_Phi(); 338 return (phi == NULL) ? NULL : phi->as_Phi();
333 } 339 }
334 340
335 // Notify optimizer that a node has been modified 341 // Notify optimizer that a node has been modified
336 // Node: This assumes that escape analysis is run before
337 // PhaseIterGVN creation
338 void record_for_optimizer(Node *n) { 342 void record_for_optimizer(Node *n) {
339 _igvn->_worklist.push(n); 343 _igvn->_worklist.push(n);
344 _igvn->add_users_to_worklist(n);
340 } 345 }
341 346
342 // Set the escape state of a node 347 // Set the escape state of a node
343 void set_escape_state(uint ni, PointsToNode::EscapeState es); 348 void set_escape_state(uint ni, PointsToNode::EscapeState es);
344 349