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;