Mercurial > hg > graal-compiler
comparison src/share/vm/opto/escape.cpp @ 851:fc4be448891f
6851742: (EA) allocation elimination doesn't work with UseG1GC
Summary: Fix eliminate_card_mark() to eliminate G1 pre/post barriers.
Reviewed-by: never
author | kvn |
---|---|
date | Thu, 16 Jul 2009 14:10:42 -0700 |
parents | b2934faac289 |
children | 18f526145aea |
comparison
equal
deleted
inserted
replaced
850:fd50a67f97d1 | 851:fc4be448891f |
---|---|
576 int phi_alias_idx = C->get_alias_index(orig_phi->adr_type()); | 576 int phi_alias_idx = C->get_alias_index(orig_phi->adr_type()); |
577 // nothing to do if orig_phi is bottom memory or matches alias_idx | 577 // nothing to do if orig_phi is bottom memory or matches alias_idx |
578 if (phi_alias_idx == alias_idx) { | 578 if (phi_alias_idx == alias_idx) { |
579 return orig_phi; | 579 return orig_phi; |
580 } | 580 } |
581 // have we already created a Phi for this alias index? | 581 // Have we recently created a Phi for this alias index? |
582 PhiNode *result = get_map_phi(orig_phi->_idx); | 582 PhiNode *result = get_map_phi(orig_phi->_idx); |
583 if (result != NULL && C->get_alias_index(result->adr_type()) == alias_idx) { | 583 if (result != NULL && C->get_alias_index(result->adr_type()) == alias_idx) { |
584 return result; | 584 return result; |
585 } | |
586 // Previous check may fail when the same wide memory Phi was split into Phis | |
587 // for different memory slices. Search all Phis for this region. | |
588 if (result != NULL) { | |
589 Node* region = orig_phi->in(0); | |
590 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) { | |
591 Node* phi = region->fast_out(i); | |
592 if (phi->is_Phi() && | |
593 C->get_alias_index(phi->as_Phi()->adr_type()) == alias_idx) { | |
594 assert(phi->_idx >= nodes_size(), "only new Phi per instance memory slice"); | |
595 return phi->as_Phi(); | |
596 } | |
597 } | |
585 } | 598 } |
586 if ((int)C->unique() + 2*NodeLimitFudgeFactor > MaxNodeLimit) { | 599 if ((int)C->unique() + 2*NodeLimitFudgeFactor > MaxNodeLimit) { |
587 if (C->do_escape_analysis() == true && !C->failing()) { | 600 if (C->do_escape_analysis() == true && !C->failing()) { |
588 // Retry compilation without escape analysis. | 601 // Retry compilation without escape analysis. |
589 // If this is the first failure, the sentinel string will "stick" | 602 // If this is the first failure, the sentinel string will "stick" |
593 return NULL; | 606 return NULL; |
594 } | 607 } |
595 orig_phi_worklist.append_if_missing(orig_phi); | 608 orig_phi_worklist.append_if_missing(orig_phi); |
596 const TypePtr *atype = C->get_adr_type(alias_idx); | 609 const TypePtr *atype = C->get_adr_type(alias_idx); |
597 result = PhiNode::make(orig_phi->in(0), NULL, Type::MEMORY, atype); | 610 result = PhiNode::make(orig_phi->in(0), NULL, Type::MEMORY, atype); |
611 C->copy_node_notes_to(result, orig_phi); | |
598 set_map_phi(orig_phi->_idx, result); | 612 set_map_phi(orig_phi->_idx, result); |
599 igvn->set_type(result, result->bottom_type()); | 613 igvn->set_type(result, result->bottom_type()); |
600 record_for_optimizer(result); | 614 record_for_optimizer(result); |
601 new_created = true; | 615 new_created = true; |
602 return result; | 616 return result; |