From: Matthias Klose Date: Tue, 25 Feb 2003 09:22:32 +0000 (+0000) Subject: [multiple changes] X-Git-Tag: releases/gcc-3.2.3~163 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da5217efdc38d85f62e04d86190a1cb7d910960e;p=thirdparty%2Fgcc.git [multiple changes] 2003-02-25 Matthias Klose 2003-02-07 Richard Henderson PR 9226 * gcse.c (local_cprop_find_used_regs): New. (local_cprop_pass): Use it. From-SVN: r63398 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ca6665d171a..2c59dd79a1ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-02-25 Matthias Klose + + 2003-02-07 Richard Henderson + PR 9226 + * gcse.c (local_cprop_find_used_regs): New. + (local_cprop_pass): Use it. + 2003-02-25 Matthias Klose * config.gcc (m68k-*-linux*): Add crtbeginT.o to extra_parts. diff --git a/gcc/gcse.c b/gcc/gcse.c index 8c6b87fbff9e..8150d51c00b6 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -700,6 +700,7 @@ static void store_motion PARAMS ((void)); static void free_insn_expr_list_list PARAMS ((rtx *)); static void clear_modify_mem_tables PARAMS ((void)); static void free_modify_mem_tables PARAMS ((void)); +static void local_cprop_find_used_regs PARAMS ((rtx *, void *)); /* Entry point for global common subexpression elimination. F is the first instruction in the function. */ @@ -4165,13 +4166,13 @@ cprop_insn (bb, insn, alter_jumps) return 0; reg_use_count = 0; - note_uses (&PATTERN (insn), find_used_regs, NULL); + note_uses (&PATTERN (insn), local_cprop_find_used_regs, NULL); note = find_reg_equal_equiv_note (insn); /* We may win even when propagating constants into notes. */ if (note) - find_used_regs (&XEXP (note, 0), NULL); + local_cprop_find_used_regs (&XEXP (note, 0), NULL); for (reg_used = ®_use_table[0]; reg_use_count > 0; reg_used++, reg_use_count--) @@ -4281,6 +4282,54 @@ cprop_insn (bb, insn, alter_jumps) return changed; } +/* Like find_used_regs, but avoid recording uses that appear in + input-output contexts such as zero_extract or pre_dec. This + restricts the cases we consider to those for which local cprop + can legitimately make replacements. */ + +static void +local_cprop_find_used_regs (xptr, data) + rtx *xptr; + void *data; +{ + rtx x = *xptr; + + if (x == 0) + return; + + switch (GET_CODE (x)) + { + case ZERO_EXTRACT: + case SIGN_EXTRACT: + case STRICT_LOW_PART: + return; + + case PRE_DEC: + case PRE_INC: + case POST_DEC: + case POST_INC: + case PRE_MODIFY: + case POST_MODIFY: + /* Can only legitimately appear this early in the context of + stack pushes for function arguments, but handle all of the + codes nonetheless. */ + return; + + case SUBREG: + /* Setting a subreg of a register larger than word_mode leaves + the non-written words unchanged. */ + if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD) + return; + break; + + default: + break; + } + + find_used_regs (xptr, data); +} + + /* Forward propagate copies. This includes copies and constants. Return non-zero if a change was made. */