comparison src/share/vm/opto/node.hpp @ 1080:7c57aead6d3e

6892658: C2 should optimize some stringbuilder patterns Reviewed-by: kvn, twisti
author never
date Thu, 12 Nov 2009 09:24:21 -0800
parents 98cb887364d3
children f96a1a986f7b
comparison
equal deleted inserted replaced
1078:8e7adf982378 1080:7c57aead6d3e
659 // Special case: is_Call() returns true for both CallNode and MachCallNode. 659 // Special case: is_Call() returns true for both CallNode and MachCallNode.
660 bool is_Call() const { 660 bool is_Call() const {
661 return (_flags & Flag_is_Call) != 0; 661 return (_flags & Flag_is_Call) != 0;
662 } 662 }
663 663
664 CallNode* isa_Call() const {
665 return is_Call() ? as_Call() : NULL;
666 }
667
664 CallNode *as_Call() const { // Only for CallNode (not for MachCallNode) 668 CallNode *as_Call() const { // Only for CallNode (not for MachCallNode)
665 assert((_class_id & ClassMask_Call) == Class_Call, "invalid node class"); 669 assert((_class_id & ClassMask_Call) == Class_Call, "invalid node class");
666 return (CallNode*)this; 670 return (CallNode*)this;
667 } 671 }
668 672
669 #define DEFINE_CLASS_QUERY(type) \ 673 #define DEFINE_CLASS_QUERY(type) \
670 bool is_##type() const { \ 674 bool is_##type() const { \
671 return ((_class_id & ClassMask_##type) == Class_##type); \ 675 return ((_class_id & ClassMask_##type) == Class_##type); \
672 } \ 676 } \
673 type##Node *as_##type() const { \ 677 type##Node *as_##type() const { \
674 assert(is_##type(), "invalid node class"); \ 678 assert(is_##type(), "invalid node class"); \
675 return (type##Node*)this; \ 679 return (type##Node*)this; \
680 } \
681 type##Node* isa_##type() const { \
682 return (is_##type()) ? as_##type() : NULL; \
676 } 683 }
677 684
678 DEFINE_CLASS_QUERY(AbstractLock) 685 DEFINE_CLASS_QUERY(AbstractLock)
679 DEFINE_CLASS_QUERY(Add) 686 DEFINE_CLASS_QUERY(Add)
680 DEFINE_CLASS_QUERY(AddP) 687 DEFINE_CLASS_QUERY(AddP)
1247 #endif //OPTO_DU_ITERATOR_ASSERT 1254 #endif //OPTO_DU_ITERATOR_ASSERT
1248 1255
1249 #undef I_VDUI_ONLY 1256 #undef I_VDUI_ONLY
1250 #undef VDUI_ONLY 1257 #undef VDUI_ONLY
1251 1258
1259 // An Iterator that truly follows the iterator pattern. Doesn't
1260 // support deletion but could be made to.
1261 //
1262 // for (SimpleDUIterator i(n); i.has_next(); i.next()) {
1263 // Node* m = i.get();
1264 //
1265 class SimpleDUIterator : public StackObj {
1266 private:
1267 Node* node;
1268 DUIterator_Fast i;
1269 DUIterator_Fast imax;
1270 public:
1271 SimpleDUIterator(Node* n): node(n), i(n->fast_outs(imax)) {}
1272 bool has_next() { return i < imax; }
1273 void next() { i++; }
1274 Node* get() { return node->fast_out(i); }
1275 };
1276
1252 1277
1253 //----------------------------------------------------------------------------- 1278 //-----------------------------------------------------------------------------
1254 // Map dense integer indices to Nodes. Uses classic doubling-array trick. 1279 // Map dense integer indices to Nodes. Uses classic doubling-array trick.
1255 // Abstractly provides an infinite array of Node*'s, initialized to NULL. 1280 // Abstractly provides an infinite array of Node*'s, initialized to NULL.
1256 // Note that the constructor just zeros things, and since I use Arena 1281 // Note that the constructor just zeros things, and since I use Arena
1288 class Node_List : public Node_Array { 1313 class Node_List : public Node_Array {
1289 uint _cnt; 1314 uint _cnt;
1290 public: 1315 public:
1291 Node_List() : Node_Array(Thread::current()->resource_area()), _cnt(0) {} 1316 Node_List() : Node_Array(Thread::current()->resource_area()), _cnt(0) {}
1292 Node_List(Arena *a) : Node_Array(a), _cnt(0) {} 1317 Node_List(Arena *a) : Node_Array(a), _cnt(0) {}
1318 bool contains(Node* n) {
1319 for (uint e = 0; e < size(); e++) {
1320 if (at(e) == n) return true;
1321 }
1322 return false;
1323 }
1293 void insert( uint i, Node *n ) { Node_Array::insert(i,n); _cnt++; } 1324 void insert( uint i, Node *n ) { Node_Array::insert(i,n); _cnt++; }
1294 void remove( uint i ) { Node_Array::remove(i); _cnt--; } 1325 void remove( uint i ) { Node_Array::remove(i); _cnt--; }
1295 void push( Node *b ) { map(_cnt++,b); } 1326 void push( Node *b ) { map(_cnt++,b); }
1296 void yank( Node *n ); // Find and remove 1327 void yank( Node *n ); // Find and remove
1297 Node *pop() { return _nodes[--_cnt]; } 1328 Node *pop() { return _nodes[--_cnt]; }