From: Alan Modra Date: Fri, 29 Apr 2016 23:58:17 +0000 (+0930) Subject: ira.c combine_and_move_insns, and ordering of functions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=10e044468a4e0599c4f52ced069d39bbef8bee62;p=gcc.git ira.c combine_and_move_insns, and ordering of functions Notes added by add_store_equivs are not used directly or indirectly by combine_and_move_insns. add_store_equivs can therefore run later without affecting the output of combine_and_move_insns, and thus add_store_equivs need not take into account potentially moved insns. Since not all potentially combined/moved insns are in fact combined or moved, this may allow add_store_equivs to add more REG_EQUIV notes. grow_reg_equivs isn't needed until the reload reg_equivs array is changed. ira.c (combine_and_move_insns): Move invariant conditions.. (ira.c): ..to here. Call combine_and_move_insns before add_store_equivs. Call grow_reg_equivs later. Allocate req_equiv later using max_reg_num() rather than global max_regno. (contains_replace_regs): Delete. (add_store_equivs): Remove contains_replace_regs test. From-SVN: r235659 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47b86f1b079..fca7901e1c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-04-30 Alan Modra + + ira.c (combine_and_move_insns): Move invariant conditions.. + (ira.c): ..to here. Call combine_and_move_insns before + add_store_equivs. Call grow_reg_equivs later. Allocate + req_equiv later using max_reg_num() rather than global max_regno. + (contains_replace_regs): Delete. + (add_store_equivs): Remove contains_replace_regs test. + 2016-04-30 Alan Modra * ira.c (struct equiv_mem_data): New. diff --git a/gcc/ira.c b/gcc/ira.c index 8ef780a3354..91225f6be2c 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -3120,51 +3120,6 @@ equiv_init_movable_p (rtx x, int regno) return 1; } -/* TRUE if X uses any registers for which reg_equiv[REGNO].replace is - true. */ -static int -contains_replace_regs (rtx x) -{ - int i, j; - const char *fmt; - enum rtx_code code = GET_CODE (x); - - switch (code) - { - case CONST: - case LABEL_REF: - case SYMBOL_REF: - CASE_CONST_ANY: - case PC: - case CC0: - case HIGH: - return 0; - - case REG: - return reg_equiv[REGNO (x)].replace; - - default: - break; - } - - fmt = GET_RTX_FORMAT (code); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - switch (fmt[i]) - { - case 'e': - if (contains_replace_regs (XEXP (x, i))) - return 1; - break; - case 'E': - for (j = XVECLEN (x, i) - 1; j >= 0; j--) - if (contains_replace_regs (XVECEXP (x, i, j))) - return 1; - break; - } - - return 0; -} - /* TRUE if X references a memory location that would be affected by a store to MEMREF. */ static int @@ -3634,13 +3589,7 @@ add_store_equivs (void) src = SET_SRC (set); /* Don't add a REG_EQUIV note if the insn already has one. The existing - REG_EQUIV is likely more useful than the one we are adding. - - If one of the regs in the address has reg_equiv[REGNO].replace set, - then we can't add this REG_EQUIV note. The reg_equiv[REGNO].replace - optimization may move the set of this register immediately before - insn, which puts it after reg_equiv[REGNO].init_insns, and hence the - mention in the REG_EQUIV note would be to an uninitialized pseudo. */ + REG_EQUIV is likely more useful than the one we are adding. */ if (MEM_P (dest) && REG_P (src) && (regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER && REG_BASIC_BLOCK (regno) >= NUM_FIXED_BLOCKS @@ -3650,7 +3599,6 @@ add_store_equivs (void) && (init_insn = reg_equiv[regno].init_insns->insn ()) != 0 && bitmap_bit_p (&seen_insns, INSN_UID (init_insn)) && ! find_reg_note (init_insn, REG_EQUIV, NULL_RTX) - && ! contains_replace_regs (XEXP (dest, 0)) && validate_equiv_mem (init_insn, src, dest) && ! memref_used_between_p (dest, init_insn, insn) /* Attaching a REG_EQUIV note will fail if INIT_INSN has @@ -3714,14 +3662,7 @@ combine_and_move_insns (void) rtx equiv_insn; if (! reg_equiv[regno].replace - || reg_equiv[regno].loop_depth < (short) loop_depth - /* There is no sense to move insns if live range - shrinkage or register pressure-sensitive - scheduling were done because it will not - improve allocation but worsen insn schedule - with a big probability. */ - || flag_live_range_shrinkage - || (flag_sched_pressure && flag_schedule_insns)) + || reg_equiv[regno].loop_depth < (short) loop_depth) continue; /* reg_equiv[REGNO].replace gets set only when @@ -5222,20 +5163,27 @@ ira (FILE *f) if (resize_reg_info () && flag_ira_loop_pressure) ira_set_pseudo_classes (true, ira_dump_file); - reg_equiv = XCNEWVEC (struct equivalence, max_regno); - grow_reg_equivs (); init_alias_analysis (); + reg_equiv = XCNEWVEC (struct equivalence, max_reg_num ()); update_equiv_regs (); + + /* Don't move insns if live range shrinkage or register + pressure-sensitive scheduling were done because it will not + improve allocation but likely worsen insn scheduling. */ + if (optimize + && !flag_live_range_shrinkage + && !(flag_sched_pressure && flag_schedule_insns)) + combine_and_move_insns (); + + /* Gather additional equivalences with memory. */ if (optimize) - { - /* Gather additional equivalences with memory. */ - add_store_equivs (); - combine_and_move_insns (); - } + add_store_equivs (); + end_alias_analysis (); free (reg_equiv); setup_reg_equiv (); + grow_reg_equivs (); setup_reg_equiv_init (); allocated_reg_info_size = max_reg_num ();