comparison src/share/vm/opto/macro.cpp @ 17810:62c54fcc0a35

Merge
author kvn
date Tue, 25 Mar 2014 17:07:36 -0700
parents a9becfeecd1b 606acabe7b5c
children 52b4284cb496 f8afcfbdbf1c
comparison
equal deleted inserted replaced
17809:a433eb716ce1 17810:62c54fcc0a35
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 }