7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
Reviewed-by: twisti
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Thu Apr 21 00:25:40 2011 -0700
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Apr 25 16:25:58 2011 -0700
@@ -232,14 +232,7 @@
}
// compute size of arguments
- int arg_size = target->arg_size();
- if (code == Bytecodes::_invokedynamic) {
- assert(!target->is_static(), "receiver explicit in method");
- arg_size--; // implicit, not really on stack
- }
- if (!target->is_loaded() && code == Bytecodes::_invokestatic) {
- arg_size--;
- }
+ int arg_size = target->invoke_arg_size(code);
int arg_base = MAX2(state._stack_height - arg_size, 0);
// direct recursive calls are skipped if they can be bound statically without introducing
--- a/hotspot/src/share/vm/ci/ciMethod.hpp Thu Apr 21 00:25:40 2011 -0700
+++ b/hotspot/src/share/vm/ci/ciMethod.hpp Mon Apr 25 16:25:58 2011 -0700
@@ -127,7 +127,24 @@
ciSignature* signature() const { return _signature; }
ciType* return_type() const { return _signature->return_type(); }
int arg_size_no_receiver() const { return _signature->size(); }
- int arg_size() const { return _signature->size() + (_flags.is_static() ? 0 : 1); }
+ // Can only be used on loaded ciMethods
+ int arg_size() const {
+ check_is_loaded();
+ return _signature->size() + (_flags.is_static() ? 0 : 1);
+ }
+ // Report the number of elements on stack when invoking this method.
+ // This is different than the regular arg_size because invokdynamic
+ // has an implicit receiver.
+ int invoke_arg_size(Bytecodes::Code code) const {
+ int arg_size = _signature->size();
+ // Add a receiver argument, maybe:
+ if (code != Bytecodes::_invokestatic &&
+ code != Bytecodes::_invokedynamic) {
+ arg_size++;
+ }
+ return arg_size;
+ }
+
// Method code and related information.
address code() { if (_code == NULL) load_code(); return _code; }
--- a/hotspot/src/share/vm/opto/graphKit.cpp Thu Apr 21 00:25:40 2011 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Mon Apr 25 16:25:58 2011 -0700
@@ -1033,14 +1033,10 @@
iter.reset_to_bci(bci());
iter.next();
ciMethod* method = iter.get_method(ignore);
- inputs = method->arg_size_no_receiver();
- // Add a receiver argument, maybe:
- if (code != Bytecodes::_invokestatic &&
- code != Bytecodes::_invokedynamic)
- inputs += 1;
// (Do not use ciMethod::arg_size(), because
// it might be an unloaded method, which doesn't
// know whether it is static or not.)
+ inputs = method->invoke_arg_size(code);
int size = method->return_type()->size();
depth = size - inputs;
}