Mercurial > hg > truffle
comparison src/share/vm/ci/bcEscapeAnalyzer.cpp @ 4122:cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
Summary: Fixed several EA issues with Connection Graph construction.
Reviewed-by: never, twisti
author | kvn |
---|---|
date | Mon, 28 Nov 2011 15:46:31 -0800 |
parents | 548597e74aa4 |
children | 5ed8f599a788 |
comparison
equal
deleted
inserted
replaced
4121:db2e64ca2d5a | 4122:cc81b9c09bbb |
---|---|
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(); |