src/share/vm/opto/chaitin.cpp

Print this page

        

*** 207,217 **** , _oldphi(unique) #ifndef PRODUCT , _trace_spilling(TraceSpilling || C->method_has_option("TraceSpilling")) #endif { ! NOT_PRODUCT( Compile::TracePhase t3("ctorChaitin", &_t_ctorChaitin, TimeCompiler); ) _high_frequency_lrg = MIN2(double(OPTO_LRG_HIGH_FREQ), _cfg.get_outer_loop_frequency()); // Build a list of basic blocks, sorted by frequency _blks = NEW_RESOURCE_ARRAY(Block *, _cfg.number_of_blocks()); --- 207,217 ---- , _oldphi(unique) #ifndef PRODUCT , _trace_spilling(TraceSpilling || C->method_has_option("TraceSpilling")) #endif { ! Compile::TracePhase t3("ctorChaitin", &timers[_t_ctorChaitin]); _high_frequency_lrg = MIN2(double(OPTO_LRG_HIGH_FREQ), _cfg.get_outer_loop_frequency()); // Build a list of basic blocks, sorted by frequency _blks = NEW_RESOURCE_ARRAY(Block *, _cfg.number_of_blocks());
*** 293,302 **** --- 293,304 ---- return found_projs; } // Renumber the live ranges to compact them. Makes the IFG smaller. void PhaseChaitin::compact() { + Compile::TracePhase t3("chaitinCompact", &timers[_t_chaitinCompact]); + // Current the _uf_map contains a series of short chains which are headed // by a self-cycle. All the chains run from big numbers to little numbers. // The Find() call chases the chains & shortens them for the next Find call. // We are going to change this structure slightly. Numbers above a moving // wave 'i' are unchanged. Numbers below 'j' point directly to their
*** 367,377 **** // Veify the graph before RA. verify(&live_arena); #endif { ! NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); ) _live = NULL; // Mark live as being not available rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); // Empty IFG gather_lrg_masks( false ); // Collect LRG masks --- 369,379 ---- // Veify the graph before RA. verify(&live_arena); #endif { ! Compile::TracePhase t3("computeLive", &timers[_t_computeLive]); _live = NULL; // Mark live as being not available rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); // Empty IFG gather_lrg_masks( false ); // Collect LRG masks
*** 384,394 **** // derived pointer is made, but not beyond. Really, they need to be live // across any GC point where the derived value is live. So this code looks // at all the GC points, and "stretches" the live range of any base pointer // to the GC point. if (stretch_base_pointer_live_ranges(&live_arena)) { ! NOT_PRODUCT(Compile::TracePhase t3("computeLive (sbplr)", &_t_computeLive, TimeCompiler);) // Since some live range stretched, I need to recompute live _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); --- 386,396 ---- // derived pointer is made, but not beyond. Really, they need to be live // across any GC point where the derived value is live. So this code looks // at all the GC points, and "stretches" the live range of any base pointer // to the GC point. if (stretch_base_pointer_live_ranges(&live_arena)) { ! Compile::TracePhase t3("computeLive (sbplr)", &timers[_t_computeLive]); // Since some live range stretched, I need to recompute live _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id());
*** 401,410 **** --- 403,414 ---- // Aggressive (but pessimistic) copy coalescing. // This pass works on virtual copies. Any virtual copies which are not // coalesced get manifested as actual copies { + Compile::TracePhase t3("chaitinCoalesce", &timers[_t_chaitinCoalesce]); + // The IFG is/was triangular. I am 'squaring it up' so Union can run // faster. Union requires a 'for all' operation which is slow on the // triangular adjacency matrix (quick reminder: the IFG is 'sparse' - // meaning I can visit all the Nodes neighbors less than a Node in time // O(# of neighbors), but I have to visit all the Nodes greater than a
*** 422,432 **** } // After aggressive coalesce, attempt a first cut at coloring. // To color, we need the IFG and for that we need LIVE. { ! NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); ) _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); gather_lrg_masks( true ); --- 426,436 ---- } // After aggressive coalesce, attempt a first cut at coloring. // To color, we need the IFG and for that we need LIVE. { ! Compile::TracePhase t3("computeLive", &timers[_t_computeLive]); _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); gather_lrg_masks( true );
*** 460,470 **** NOT_PRODUCT(C->verify_graph_edges();) compact(); // Compact LRGs; return new lower max lrg { ! NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); ) _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); // Build a new interference graph gather_lrg_masks( true ); // Collect intersect mask --- 464,474 ---- NOT_PRODUCT(C->verify_graph_edges();) compact(); // Compact LRGs; return new lower max lrg { ! Compile::TracePhase t3("computeLive", &timers[_t_computeLive]); _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); // Build a new interference graph gather_lrg_masks( true ); // Collect intersect mask
*** 474,483 **** --- 478,488 ---- build_ifg_physical(&live_arena); _ifg->SquareUp(); _ifg->Compute_Effective_Degree(); // Only do conservative coalescing if requested if (OptoCoalesce) { + Compile::TracePhase t3("chaitinCoalesce", &timers[_t_chaitinCoalesce]); // Conservative (and pessimistic) copy coalescing of those spills PhaseConservativeCoalesce coalesce(*this); // If max live ranges greater than cutoff, don't color the stack. // This cutoff can be larger than below since it is only done once. coalesce.coalesce_driver();
*** 529,539 **** compact(); // Compact LRGs; return new lower max lrg // Nuke the live-ness and interference graph and LiveRanGe info { ! NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); ) _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id()); --- 534,544 ---- compact(); // Compact LRGs; return new lower max lrg // Nuke the live-ness and interference graph and LiveRanGe info { ! Compile::TracePhase t3("computeLive", &timers[_t_computeLive]); _live = NULL; rm.reset_to_mark(); // Reclaim working storage IndexSet::reset_memory(C, &live_arena); ifg.init(_lrg_map.max_lrg_id());
*** 547,556 **** --- 552,562 ---- _ifg->SquareUp(); _ifg->Compute_Effective_Degree(); // Only do conservative coalescing if requested if (OptoCoalesce) { + Compile::TracePhase t3("chaitinCoalesce", &timers[_t_chaitinCoalesce]); // Conservative (and pessimistic) copy coalescing PhaseConservativeCoalesce coalesce(*this); // Check for few live ranges determines how aggressive coalesce is. coalesce.coalesce_driver(); }
*** 1052,1061 **** --- 1058,1068 ---- #define REGISTER_CONSTRAINED 16 // Compute cost/area ratio, in case we spill. Build the lo-degree list. void PhaseChaitin::cache_lrg_info( ) { + Compile::TracePhase t3("chaitinCacheLRG", &timers[_t_chaitinCacheLRG]); for (uint i = 1; i < _lrg_map.max_lrg_id(); i++) { LRG &lrg = lrgs(i); // Check for being of low degree: means we can be trivially colored.
*** 1135,1144 **** --- 1142,1152 ---- // No more lo-degree no-copy live ranges to simplify } // Simplify the IFG by removing LRGs of low degree. void PhaseChaitin::Simplify( ) { + Compile::TracePhase t3("chaitinSimplify", &timers[_t_chaitinSimplify]); while( 1 ) { // Repeat till simplified it all // May want to explore simplifying lo_degree before _lo_stk_degree. // This might result in more spills coloring into registers during // Select().
*** 1382,1391 **** --- 1390,1401 ---- // Select colors by re-inserting LRGs back into the IFG. LRGs are re-inserted // in reverse order of removal. As long as nothing of hi-degree was yanked, // everything going back is guaranteed a color. Select that color. If some // hi-degree LRG cannot get a color then we record that we must spill. uint PhaseChaitin::Select( ) { + Compile::TracePhase t3("chaitinSelect", &timers[_t_chaitinSelect]); + uint spill_reg = LRG::SPILL_REG; _max_reg = OptoReg::Name(0); // Past max register used while( _simplified ) { // Pull next LRG from the simplified list - in reverse order of removal uint lidx = _simplified;
*** 1575,1585 **** // Stores. Use-def chains are NOT preserved, but Node->LRG->reg maps are. void PhaseChaitin::fixup_spills() { // This function does only cisc spill work. if( !UseCISCSpill ) return; ! NOT_PRODUCT( Compile::TracePhase t3("fixupSpills", &_t_fixupSpills, TimeCompiler); ) // Grab the Frame Pointer Node *fp = _cfg.get_root_block()->head()->in(1)->in(TypeFunc::FramePtr); // For all blocks --- 1585,1595 ---- // Stores. Use-def chains are NOT preserved, but Node->LRG->reg maps are. void PhaseChaitin::fixup_spills() { // This function does only cisc spill work. if( !UseCISCSpill ) return; ! Compile::TracePhase t3("fixupSpills", &timers[_t_fixupSpills]); // Grab the Frame Pointer Node *fp = _cfg.get_root_block()->head()->in(1)->in(TypeFunc::FramePtr); // For all blocks