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);