This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[3.2] apply patch to bootstrap gcc-3.2 on m68k-linux with itself


This patch is needed for m68k-linux to sucessfully bootstrap with
gcc-3.2 as a stage1 compiler.

2003-02-07  Richard Henderson  <rth at redhat dot com>

	PR 9226
	* gcse.c (local_cprop_find_used_regs): New.
	(local_cprop_pass): Use it.

--- gcc/gcse.c	2003-02-11 03:43:27.000000000 -0800
+++ gcc/gcse.c	2003-02-11 03:47:23.000000000 -0800
@@ -700,6 +700,7 @@
 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 @@
     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 = &reg_use_table[0]; reg_use_count > 0;
        reg_used++, reg_use_count--)
@@ -4281,6 +4282,54 @@
   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.  */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]