OSDN Git Service

gcc/cp/
[pf3gnuchains/gcc-fork.git] / gcc / auto-inc-dec.c
index 2415662..18c1b71 100644 (file)
@@ -1,12 +1,12 @@
 /* Discovery of auto-inc and auto-dec instructions.
-   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
    Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
    
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
@@ -90,7 +89,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
        HAVE_PRE_INCREMENT, HAVE_POST_INCREMENT, HAVE_PRE_DECREMENT or
        HAVE_POST_DECREMENT defined.
 
-    2) c is a contant not equal to the width of the value being accessed
+    2) c is a constant not equal to the width of the value being accessed
        by the pointer.  This is useful for machines that have
        HAVE_PRE_MODIFY_DISP, HAVE_POST_MODIFY_DISP defined.
 
@@ -445,7 +444,7 @@ static rtx *reg_next_def = NULL;
 /* Move dead note that match PATTERN to TO_INSN from FROM_INSN.  We do
    not really care about moving any other notes from the inc or add
    insn.  Moving the REG_EQUAL and REG_EQUIV is clearly wrong and it
-   does not appear that there are any other kinds of relavant notes.  */
+   does not appear that there are any other kinds of relevant notes.  */
 
 static void 
 move_dead_notes (rtx to_insn, rtx from_insn, rtx pattern)
@@ -551,7 +550,10 @@ attempt_change (rtx new_addr, rtx inc_reg)
   switch (inc_insn.form)
     {
     case FORM_PRE_ADD:
-      mov_insn = insert_move_insn_before (mem_insn.insn, 
+      /* Replace the addition with a move.  Do it at the location of
+        the addition since the operand of the addition may change
+        before the memory reference.  */
+      mov_insn = insert_move_insn_before (inc_insn.insn, 
                                          inc_insn.reg_res, inc_insn.reg0);
       move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0);
 
@@ -634,7 +636,7 @@ attempt_change (rtx new_addr, rtx inc_reg)
 
 /* Try to combine the instruction in INC_INSN with the instruction in
    MEM_INSN.  First the form is determined using the DECISION_TABLE
-   and and the results of parsing the INC_INSN and the MEM_INSN.
+   and the results of parsing the INC_INSN and the MEM_INSN.
    Assuming the form is ok, a prototype new address is built which is
    passed to ATTEMPT_CHANGE for final processing.  */
 
@@ -674,7 +676,7 @@ try_merge (void)
     }
 
   /* Look to see if the inc register is dead after the memory
-     reference.  If it is do not do the combination.  */
+     reference.  If it is, do not do the combination.  */
   if (find_regno_note (last_insn, REG_DEAD, REGNO (inc_reg)))
     {
       if (dump_file)
@@ -1195,7 +1197,7 @@ find_inc (bool first_try)
                    return false;
                }
 
-             /* Need to check that there are no assignemnts to b
+             /* Need to check that there are no assignments to b
                 before the add insn.  */
              other_insn 
                = get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_def);
@@ -1276,7 +1278,7 @@ find_inc (bool first_try)
         next add or inc, not the next insn that used the
         reg.  Because we are going to increment the reg
         in this form, we need to make sure that there
-        were no interveining uses of reg.  */
+        were no intervening uses of reg.  */
       if (inc_insn.insn != other_insn)
        return false;
     }
@@ -1538,8 +1540,10 @@ gate_auto_inc_dec (void)
 }
 
 
-struct tree_opt_pass pass_inc_dec =
+struct rtl_opt_pass pass_inc_dec =
 {
+ {
+  RTL_PASS,
   "auto-inc-dec",                       /* name */
   gate_auto_inc_dec,                    /* gate */
   rest_of_handle_auto_inc_dec,          /* execute */
@@ -1553,6 +1557,6 @@ struct tree_opt_pass pass_inc_dec =
   0,                                    /* todo_flags_start */
   TODO_dump_func | 
   TODO_df_finish,                       /* todo_flags_finish */
-  0                                     /* letter */
+ }
 };