Index: gcc/sel-sched.c =================================================================== --- gcc/sel-sched.c (revision 131202) +++ gcc/sel-sched.c (working copy) @@ -2960,6 +2960,7 @@ sel_rank_for_schedule (const void *x, co { if (VINSN_UNIQUE_P (tmp_vinsn) && VINSN_UNIQUE_P (tmp2_vinsn)) return SCHED_GROUP_P (tmp2_insn) ? 1 : -1; + /* Now uniqueness means SCHED_GROUP_P is set, because schedule groups cannot be cloned. */ if (VINSN_UNIQUE_P (tmp2_vinsn)) @@ -3312,7 +3313,7 @@ fill_vec_av_set (av_set_t av, blist_t bn /* Don't allow any insns other than from SCHED_GROUP if we have one. */ if (FENCE_SCHED_NEXT (fence) && insn != FENCE_SCHED_NEXT (fence)) { - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); continue; } @@ -3328,8 +3329,11 @@ fill_vec_av_set (av_set_t av, blist_t bn target_available = EXPR_TARGET_AVAILABLE (rhs); if (target_available == true) - /* Do nothing -- we can use an existing register. */ - succ++; + { + /* Do nothing -- we can use an existing register. */ + succ++; + is_orig_reg_p = EXPR_SEPARABLE_P (rhs); + } else if (/* Non-separable instruction will never get another register. */ (target_available == false @@ -3338,7 +3342,7 @@ fill_vec_av_set (av_set_t av, blist_t bn || n >= max_insns_to_rename) { succ++; - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); print ("- no register; "); continue; } @@ -3349,7 +3353,7 @@ fill_vec_av_set (av_set_t av, blist_t bn not available in separable RHS. Do it the hard way. */ ! find_best_reg_for_rhs (rhs, bnds, &is_orig_reg_p)) { - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); print ("- no register; "); continue; } @@ -3369,11 +3373,11 @@ fill_vec_av_set (av_set_t av, blist_t bn /* We need to know whether we do need to stall for any insns. */ stalled++; print ("- not ready yet; "); - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); continue; } - print ("; "); + print (" - ok; "); n++; } @@ -3396,6 +3400,10 @@ fill_vec_av_set (av_set_t av, blist_t bn return false; } + /* Sort the vector. */ + qsort (VEC_address (rhs_t, vec_av_set), VEC_length (rhs_t, vec_av_set), + sizeof (rhs_t), sel_rank_for_schedule); + line_start (); print ("Sorted av set (%d): ", VEC_length (rhs_t, vec_av_set)); Index: gcc/sched-rgn.c =================================================================== --- gcc/sched-rgn.c (revision 131184) +++ gcc/sched-rgn.c (working copy) @@ -2913,7 +2913,7 @@ sched_rgn_init (bool single_blocks_p, bo || !flag_schedule_interblock || is_cfg_nonregular ()) { - find_single_block_region (ebbs_p); + find_single_block_region (SEL_SCHED_P ? true : ebbs_p); } else {