hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp
changeset 11198 34c860ff41e3
parent 9329 79c74b9e2afe
child 11633 de5e87f50b2d
equal deleted inserted replaced
11197:158eecd6b330 11198:34c860ff41e3
   148 
   148 
   149 void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) {
   149 void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) {
   150   clear_bits(vars, _arg_local);
   150   clear_bits(vars, _arg_local);
   151 }
   151 }
   152 
   152 
   153 void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars) {
   153 void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars, bool merge) {
   154   clear_bits(vars, _arg_local);
   154   clear_bits(vars, _arg_local);
   155   clear_bits(vars, _arg_stack);
   155   clear_bits(vars, _arg_stack);
   156   if (vars.contains_allocated())
   156   if (vars.contains_allocated())
   157     _allocated_escapes = true;
   157     _allocated_escapes = true;
       
   158 
       
   159   if (merge && !vars.is_empty()) {
       
   160     // Merge new state into already processed block.
       
   161     // New state is not taken into account and
       
   162     // it may invalidate set_returned() result.
       
   163     if (vars.contains_unknown() || vars.contains_allocated()) {
       
   164       _return_local = false;
       
   165     }
       
   166     if (vars.contains_unknown() || vars.contains_vars()) {
       
   167       _return_allocated = false;
       
   168     }
       
   169   }
   158 }
   170 }
   159 
   171 
   160 void BCEscapeAnalyzer::set_dirty(ArgumentMap vars) {
   172 void BCEscapeAnalyzer::set_dirty(ArgumentMap vars) {
   161   clear_bits(vars, _dirty);
   173   clear_bits(vars, _dirty);
   162 }
   174 }
   997       t.clear();
  1009       t.clear();
   998       t = s_state->_stack[i];
  1010       t = s_state->_stack[i];
   999       t.set_difference(d_state->_stack[i]);
  1011       t.set_difference(d_state->_stack[i]);
  1000       extra_vars.set_union(t);
  1012       extra_vars.set_union(t);
  1001     }
  1013     }
  1002     set_global_escape(extra_vars);
  1014     set_global_escape(extra_vars, true);
  1003   }
  1015   }
  1004 }
  1016 }
  1005 
  1017 
  1006 void BCEscapeAnalyzer::iterate_blocks(Arena *arena) {
  1018 void BCEscapeAnalyzer::iterate_blocks(Arena *arena) {
  1007   int numblocks = _methodBlocks->num_blocks();
  1019   int numblocks = _methodBlocks->num_blocks();