Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/graphKit.cpp @ 1257:7b4415a18c8a
Merge
author | kvn |
---|---|
date | Fri, 12 Feb 2010 15:27:36 -0800 |
parents | 6deeaebad47a f516d5d7a019 |
children | b4776199210f |
comparison
equal
deleted
inserted
replaced
1249:95d21201c29a | 1257:7b4415a18c8a |
---|---|
778 | 778 |
779 #endif //ASSERT | 779 #endif //ASSERT |
780 | 780 |
781 // Helper function for enforcing certain bytecodes to reexecute if | 781 // Helper function for enforcing certain bytecodes to reexecute if |
782 // deoptimization happens | 782 // deoptimization happens |
783 static bool should_reexecute_implied_by_bytecode(JVMState *jvms) { | 783 static bool should_reexecute_implied_by_bytecode(JVMState *jvms, bool is_anewarray) { |
784 ciMethod* cur_method = jvms->method(); | 784 ciMethod* cur_method = jvms->method(); |
785 int cur_bci = jvms->bci(); | 785 int cur_bci = jvms->bci(); |
786 if (cur_method != NULL && cur_bci != InvocationEntryBci) { | 786 if (cur_method != NULL && cur_bci != InvocationEntryBci) { |
787 Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci); | 787 Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci); |
788 return Interpreter::bytecode_should_reexecute(code); | 788 return Interpreter::bytecode_should_reexecute(code) || |
789 is_anewarray && code == Bytecodes::_multianewarray; | |
790 // Reexecute _multianewarray bytecode which was replaced with | |
791 // sequence of [a]newarray. See Parse::do_multianewarray(). | |
792 // | |
793 // Note: interpreter should not have it set since this optimization | |
794 // is limited by dimensions and guarded by flag so in some cases | |
795 // multianewarray() runtime calls will be generated and | |
796 // the bytecode should not be reexecutes (stack will not be reset). | |
789 } else | 797 } else |
790 return false; | 798 return false; |
791 } | 799 } |
792 | 800 |
793 // Helper function for adding JVMState and debug information to node | 801 // Helper function for adding JVMState and debug information to node |
834 call->set_jvms(out_jvms); // Start jvms list for call node | 842 call->set_jvms(out_jvms); // Start jvms list for call node |
835 | 843 |
836 // For a known set of bytecodes, the interpreter should reexecute them if | 844 // For a known set of bytecodes, the interpreter should reexecute them if |
837 // deoptimization happens. We set the reexecute state for them here | 845 // deoptimization happens. We set the reexecute state for them here |
838 if (out_jvms->is_reexecute_undefined() && //don't change if already specified | 846 if (out_jvms->is_reexecute_undefined() && //don't change if already specified |
839 should_reexecute_implied_by_bytecode(out_jvms)) { | 847 should_reexecute_implied_by_bytecode(out_jvms, call->is_AllocateArray())) { |
840 out_jvms->set_should_reexecute(true); //NOTE: youngest_jvms not changed | 848 out_jvms->set_should_reexecute(true); //NOTE: youngest_jvms not changed |
841 } | 849 } |
842 | 850 |
843 // Presize the call: | 851 // Presize the call: |
844 debug_only(uint non_debug_edges = call->req()); | 852 debug_only(uint non_debug_edges = call->req()); |