Mercurial > hg > truffle
comparison src/share/vm/opto/callnode.cpp @ 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 | 873ec3787992 |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1078:8e7adf982378 | 1080:7c57aead6d3e |
---|---|
691 } | 691 } |
692 return cast; | 692 return cast; |
693 } | 693 } |
694 | 694 |
695 | 695 |
696 void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj) { | |
697 projs->fallthrough_proj = NULL; | |
698 projs->fallthrough_catchproj = NULL; | |
699 projs->fallthrough_ioproj = NULL; | |
700 projs->catchall_ioproj = NULL; | |
701 projs->catchall_catchproj = NULL; | |
702 projs->fallthrough_memproj = NULL; | |
703 projs->catchall_memproj = NULL; | |
704 projs->resproj = NULL; | |
705 projs->exobj = NULL; | |
706 | |
707 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { | |
708 ProjNode *pn = fast_out(i)->as_Proj(); | |
709 if (pn->outcnt() == 0) continue; | |
710 switch (pn->_con) { | |
711 case TypeFunc::Control: | |
712 { | |
713 // For Control (fallthrough) and I_O (catch_all_index) we have CatchProj -> Catch -> Proj | |
714 projs->fallthrough_proj = pn; | |
715 DUIterator_Fast jmax, j = pn->fast_outs(jmax); | |
716 const Node *cn = pn->fast_out(j); | |
717 if (cn->is_Catch()) { | |
718 ProjNode *cpn = NULL; | |
719 for (DUIterator_Fast kmax, k = cn->fast_outs(kmax); k < kmax; k++) { | |
720 cpn = cn->fast_out(k)->as_Proj(); | |
721 assert(cpn->is_CatchProj(), "must be a CatchProjNode"); | |
722 if (cpn->_con == CatchProjNode::fall_through_index) | |
723 projs->fallthrough_catchproj = cpn; | |
724 else { | |
725 assert(cpn->_con == CatchProjNode::catch_all_index, "must be correct index."); | |
726 projs->catchall_catchproj = cpn; | |
727 } | |
728 } | |
729 } | |
730 break; | |
731 } | |
732 case TypeFunc::I_O: | |
733 if (pn->_is_io_use) | |
734 projs->catchall_ioproj = pn; | |
735 else | |
736 projs->fallthrough_ioproj = pn; | |
737 for (DUIterator j = pn->outs(); pn->has_out(j); j++) { | |
738 Node* e = pn->out(j); | |
739 if (e->Opcode() == Op_CreateEx && e->in(0)->is_CatchProj()) { | |
740 assert(projs->exobj == NULL, "only one"); | |
741 projs->exobj = e; | |
742 } | |
743 } | |
744 break; | |
745 case TypeFunc::Memory: | |
746 if (pn->_is_io_use) | |
747 projs->catchall_memproj = pn; | |
748 else | |
749 projs->fallthrough_memproj = pn; | |
750 break; | |
751 case TypeFunc::Parms: | |
752 projs->resproj = pn; | |
753 break; | |
754 default: | |
755 assert(false, "unexpected projection from allocation node."); | |
756 } | |
757 } | |
758 | |
759 // The resproj may not exist because the result couuld be ignored | |
760 // and the exception object may not exist if an exception handler | |
761 // swallows the exception but all the other must exist and be found. | |
762 assert(projs->fallthrough_proj != NULL, "must be found"); | |
763 assert(projs->fallthrough_catchproj != NULL, "must be found"); | |
764 assert(projs->fallthrough_memproj != NULL, "must be found"); | |
765 assert(projs->fallthrough_ioproj != NULL, "must be found"); | |
766 assert(projs->catchall_catchproj != NULL, "must be found"); | |
767 if (separate_io_proj) { | |
768 assert(projs->catchall_memproj != NULL, "must be found"); | |
769 assert(projs->catchall_ioproj != NULL, "must be found"); | |
770 } | |
771 } | |
772 | |
773 | |
696 //============================================================================= | 774 //============================================================================= |
697 uint CallJavaNode::size_of() const { return sizeof(*this); } | 775 uint CallJavaNode::size_of() const { return sizeof(*this); } |
698 uint CallJavaNode::cmp( const Node &n ) const { | 776 uint CallJavaNode::cmp( const Node &n ) const { |
699 CallJavaNode &call = (CallJavaNode&)n; | 777 CallJavaNode &call = (CallJavaNode&)n; |
700 return CallNode::cmp(call) && _method == call._method; | 778 return CallNode::cmp(call) && _method == call._method; |