src/share/vm/ci/bcEscapeAnalyzer.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/ci/bcEscapeAnalyzer.cpp	Fri Nov 18 18:16:29 2011
--- new/src/share/vm/ci/bcEscapeAnalyzer.cpp	Fri Nov 18 18:16:28 2011

*** 148,162 **** --- 148,174 ---- void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) { clear_bits(vars, _arg_local); } ! void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars, bool merge) { clear_bits(vars, _arg_local); clear_bits(vars, _arg_stack); if (vars.contains_allocated()) _allocated_escapes = true; + + if (merge && !vars.is_empty()) { + // Merge new state into already processed block. + // New state is not taken into account and + // it may invalidate set_returned() result. + if (vars.contains_unknown() || vars.contains_allocated()) { + _return_local = false; + } + if (vars.contains_unknown() || vars.contains_vars()) { + _return_allocated = false; + } + } } void BCEscapeAnalyzer::set_dirty(ArgumentMap vars) { clear_bits(vars, _dirty); }
*** 997,1007 **** --- 1009,1019 ---- t.clear(); t = s_state->_stack[i]; t.set_difference(d_state->_stack[i]); extra_vars.set_union(t); } ! set_global_escape(extra_vars, true); } } void BCEscapeAnalyzer::iterate_blocks(Arena *arena) { int numblocks = _methodBlocks->num_blocks();

src/share/vm/ci/bcEscapeAnalyzer.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File