Mercurial > hg > truffle
diff src/share/vm/ci/bcEscapeAnalyzer.cpp @ 11163:c90c698831d7
8020215: Different execution plan when using JIT vs interpreter
Summary: fix bytecode analyzer
Reviewed-by: twisti
author | kvn |
---|---|
date | Fri, 12 Jul 2013 14:01:37 -0700 |
parents | bb33c6fdcf0d |
children | de6a9e811145 |
line wrap: on
line diff
--- a/src/share/vm/ci/bcEscapeAnalyzer.cpp Wed Jul 10 13:33:56 2013 -0700 +++ b/src/share/vm/ci/bcEscapeAnalyzer.cpp Fri Jul 12 14:01:37 2013 -0700 @@ -138,6 +138,16 @@ return false; } +// return true if all argument elements of vars are returned +bool BCEscapeAnalyzer::returns_all(ArgumentMap vars) { + for (int i = 0; i < _arg_size; i++) { + if (vars.contains(i) && !_arg_returned.test(i)) { + return false; + } + } + return true; +} + void BCEscapeAnalyzer::clear_bits(ArgumentMap vars, VectorSet &bm) { for (int i = 0; i < _arg_size; i++) { if (vars.contains(i)) { @@ -166,6 +176,11 @@ if (vars.contains_unknown() || vars.contains_vars()) { _return_allocated = false; } + if (_return_local && vars.contains_vars() && !returns_all(vars)) { + // Return result should be invalidated if args in new + // state are not recorded in return state. + _return_local = false; + } } }