1.1 --- a/src/share/vm/ci/bcEscapeAnalyzer.cpp Tue Nov 22 09:45:57 2011 +0100 1.2 +++ b/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Nov 28 15:46:31 2011 -0800 1.3 @@ -150,11 +150,23 @@ 1.4 clear_bits(vars, _arg_local); 1.5 } 1.6 1.7 -void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars) { 1.8 +void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars, bool merge) { 1.9 clear_bits(vars, _arg_local); 1.10 clear_bits(vars, _arg_stack); 1.11 if (vars.contains_allocated()) 1.12 _allocated_escapes = true; 1.13 + 1.14 + if (merge && !vars.is_empty()) { 1.15 + // Merge new state into already processed block. 1.16 + // New state is not taken into account and 1.17 + // it may invalidate set_returned() result. 1.18 + if (vars.contains_unknown() || vars.contains_allocated()) { 1.19 + _return_local = false; 1.20 + } 1.21 + if (vars.contains_unknown() || vars.contains_vars()) { 1.22 + _return_allocated = false; 1.23 + } 1.24 + } 1.25 } 1.26 1.27 void BCEscapeAnalyzer::set_dirty(ArgumentMap vars) { 1.28 @@ -999,7 +1011,7 @@ 1.29 t.set_difference(d_state->_stack[i]); 1.30 extra_vars.set_union(t); 1.31 } 1.32 - set_global_escape(extra_vars); 1.33 + set_global_escape(extra_vars, true); 1.34 } 1.35 } 1.36