Mercurial > hg > truffle
comparison src/share/vm/opto/callnode.cpp @ 7473:d092d1b31229
8005071: Incremental inlining for JSR 292
Summary: post parse inlining driven by number of live nodes.
Reviewed-by: twisti, kvn, jrose
author | roland |
---|---|
date | Sun, 23 Dec 2012 17:08:22 +0100 |
parents | ad5dd04754ee |
children | a7114d3d712e |
comparison
equal
deleted
inserted
replaced
7445:cd962e15c08e | 7473:d092d1b31229 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "ci/bcEscapeAnalyzer.hpp" | 26 #include "ci/bcEscapeAnalyzer.hpp" |
27 #include "compiler/oopMap.hpp" | 27 #include "compiler/oopMap.hpp" |
28 #include "opto/callGenerator.hpp" | |
28 #include "opto/callnode.hpp" | 29 #include "opto/callnode.hpp" |
29 #include "opto/escape.hpp" | 30 #include "opto/escape.hpp" |
30 #include "opto/locknode.hpp" | 31 #include "opto/locknode.hpp" |
31 #include "opto/machnode.hpp" | 32 #include "opto/machnode.hpp" |
32 #include "opto/matcher.hpp" | 33 #include "opto/matcher.hpp" |
773 | 774 |
774 // The resproj may not exist because the result couuld be ignored | 775 // The resproj may not exist because the result couuld be ignored |
775 // and the exception object may not exist if an exception handler | 776 // and the exception object may not exist if an exception handler |
776 // swallows the exception but all the other must exist and be found. | 777 // swallows the exception but all the other must exist and be found. |
777 assert(projs->fallthrough_proj != NULL, "must be found"); | 778 assert(projs->fallthrough_proj != NULL, "must be found"); |
778 assert(projs->fallthrough_catchproj != NULL, "must be found"); | 779 assert(Compile::current()->inlining_incrementally() || projs->fallthrough_catchproj != NULL, "must be found"); |
779 assert(projs->fallthrough_memproj != NULL, "must be found"); | 780 assert(Compile::current()->inlining_incrementally() || projs->fallthrough_memproj != NULL, "must be found"); |
780 assert(projs->fallthrough_ioproj != NULL, "must be found"); | 781 assert(Compile::current()->inlining_incrementally() || projs->fallthrough_ioproj != NULL, "must be found"); |
781 assert(projs->catchall_catchproj != NULL, "must be found"); | 782 assert(Compile::current()->inlining_incrementally() || projs->catchall_catchproj != NULL, "must be found"); |
782 if (separate_io_proj) { | 783 if (separate_io_proj) { |
783 assert(projs->catchall_memproj != NULL, "must be found"); | 784 assert(Compile::current()->inlining_incrementally() || projs->catchall_memproj != NULL, "must be found"); |
784 assert(projs->catchall_ioproj != NULL, "must be found"); | 785 assert(Compile::current()->inlining_incrementally() || projs->catchall_ioproj != NULL, "must be found"); |
785 } | 786 } |
787 } | |
788 | |
789 Node *CallNode::Ideal(PhaseGVN *phase, bool can_reshape) { | |
790 CallGenerator* cg = generator(); | |
791 if (can_reshape && cg != NULL && cg->is_mh_late_inline() && !cg->already_attempted()) { | |
792 // Check whether this MH handle call becomes a candidate for inlining | |
793 ciMethod* callee = cg->method(); | |
794 vmIntrinsics::ID iid = callee->intrinsic_id(); | |
795 if (iid == vmIntrinsics::_invokeBasic) { | |
796 if (in(TypeFunc::Parms)->Opcode() == Op_ConP) { | |
797 phase->C->prepend_late_inline(cg); | |
798 set_generator(NULL); | |
799 } | |
800 } else { | |
801 assert(callee->has_member_arg(), "wrong type of call?"); | |
802 if (in(TypeFunc::Parms + callee->arg_size() - 1)->Opcode() == Op_ConP) { | |
803 phase->C->prepend_late_inline(cg); | |
804 set_generator(NULL); | |
805 } | |
806 } | |
807 } | |
808 return SafePointNode::Ideal(phase, can_reshape); | |
786 } | 809 } |
787 | 810 |
788 | 811 |
789 //============================================================================= | 812 //============================================================================= |
790 uint CallJavaNode::size_of() const { return sizeof(*this); } | 813 uint CallJavaNode::size_of() const { return sizeof(*this); } |