Mercurial > hg > graal-compiler
comparison src/share/vm/opto/lcm.cpp @ 3248:e6beb62de02d
7032963: StoreCM shouldn't participate in store elimination
Reviewed-by: kvn
author | never |
---|---|
date | Tue, 05 Apr 2011 19:14:03 -0700 |
parents | f95d63e2154a |
children | 92add02409c9 |
comparison
equal
deleted
inserted
replaced
2436:8f1042ff784d | 3248:e6beb62de02d |
---|---|
683 if( m && cfg->_bbs[m->_idx] == this && !m->is_top() ) | 683 if( m && cfg->_bbs[m->_idx] == this && !m->is_top() ) |
684 local++; // One more block-local input | 684 local++; // One more block-local input |
685 } | 685 } |
686 ready_cnt[n->_idx] = local; // Count em up | 686 ready_cnt[n->_idx] = local; // Count em up |
687 | 687 |
688 #ifdef ASSERT | |
689 if( UseConcMarkSweepGC || UseG1GC ) { | |
690 if( n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_StoreCM ) { | |
691 // Check the precedence edges | |
692 for (uint prec = n->req(); prec < n->len(); prec++) { | |
693 Node* oop_store = n->in(prec); | |
694 if (oop_store != NULL) { | |
695 assert(cfg->_bbs[oop_store->_idx]->_dom_depth <= this->_dom_depth, "oop_store must dominate card-mark"); | |
696 } | |
697 } | |
698 } | |
699 } | |
700 #endif | |
701 | |
688 // A few node types require changing a required edge to a precedence edge | 702 // A few node types require changing a required edge to a precedence edge |
689 // before allocation. | 703 // before allocation. |
690 if( UseConcMarkSweepGC || UseG1GC ) { | |
691 if( n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_StoreCM ) { | |
692 // Note: Required edges with an index greater than oper_input_base | |
693 // are not supported by the allocator. | |
694 // Note2: Can only depend on unmatched edge being last, | |
695 // can not depend on its absolute position. | |
696 Node *oop_store = n->in(n->req() - 1); | |
697 n->del_req(n->req() - 1); | |
698 n->add_prec(oop_store); | |
699 assert(cfg->_bbs[oop_store->_idx]->_dom_depth <= this->_dom_depth, "oop_store must dominate card-mark"); | |
700 } | |
701 } | |
702 if( n->is_Mach() && n->req() > TypeFunc::Parms && | 704 if( n->is_Mach() && n->req() > TypeFunc::Parms && |
703 (n->as_Mach()->ideal_Opcode() == Op_MemBarAcquire || | 705 (n->as_Mach()->ideal_Opcode() == Op_MemBarAcquire || |
704 n->as_Mach()->ideal_Opcode() == Op_MemBarVolatile) ) { | 706 n->as_Mach()->ideal_Opcode() == Op_MemBarVolatile) ) { |
705 // MemBarAcquire could be created without Precedent edge. | 707 // MemBarAcquire could be created without Precedent edge. |
706 // del_req() replaces the specified edge with the last input edge | 708 // del_req() replaces the specified edge with the last input edge |