src/share/vm/opto/ifg.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/ifg.cpp	Wed Dec  3 17:16:10 2014
--- new/src/share/vm/opto/ifg.cpp	Wed Dec  3 17:16:10 2014

*** 539,548 **** --- 539,549 ---- if( !liveout.member(r) && n->Opcode() != Op_SafePoint ) { Node *def = n->in(0); if( !n->is_Proj() || // Could also be a flags-projection of a dead ADD or such. (_lrg_map.live_range_id(def) && !liveout.member(_lrg_map.live_range_id(def)))) { + bool remove = true; if (n->is_MachProj()) { // Don't remove KILL projections if their "defining" nodes have // memory effects (have SCMemProj projection node) - // they are not dead even when their result is not used. // For example, compareAndSwapL (and other CAS) and EncodeISOArray nodes.
*** 551,564 **** --- 552,567 ---- // in block in such order that KILL MachProj nodes are processed first. uint cnt = def->outcnt(); for (uint i = 0; i < cnt; i++) { Node* proj = def->raw_out(i); if (proj->Opcode() == Op_SCMemProj) { ! return false; ! remove = false; + break; } } } + if (remove) { block->remove_node(j - 1); if (lrgs(r)._def == n) { lrgs(r)._def = 0; } n->disconnect_inputs(NULL, C);
*** 567,576 **** --- 570,580 ---- // Since yanking a Node from block, high pressure moves up one hrp_index[0]--; hrp_index[1]--; continue; } + } // Fat-projections kill many registers which cannot be used to // hold live ranges. if (lrgs(r)._fat_proj) { // Count the int-only registers

src/share/vm/opto/ifg.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File