Mercurial > hg > truffle
comparison src/share/vm/opto/node.cpp @ 10278:6f3fd5150b67
6934604: enable parts of EliminateAutoBox by default
Summary: Resurrected autobox elimination code and enabled part of it by default.
Reviewed-by: roland, twisti
author | kvn |
---|---|
date | Wed, 08 May 2013 15:08:01 -0700 |
parents | 6931f425c517 |
children | 70120f47d403 |
comparison
equal
deleted
inserted
replaced
10277:aabf54ccedb1 | 10278:6f3fd5150b67 |
---|---|
65 assert(bump >= 0 && bump < mod, ""); | 65 assert(bump >= 0 && bump < mod, ""); |
66 new_debug_idx += bump; | 66 new_debug_idx += bump; |
67 } | 67 } |
68 Compile::set_debug_idx(new_debug_idx); | 68 Compile::set_debug_idx(new_debug_idx); |
69 set_debug_idx( new_debug_idx ); | 69 set_debug_idx( new_debug_idx ); |
70 assert(Compile::current()->unique() < (UINT_MAX - 1), "Node limit exceeded UINT_MAX"); | 70 assert(Compile::current()->unique() < (INT_MAX - 1), "Node limit exceeded INT_MAX"); |
71 assert(Compile::current()->live_nodes() < (uint)MaxNodeLimit, "Live Node limit exceeded limit"); | |
71 if (BreakAtNode != 0 && (_debug_idx == BreakAtNode || (int)_idx == BreakAtNode)) { | 72 if (BreakAtNode != 0 && (_debug_idx == BreakAtNode || (int)_idx == BreakAtNode)) { |
72 tty->print_cr("BreakAtNode: _idx=%d _debug_idx=%d", _idx, _debug_idx); | 73 tty->print_cr("BreakAtNode: _idx=%d _debug_idx=%d", _idx, _debug_idx); |
73 BREAKPOINT; | 74 BREAKPOINT; |
74 } | 75 } |
75 #if OPTO_DU_ITERATOR_ASSERT | 76 #if OPTO_DU_ITERATOR_ASSERT |
469 | 470 |
470 | 471 |
471 //------------------------------clone------------------------------------------ | 472 //------------------------------clone------------------------------------------ |
472 // Clone a Node. | 473 // Clone a Node. |
473 Node *Node::clone() const { | 474 Node *Node::clone() const { |
474 Compile *compile = Compile::current(); | 475 Compile* C = Compile::current(); |
475 uint s = size_of(); // Size of inherited Node | 476 uint s = size_of(); // Size of inherited Node |
476 Node *n = (Node*)compile->node_arena()->Amalloc_D(size_of() + _max*sizeof(Node*)); | 477 Node *n = (Node*)C->node_arena()->Amalloc_D(size_of() + _max*sizeof(Node*)); |
477 Copy::conjoint_words_to_lower((HeapWord*)this, (HeapWord*)n, s); | 478 Copy::conjoint_words_to_lower((HeapWord*)this, (HeapWord*)n, s); |
478 // Set the new input pointer array | 479 // Set the new input pointer array |
479 n->_in = (Node**)(((char*)n)+s); | 480 n->_in = (Node**)(((char*)n)+s); |
480 // Cannot share the old output pointer array, so kill it | 481 // Cannot share the old output pointer array, so kill it |
481 n->_out = NO_OUT_ARRAY; | 482 n->_out = NO_OUT_ARRAY; |
490 Node *x = in(i); | 491 Node *x = in(i); |
491 n->_in[i] = x; | 492 n->_in[i] = x; |
492 if (x != NULL) x->add_out(n); | 493 if (x != NULL) x->add_out(n); |
493 } | 494 } |
494 if (is_macro()) | 495 if (is_macro()) |
495 compile->add_macro_node(n); | 496 C->add_macro_node(n); |
496 if (is_expensive()) | 497 if (is_expensive()) |
497 compile->add_expensive_node(n); | 498 C->add_expensive_node(n); |
498 | 499 |
499 n->set_idx(compile->next_unique()); // Get new unique index as well | 500 n->set_idx(C->next_unique()); // Get new unique index as well |
500 debug_only( n->verify_construction() ); | 501 debug_only( n->verify_construction() ); |
501 NOT_PRODUCT(nodes_created++); | 502 NOT_PRODUCT(nodes_created++); |
502 // Do not patch over the debug_idx of a clone, because it makes it | 503 // Do not patch over the debug_idx of a clone, because it makes it |
503 // impossible to break on the clone's moment of creation. | 504 // impossible to break on the clone's moment of creation. |
504 //debug_only( n->set_debug_idx( debug_idx() ) ); | 505 //debug_only( n->set_debug_idx( debug_idx() ) ); |
505 | 506 |
506 compile->copy_node_notes_to(n, (Node*) this); | 507 C->copy_node_notes_to(n, (Node*) this); |
507 | 508 |
508 // MachNode clone | 509 // MachNode clone |
509 uint nopnds; | 510 uint nopnds; |
510 if (this->is_Mach() && (nopnds = this->as_Mach()->num_opnds()) > 0) { | 511 if (this->is_Mach() && (nopnds = this->as_Mach()->num_opnds()) > 0) { |
511 MachNode *mach = n->as_Mach(); | 512 MachNode *mach = n->as_Mach(); |
516 MachOper **to = (MachOper **)((size_t)(&mach->_opnds) + | 517 MachOper **to = (MachOper **)((size_t)(&mach->_opnds) + |
517 pointer_delta((const void*)from, | 518 pointer_delta((const void*)from, |
518 (const void*)(&mthis->_opnds), 1)); | 519 (const void*)(&mthis->_opnds), 1)); |
519 mach->_opnds = to; | 520 mach->_opnds = to; |
520 for ( uint i = 0; i < nopnds; ++i ) { | 521 for ( uint i = 0; i < nopnds; ++i ) { |
521 to[i] = from[i]->clone(compile); | 522 to[i] = from[i]->clone(C); |
522 } | 523 } |
523 } | 524 } |
524 // cloning CallNode may need to clone JVMState | 525 // cloning CallNode may need to clone JVMState |
525 if (n->is_Call()) { | 526 if (n->is_Call()) { |
526 CallNode *call = n->as_Call(); | 527 n->as_Call()->clone_jvms(C); |
527 call->clone_jvms(); | |
528 } | 528 } |
529 return n; // Return the clone | 529 return n; // Return the clone |
530 } | 530 } |
531 | 531 |
532 //---------------------------setup_is_top-------------------------------------- | 532 //---------------------------setup_is_top-------------------------------------- |
803 if (in(i) == old) { | 803 if (in(i) == old) { |
804 if (i < req()) | 804 if (i < req()) |
805 set_req(i, neww); | 805 set_req(i, neww); |
806 else | 806 else |
807 set_prec(i, neww); | 807 set_prec(i, neww); |
808 nrep++; | |
809 } | |
810 } | |
811 return nrep; | |
812 } | |
813 | |
814 /** | |
815 * Replace input edges in the range pointing to 'old' node. | |
816 */ | |
817 int Node::replace_edges_in_range(Node* old, Node* neww, int start, int end) { | |
818 if (old == neww) return 0; // nothing to do | |
819 uint nrep = 0; | |
820 for (int i = start; i < end; i++) { | |
821 if (in(i) == old) { | |
822 set_req(i, neww); | |
808 nrep++; | 823 nrep++; |
809 } | 824 } |
810 } | 825 } |
811 return nrep; | 826 return nrep; |
812 } | 827 } |