src/share/vm/ci/bcEscapeAnalyzer.cpp

changeset 7626
364f6c28effb
parent 7443
609faa407cfd
child 7994
04ff2f6cd0eb
child 9736
940791dabea2
     1.1 --- a/src/share/vm/ci/bcEscapeAnalyzer.cpp	Tue Mar 03 19:42:09 2015 +0000
     1.2 +++ b/src/share/vm/ci/bcEscapeAnalyzer.cpp	Mon Mar 02 13:40:40 2015 +0100
     1.3 @@ -42,7 +42,7 @@
     1.4    #define TRACE_BCEA(level, code)
     1.5  #endif
     1.6  
     1.7 -// Maintain a map of which aguments a local variable or
     1.8 +// Maintain a map of which arguments a local variable or
     1.9  // stack slot may contain.  In addition to tracking
    1.10  // arguments, it tracks two special values, "allocated"
    1.11  // which represents any object allocated in the current
    1.12 @@ -318,14 +318,16 @@
    1.13      bool must_record_dependencies = false;
    1.14      for (i = arg_size - 1; i >= 0; i--) {
    1.15        ArgumentMap arg = state.raw_pop();
    1.16 -      if (!is_argument(arg))
    1.17 +      // Check if callee arg is a caller arg or an allocated object
    1.18 +      bool allocated = arg.contains_allocated();
    1.19 +      if (!(is_argument(arg) || allocated))
    1.20          continue;
    1.21        for (int j = 0; j < _arg_size; j++) {
    1.22          if (arg.contains(j)) {
    1.23            _arg_modified[j] |= analyzer._arg_modified[i];
    1.24          }
    1.25        }
    1.26 -      if (!is_arg_stack(arg)) {
    1.27 +      if (!(is_arg_stack(arg) || allocated)) {
    1.28          // arguments have already been recognized as escaping
    1.29        } else if (analyzer.is_arg_stack(i) && !analyzer.is_arg_returned(i)) {
    1.30          set_method_escape(arg);

mercurial