1.1 --- a/src/share/vm/ci/bcEscapeAnalyzer.cpp Wed Jul 10 13:33:56 2013 -0700 1.2 +++ b/src/share/vm/ci/bcEscapeAnalyzer.cpp Fri Jul 12 14:01:37 2013 -0700 1.3 @@ -138,6 +138,16 @@ 1.4 return false; 1.5 } 1.6 1.7 +// return true if all argument elements of vars are returned 1.8 +bool BCEscapeAnalyzer::returns_all(ArgumentMap vars) { 1.9 + for (int i = 0; i < _arg_size; i++) { 1.10 + if (vars.contains(i) && !_arg_returned.test(i)) { 1.11 + return false; 1.12 + } 1.13 + } 1.14 + return true; 1.15 +} 1.16 + 1.17 void BCEscapeAnalyzer::clear_bits(ArgumentMap vars, VectorSet &bm) { 1.18 for (int i = 0; i < _arg_size; i++) { 1.19 if (vars.contains(i)) { 1.20 @@ -166,6 +176,11 @@ 1.21 if (vars.contains_unknown() || vars.contains_vars()) { 1.22 _return_allocated = false; 1.23 } 1.24 + if (_return_local && vars.contains_vars() && !returns_all(vars)) { 1.25 + // Return result should be invalidated if args in new 1.26 + // state are not recorded in return state. 1.27 + _return_local = false; 1.28 + } 1.29 } 1.30 } 1.31