comparison src/share/vm/opto/macro.cpp @ 253:b0fe4deeb9fb

6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.") Summary: Escape Analysis fixes. Reviewed-by: never, rasbold
author kvn
date Mon, 28 Jul 2008 17:12:52 -0700
parents 02a35ad4adf8
children af945ba2e739 1ee8caae33af
comparison
equal deleted inserted replaced
252:be7facf71163 253:b0fe4deeb9fb
192 _igvn.replace_node(st, st->in(MemNode::Memory)); 192 _igvn.replace_node(st, st->in(MemNode::Memory));
193 } 193 }
194 } 194 }
195 195
196 // Search for a memory operation for the specified memory slice. 196 // Search for a memory operation for the specified memory slice.
197 static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_mem, Node *alloc) { 197 static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_mem, Node *alloc, PhaseGVN *phase) {
198 Node *orig_mem = mem; 198 Node *orig_mem = mem;
199 Node *alloc_mem = alloc->in(TypeFunc::Memory); 199 Node *alloc_mem = alloc->in(TypeFunc::Memory);
200 const TypeOopPtr *tinst = phase->C->get_adr_type(alias_idx)->isa_oopptr();
200 while (true) { 201 while (true) {
201 if (mem == alloc_mem || mem == start_mem ) { 202 if (mem == alloc_mem || mem == start_mem ) {
202 return mem; // hit one of our sentinals 203 return mem; // hit one of our sentinals
203 } else if (mem->is_MergeMem()) { 204 } else if (mem->is_MergeMem()) {
204 mem = mem->as_MergeMem()->memory_at(alias_idx); 205 mem = mem->as_MergeMem()->memory_at(alias_idx);
206 Node *in = mem->in(0); 207 Node *in = mem->in(0);
207 // we can safely skip over safepoints, calls, locks and membars because we 208 // we can safely skip over safepoints, calls, locks and membars because we
208 // already know that the object is safe to eliminate. 209 // already know that the object is safe to eliminate.
209 if (in->is_Initialize() && in->as_Initialize()->allocation() == alloc) { 210 if (in->is_Initialize() && in->as_Initialize()->allocation() == alloc) {
210 return in; 211 return in;
211 } else if (in->is_Call() || in->is_MemBar()) { 212 } else if (in->is_Call()) {
213 CallNode *call = in->as_Call();
214 if (!call->may_modify(tinst, phase)) {
215 mem = call->in(TypeFunc::Memory);
216 }
217 mem = in->in(TypeFunc::Memory);
218 } else if (in->is_MemBar()) {
212 mem = in->in(TypeFunc::Memory); 219 mem = in->in(TypeFunc::Memory);
213 } else { 220 } else {
214 assert(false, "unexpected projection"); 221 assert(false, "unexpected projection");
215 } 222 }
216 } else if (mem->is_Store()) { 223 } else if (mem->is_Store()) {
263 return value_phis->node_at(i); 270 return value_phis->node_at(i);
264 } 271 }
265 } 272 }
266 273
267 if (level <= 0) { 274 if (level <= 0) {
268 return NULL; 275 return NULL; // Give up: phi tree too deep
269 } 276 }
270 Node *start_mem = C->start()->proj_out(TypeFunc::Memory); 277 Node *start_mem = C->start()->proj_out(TypeFunc::Memory);
271 Node *alloc_mem = alloc->in(TypeFunc::Memory); 278 Node *alloc_mem = alloc->in(TypeFunc::Memory);
272 279
273 uint length = mem->req(); 280 uint length = mem->req();
281 for (uint j = 1; j < length; j++) { 288 for (uint j = 1; j < length; j++) {
282 Node *in = mem->in(j); 289 Node *in = mem->in(j);
283 if (in == NULL || in->is_top()) { 290 if (in == NULL || in->is_top()) {
284 values.at_put(j, in); 291 values.at_put(j, in);
285 } else { 292 } else {
286 Node *val = scan_mem_chain(in, alias_idx, offset, start_mem, alloc); 293 Node *val = scan_mem_chain(in, alias_idx, offset, start_mem, alloc, &_igvn);
287 if (val == start_mem || val == alloc_mem) { 294 if (val == start_mem || val == alloc_mem) {
288 // hit a sentinel, return appropriate 0 value 295 // hit a sentinel, return appropriate 0 value
289 values.at_put(j, _igvn.zerocon(ft)); 296 values.at_put(j, _igvn.zerocon(ft));
290 continue; 297 continue;
291 } 298 }
306 if (val == NULL) { 313 if (val == NULL) {
307 return NULL; 314 return NULL;
308 } 315 }
309 values.at_put(j, val); 316 values.at_put(j, val);
310 } else { 317 } else {
311 return NULL; // unknown node on this path 318 assert(false, "unknown node on this path");
319 return NULL; // unknown node on this path
312 } 320 }
313 } 321 }
314 } 322 }
315 // Set Phi's inputs 323 // Set Phi's inputs
316 for (uint j = 1; j < length; j++) { 324 for (uint j = 1; j < length; j++) {
342 Node *mem = sfpt_mem; 350 Node *mem = sfpt_mem;
343 while (!done) { 351 while (!done) {
344 if (visited.test_set(mem->_idx)) { 352 if (visited.test_set(mem->_idx)) {
345 return NULL; // found a loop, give up 353 return NULL; // found a loop, give up
346 } 354 }
347 mem = scan_mem_chain(mem, alias_idx, offset, start_mem, alloc); 355 mem = scan_mem_chain(mem, alias_idx, offset, start_mem, alloc, &_igvn);
348 if (mem == start_mem || mem == alloc_mem) { 356 if (mem == start_mem || mem == alloc_mem) {
349 done = true; // hit a sentinel, return appropriate 0 value 357 done = true; // hit a sentinel, return appropriate 0 value
350 } else if (mem->is_Initialize()) { 358 } else if (mem->is_Initialize()) {
351 mem = mem->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn); 359 mem = mem->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn);
352 if (mem == NULL) { 360 if (mem == NULL) {
366 } else if (mem->is_Phi()) { 374 } else if (mem->is_Phi()) {
367 // try to find a phi's unique input 375 // try to find a phi's unique input
368 Node *unique_input = NULL; 376 Node *unique_input = NULL;
369 Node *top = C->top(); 377 Node *top = C->top();
370 for (uint i = 1; i < mem->req(); i++) { 378 for (uint i = 1; i < mem->req(); i++) {
371 Node *n = scan_mem_chain(mem->in(i), alias_idx, offset, start_mem, alloc); 379 Node *n = scan_mem_chain(mem->in(i), alias_idx, offset, start_mem, alloc, &_igvn);
372 if (n == NULL || n == top || n == mem) { 380 if (n == NULL || n == top || n == mem) {
373 continue; 381 continue;
374 } else if (unique_input == NULL) { 382 } else if (unique_input == NULL) {
375 unique_input = n; 383 unique_input = n;
376 } else if (unique_input != n) { 384 } else if (unique_input != n) {
394 } else if (mem->is_Store()) { 402 } else if (mem->is_Store()) {
395 return mem->in(MemNode::ValueIn); 403 return mem->in(MemNode::ValueIn);
396 } else if (mem->is_Phi()) { 404 } else if (mem->is_Phi()) {
397 // attempt to produce a Phi reflecting the values on the input paths of the Phi 405 // attempt to produce a Phi reflecting the values on the input paths of the Phi
398 Node_Stack value_phis(a, 8); 406 Node_Stack value_phis(a, 8);
399 Node * phi = value_from_mem_phi(mem, ft, ftype, adr_t, alloc, &value_phis, 8); 407 Node * phi = value_from_mem_phi(mem, ft, ftype, adr_t, alloc, &value_phis, ValueSearchLimit);
400 if (phi != NULL) { 408 if (phi != NULL) {
401 return phi; 409 return phi;
402 } else { 410 } else {
403 // Kill all new Phis 411 // Kill all new Phis
404 while(value_phis.is_nonempty()) { 412 while(value_phis.is_nonempty()) {
461 for (DUIterator_Fast kmax, k = use->fast_outs(kmax); 469 for (DUIterator_Fast kmax, k = use->fast_outs(kmax);
462 k < kmax && can_eliminate; k++) { 470 k < kmax && can_eliminate; k++) {
463 Node* n = use->fast_out(k); 471 Node* n = use->fast_out(k);
464 if (!n->is_Store() && n->Opcode() != Op_CastP2X) { 472 if (!n->is_Store() && n->Opcode() != Op_CastP2X) {
465 DEBUG_ONLY(disq_node = n;) 473 DEBUG_ONLY(disq_node = n;)
466 if (n->is_Load()) { 474 if (n->is_Load() || n->is_LoadStore()) {
467 NOT_PRODUCT(fail_eliminate = "Field load";) 475 NOT_PRODUCT(fail_eliminate = "Field load";)
468 } else { 476 } else {
469 NOT_PRODUCT(fail_eliminate = "Not store field referrence";) 477 NOT_PRODUCT(fail_eliminate = "Not store field referrence";)
470 } 478 }
471 can_eliminate = false; 479 can_eliminate = false;