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