1340 // for( int i=0; i < (int)matcher._null_check_tests.size(); i+=2 ) { |
1340 // for( int i=0; i < (int)matcher._null_check_tests.size(); i+=2 ) { |
1341 for (int i = _matcher._null_check_tests.size() - 2; i >= 0; i -= 2) { |
1341 for (int i = _matcher._null_check_tests.size() - 2; i >= 0; i -= 2) { |
1342 Node* proj = _matcher._null_check_tests[i]; |
1342 Node* proj = _matcher._null_check_tests[i]; |
1343 Node* val = _matcher._null_check_tests[i + 1]; |
1343 Node* val = _matcher._null_check_tests[i + 1]; |
1344 Block* block = get_block_for_node(proj); |
1344 Block* block = get_block_for_node(proj); |
1345 block->implicit_null_check(this, proj, val, allowed_reasons); |
1345 implicit_null_check(block, proj, val, allowed_reasons); |
1346 // The implicit_null_check will only perform the transformation |
1346 // The implicit_null_check will only perform the transformation |
1347 // if the null branch is truly uncommon, *and* it leads to an |
1347 // if the null branch is truly uncommon, *and* it leads to an |
1348 // uncommon trap. Combined with the too_many_traps guards |
1348 // uncommon trap. Combined with the too_many_traps guards |
1349 // above, this prevents SEGV storms reported in 6366351, |
1349 // above, this prevents SEGV storms reported in 6366351, |
1350 // by recompiling offending methods without this optimization. |
1350 // by recompiling offending methods without this optimization. |
1361 // Later, do a real latency aware scheduler. |
1361 // Later, do a real latency aware scheduler. |
1362 GrowableArray<int> ready_cnt(C->unique(), C->unique(), -1); |
1362 GrowableArray<int> ready_cnt(C->unique(), C->unique(), -1); |
1363 visited.Clear(); |
1363 visited.Clear(); |
1364 for (uint i = 0; i < number_of_blocks(); i++) { |
1364 for (uint i = 0; i < number_of_blocks(); i++) { |
1365 Block* block = get_block(i); |
1365 Block* block = get_block(i); |
1366 if (!block->schedule_local(this, _matcher, ready_cnt, visited)) { |
1366 if (!schedule_local(block, ready_cnt, visited)) { |
1367 if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) { |
1367 if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) { |
1368 C->record_method_not_compilable("local schedule failed"); |
1368 C->record_method_not_compilable("local schedule failed"); |
1369 } |
1369 } |
1370 return; |
1370 return; |
1371 } |
1371 } |
1373 |
1373 |
1374 // If we inserted any instructions between a Call and his CatchNode, |
1374 // If we inserted any instructions between a Call and his CatchNode, |
1375 // clone the instructions on all paths below the Catch. |
1375 // clone the instructions on all paths below the Catch. |
1376 for (uint i = 0; i < number_of_blocks(); i++) { |
1376 for (uint i = 0; i < number_of_blocks(); i++) { |
1377 Block* block = get_block(i); |
1377 Block* block = get_block(i); |
1378 block->call_catch_cleanup(this, C); |
1378 call_catch_cleanup(block); |
1379 } |
1379 } |
1380 |
1380 |
1381 #ifndef PRODUCT |
1381 #ifndef PRODUCT |
1382 if (trace_opto_pipelining()) { |
1382 if (trace_opto_pipelining()) { |
1383 tty->print("\n---- After GlobalCodeMotion ----\n"); |
1383 tty->print("\n---- After GlobalCodeMotion ----\n"); |