2437 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2437 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2438 progress = progress || success; |
2438 progress = progress || success; |
2439 } |
2439 } |
2440 } |
2440 } |
2441 // Next, attempt to eliminate allocations |
2441 // Next, attempt to eliminate allocations |
|
2442 _has_locks = false; |
2442 progress = true; |
2443 progress = true; |
2443 while (progress) { |
2444 while (progress) { |
2444 progress = false; |
2445 progress = false; |
2445 for (int i = C->macro_count(); i > 0; i--) { |
2446 for (int i = C->macro_count(); i > 0; i--) { |
2446 Node * n = C->macro_node(i-1); |
2447 Node * n = C->macro_node(i-1); |
2455 success = eliminate_boxing_node(n->as_CallStaticJava()); |
2456 success = eliminate_boxing_node(n->as_CallStaticJava()); |
2456 break; |
2457 break; |
2457 case Node::Class_Lock: |
2458 case Node::Class_Lock: |
2458 case Node::Class_Unlock: |
2459 case Node::Class_Unlock: |
2459 assert(!n->as_AbstractLock()->is_eliminated(), "sanity"); |
2460 assert(!n->as_AbstractLock()->is_eliminated(), "sanity"); |
|
2461 _has_locks = true; |
2460 break; |
2462 break; |
2461 default: |
2463 default: |
2462 assert(n->Opcode() == Op_LoopLimit || |
2464 assert(n->Opcode() == Op_LoopLimit || |
2463 n->Opcode() == Op_Opaque1 || |
2465 n->Opcode() == Op_Opaque1 || |
2464 n->Opcode() == Op_Opaque2, "unknown node type in macro list"); |
2466 n->Opcode() == Op_Opaque2 || |
|
2467 n->Opcode() == Op_Opaque3, "unknown node type in macro list"); |
2465 } |
2468 } |
2466 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2469 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2467 progress = progress || success; |
2470 progress = progress || success; |
2468 } |
2471 } |
2469 } |
2472 } |
2500 _igvn._worklist.push(n); |
2503 _igvn._worklist.push(n); |
2501 success = true; |
2504 success = true; |
2502 } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { |
2505 } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { |
2503 _igvn.replace_node(n, n->in(1)); |
2506 _igvn.replace_node(n, n->in(1)); |
2504 success = true; |
2507 success = true; |
|
2508 #if INCLUDE_RTM_OPT |
|
2509 } else if ((n->Opcode() == Op_Opaque3) && ((Opaque3Node*)n)->rtm_opt()) { |
|
2510 assert(C->profile_rtm(), "should be used only in rtm deoptimization code"); |
|
2511 assert((n->outcnt() == 1) && n->unique_out()->is_Cmp(), ""); |
|
2512 Node* cmp = n->unique_out(); |
|
2513 #ifdef ASSERT |
|
2514 // Validate graph. |
|
2515 assert((cmp->outcnt() == 1) && cmp->unique_out()->is_Bool(), ""); |
|
2516 BoolNode* bol = cmp->unique_out()->as_Bool(); |
|
2517 assert((bol->outcnt() == 1) && bol->unique_out()->is_If() && |
|
2518 (bol->_test._test == BoolTest::ne), ""); |
|
2519 IfNode* ifn = bol->unique_out()->as_If(); |
|
2520 assert((ifn->outcnt() == 2) && |
|
2521 ifn->proj_out(1)->is_uncommon_trap_proj(Deoptimization::Reason_rtm_state_change), ""); |
|
2522 #endif |
|
2523 Node* repl = n->in(1); |
|
2524 if (!_has_locks) { |
|
2525 // Remove RTM state check if there are no locks in the code. |
|
2526 // Replace input to compare the same value. |
|
2527 repl = (cmp->in(1) == n) ? cmp->in(2) : cmp->in(1); |
|
2528 } |
|
2529 _igvn.replace_node(n, repl); |
|
2530 success = true; |
|
2531 #endif |
2505 } |
2532 } |
2506 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2533 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); |
2507 progress = progress || success; |
2534 progress = progress || success; |
2508 } |
2535 } |
2509 } |
2536 } |