+2003-02-25 Matthias Klose <doko@debian.org>
+
+ 2003-02-07 Richard Henderson <rth@redhat.com>
+ PR 9226
+ * gcse.c (local_cprop_find_used_regs): New.
+ (local_cprop_pass): Use it.
+
2003-02-25 Matthias Klose <doko@debian.org>
* config.gcc (m68k-*-linux*): Add crtbeginT.o to extra_parts.
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 *));
\f
/* Entry point for global common subexpression elimination.
F is the first instruction in the function. */
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--)
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. */