src/share/vm/ci/bcEscapeAnalyzer.cpp

changeset 5436
c90c698831d7
parent 4268
bb33c6fdcf0d
child 6198
55fb97c4c58d
     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  

mercurial