src/share/vm/ci/bcEscapeAnalyzer.cpp

changeset 3318
cc81b9c09bbb
parent 2812
548597e74aa4
child 3496
5ed8f599a788
     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  

mercurial