>> linkResolver.cpp: >> Can you replace infinite for(;;) in resolve_invokedynamic() with finite >> loop since the body is executed once or twice. > > Hmm. What limit do you have in mind?
It is not loop by logic. The code is trying to avoid double the check for CallSite has been bound already. I think it could be re-arranged as next: + Handle bootstrap_specifier; + // Check if CallSite has been bound already: + ConstantPoolCacheEntry* cpce = pool->cache()->secondary_entry_at(index); + if (cpce->is_f1_null()) { + int pool_index = pool->cache()->main_entry_at(index)->constant_pool_index(); + oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, CHECK); + assert(bsm_info != NULL, ""); + // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic. + bootstrap_specifier = Handle(THREAD, bsm_info); + } + if (!cpce->is_f1_null()) { + methodHandle method(THREAD, cpce->f2_as_vfinal_method()); + Handle appendix(THREAD, cpce->has_appendix() ? cpce->f1_appendix() : (oop)NULL); + result.set_handle(method, appendix, CHECK); + return; + } >> bytecodeInfo.cpp: >> Don't add spaces into conditions, looks strange. > You REALLY want me to remove it? ;-) No, you can leave it as it is. Vladimir Christian Thalinger wrote: > On Jul 12, 2012, at 6:27 PM, Vladimir Kozlov wrote: > >> John, >> >> sharedRuntime_sparc.cpp: >> Why casting to (int)? Also use pointer_delta(code_end, code_start,1): >> + __ set((int)(intptr_t)(code_end - code_start), temp2_reg); > > Done. > >> You bound L_fail label twice, it should be local in range_check(). Use brx() >> instead of br() since you compare pointers. And use cmp_and_brx_short() if >> delayed instruction is nop(). > > Done. > >> Use fatal() instead of guarantee: >> guarantee(false, err_msg("special_dispatch=%d", special_dispatch)); > > Done. > >> interpreter_sparc.cpp: >> In generate_method_entry() use fatal() instead of ShouldNotReachHere(): >> fatal(err_msg("unexpected method kind: %d", kind)); > > Good idea. Done. > >> >> methodHandles_sparc.cpp: >> In MethodHandles::verify_klass() calls restore() should be after BINDs. > > Argh. I haven't seen you've found this bug. It took me a while to debug > this :-) > >> In MethodHandles::jump_from_method_handle() use cmp_and_br_short(temp, 0, ) > > Done. > >> Instead of 100 use strlen(name)+50: >> + char* qname = NEW_C_HEAP_ARRAY(char, 100); >> + jio_snprintf(qname, 100, > > Done. > >> sharedRuntime_x86_32.cpp: >> sharedRuntime_x86_64.cpp: >> The same problem with L_fail label as in sharedRuntime_sparc.cpp. > > Done. > >> templateInterpreter_x86_32.cpp: >> templateInterpreter_x86_64.cpp: >> Again use use fatal() instead of ShouldNotReachHere() in >> generate_method_entry() > > Done. > >> I see in several files next code pattern. Should we call >> throw_IncompatibleClassChangeError() as we do in other places?: >> >> + if (!EnableInvokeDynamic) { >> + // rewriter does not generate this bytecode >> + __ should_not_reach_here(); >> + return; >> + } > > Hmm. This really should not happen and EnableInvokeDynamic is on by default > anyway. I doubt someone turns it off. > >> c1_FrameMap.cpp: >> Why is ShouldNotReachHere() for mh_invoke in >> FrameMap::java_calling_convention()? > > That was old, unused code. Removed. > >> c1_GraphBuilder.cpp: >> add parenthesis: >> const bool is_invokedynamic = code == Bytecodes::_invokedynamic; > > Done. > >> nmethod.cpp: >> Don't put printing nmethod's addresses under Verbose flag. > > Leftover. Removed. > >> linkResolver.cpp: >> Can you replace infinite for(;;) in resolve_invokedynamic() with finite loop >> since the body is executed once or twice. > > Hmm. What limit do you have in mind? > >> templateInterpreter.cpp: >> why you need additional {} around the loop? > > We don't. I think it was used for better visibility of the MH code. Removed. > >> constantPoolOop.cpp: >> Why not use guarantee() for bad operants? > > Not sure. John? > >> Why you need separate scopes in resolve_bootstrap_specifier_at_impl()? > > To keep oops from being visible. Might result in bad crashes. > >> symbol.cpp: >> The loop in index_of_at() should be for(; scan <= limit; scan++) and after >> loop return -1. > > Done. > >> bytecodeInfo.cpp: >> Don't add spaces into conditions, looks strange. > > It's more readable: > > if ( callee->is_native()) return "native method"; > if ( callee->is_abstract()) return "abstract method"; > if (!callee->can_be_compiled()) return "not compilable > (disabled)"; > if (!callee->has_balanced_monitors()) return "not compilable > (unbalanced monitors)"; > if ( callee->get_flow_analysis()->failing()) return "not compilable (flow > analysis failed)"; > > vs. > > if (callee->is_native()) return "native method"; > if (callee->is_abstract()) return "abstract method"; > if (!callee->can_be_compiled()) return "not compilable > (disabled)"; > if (!callee->has_balanced_monitors()) return "not compilable > (unbalanced monitors)"; > if (callee->get_flow_analysis()->failing()) return "not compilable (flow > analysis failed)"; > > You REALLY want me to remove it? ;-) > >> Remove commented code for inline ForceInline methods. > > Agreed. We need to revisit that anyway. > >> callGenerator.cpp: >> Please, decide which code to use: +#if 1. And I don't think new code is >> correct. > > PredictedDynamicCallGenerator is dead. Removed. > >> graphKit.cpp: >> Remove commented debug print. > > Done. > >> insert_argument() and remove_argument() are not used. > > Correct. Removed. > > I will refresh the review patch in mlvm. Thank you! > > -- Chris > >> >> Vladimir >> >> John Rose wrote: >>> As some of you have noticed, Chris Thalinger, Michael Haupt, and I have >>> been working on the mlvm patches [1] for JEP-160 [2] for several months. >>> These changes make method handles more optimizable. They refactor lots of >>> "magic" out of the JVM and into more manageable Java code. >>> To get an idea of how much "magic" is being removed, consider that the >>> change removes 12,000 lines of non-comment code from the JVM, including >>> much assembly code. It inserts 4900 lines of non-comment code. >>> These changes are now stable enough to integrate. They pass jtreg tests in >>> a number of execution modes and platforms. They also correctly run various >>> JRuby and Nashorn test programs. Although there are no performance gains >>> to boast about at present, these changes clear the ground for long-term >>> optimization work. >>> Here is the webrev [3], for review and integration into JDK 8 via >>> hotspot-comp/hotspot/. >>> Because of the large size of this change set, we request that reviewers >>> would clearly designate which files they are reviewing. That way we may be >>> able to divide up the work a little more effectively. >>> Also, because of the scope of the change, we may respond to some comments >>> by promising to address an issue in a future change set. If necessary, we >>> will file tracking bugs to make sure nothing gets dropped. We have been >>> working on this for months, and expect to make many further changes. >>> The immediate need to get the changes in is twofold: First, some bugs >>> (involving symbolic references off the boot class path) require the new >>> Lambda Form intermediate representation, which is "off-BCP-clean". Second, >>> we need to commit our pervasive changes to the JVM sooner rather than >>> later, so they can be properly integrated with other pervasive changes, >>> such as metadata changes. >>> An associated webrev for hotspot-comp/jdk/ will be posted soon; it is >>> already present on mlvm-dev for the curious to examine. (This change set >>> also deletes a lot of old code.) >>> Thanks in advance, >>> — John >>> [1] >>> http://hg.openjdk.java.net/mlvm/mlvm/hotspot/file/tip/meth-lazy-7023639.patch >>> [2] http://openjdk.java.net/jeps/160 >>> [3] http://cr.openjdk.java.net/~jrose/7023639/webrev.00/ > _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev