2003-03-20 Daniel Berlin <dberlin@dberlin.org>
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 Mar 2003 23:02:54 +0000 (23:02 +0000)
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 Mar 2003 23:02:54 +0000 (23:02 +0000)
Merge changes from new-regalloc-branch

From Michael Matz  <matz@suse.de>
* df.c (df_ref_record_1): Move init of loc to safe point.
Only recurse on interesting things in parallels.
Handle CLASS_CANNOT_CHANGE_MODE smarter.
(df_uses_record): Ditto.

* df.h (DF_REF_MEM_OK): New enum member, used to mark ref's which
it's already okay to use memory operands in (IE doesn't require
adding another insn or anything).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64629 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/df.c
gcc/df.h

index ce5f6b8..5584548 100644 (file)
@@ -1,3 +1,16 @@
+2003-03-20  Daniel Berlin  <dberlin@dberlin.org>
+       Merge changes from new-regalloc-branch 
+
+       From Michael Matz  <matz@suse.de>
+       * df.c (df_ref_record_1): Move init of loc to safe point.
+       Only recurse on interesting things in parallels.
+       Handle CLASS_CANNOT_CHANGE_MODE smarter.
+       (df_uses_record): Ditto.
+       
+       * df.h (DF_REF_MEM_OK): New enum member, used to mark ref's which
+       it's already okay to use memory operands in (IE doesn't require
+       adding another insn or anything).
+
 2003-03-20  Richard Henderson  <rth@redhat.com>
 
        PR middle-end/6348
index 4c95985..23a7ce0 100644 (file)
--- a/gcc/df.c
+++ b/gcc/df.c
@@ -906,10 +906,18 @@ df_def_record_1 (df, x, bb, insn)
      basic_block bb;
      rtx insn;
 {
-  rtx *loc = &SET_DEST (x);
-  rtx dst = *loc;
+  rtx *loc;
+  rtx dst;
   enum df_ref_flags flags = 0;
 
+ /* We may recursivly call ourselves on EXPR_LIST when dealing with PARALLEL
+     construct.  */  
+  if (GET_CODE (x) == EXPR_LIST || GET_CODE (x) == CLOBBER)
+    loc = &XEXP (x, 0);
+  else
+    loc = &SET_DEST (x);
+  dst = *loc;
+
   /* Some targets place small structures in registers for
      return values of functions.  */
   if (GET_CODE (dst) == PARALLEL && GET_MODE (dst) == BLKmode)
@@ -917,12 +925,19 @@ df_def_record_1 (df, x, bb, insn)
       int i;
 
       for (i = XVECLEN (dst, 0) - 1; i >= 0; i--)
-       df_def_record_1 (df, XVECEXP (dst, 0, i), bb, insn);
+       {
+         rtx temp = XVECEXP (dst, 0, i);
+         if (GET_CODE (temp) == EXPR_LIST || GET_CODE (temp) == CLOBBER
+             || GET_CODE (temp) == SET)
+           df_def_record_1 (df, temp, bb, insn);
+       }
       return;
     }
 
 #ifdef CLASS_CANNOT_CHANGE_MODE
-  if (GET_CODE (dst) == SUBREG)
+  if (GET_CODE (dst) == SUBREG
+      && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
+                                    GET_MODE (SUBREG_REG (dst))))
     flags |= DF_REF_MODE_CHANGE;
 #endif
 
@@ -942,7 +957,9 @@ df_def_record_1 (df, x, bb, insn)
          dst = *loc;
        }
 #ifdef CLASS_CANNOT_CHANGE_MODE
-      if (GET_CODE (dst) == SUBREG)
+      if (GET_CODE (dst) == SUBREG
+         && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
+                                        GET_MODE (SUBREG_REG (dst))))
         flags |= DF_REF_MODE_CHANGE;
 #endif
       loc = &XEXP (dst, 0);
@@ -1042,6 +1059,8 @@ df_uses_record (df, loc, ref_type, bb, insn, flags)
          return;
        }
 #ifdef CLASS_CANNOT_CHANGE_MODE
+      if (CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (x),
+                                     GET_MODE (SUBREG_REG (x))))
       flags |= DF_REF_MODE_CHANGE;
 #endif
 
@@ -1067,6 +1086,8 @@ df_uses_record (df, loc, ref_type, bb, insn, flags)
                {
                  use_flags = DF_REF_READ_WRITE;
 #ifdef CLASS_CANNOT_CHANGE_MODE
+                 if (CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
+                                                 GET_MODE (SUBREG_REG (dst))))
                  use_flags |= DF_REF_MODE_CHANGE;
 #endif
                  df_uses_record (df, &SUBREG_REG (dst), DF_REF_REG_USE, bb,
@@ -1091,6 +1112,8 @@ df_uses_record (df, loc, ref_type, bb, insn, flags)
                abort ();
              use_flags = DF_REF_READ_WRITE;
 #ifdef CLASS_CANNOT_CHANGE_MODE
+             if (CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
+                                             GET_MODE (SUBREG_REG (dst))))
              use_flags |= DF_REF_MODE_CHANGE;
 #endif
              df_uses_record (df, &SUBREG_REG (dst), DF_REF_REG_USE, bb,
@@ -2142,6 +2165,7 @@ df_analyse_1 (df, blocks, flags, update)
     {
       df_reg_info_compute (df, df->all_blocks);
     }
+  
   free (df->dfs_order);
   free (df->rc_order);
   free (df->rts_order);
index 2191ab5..fa8aab4 100644 (file)
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -63,7 +63,12 @@ enum df_ref_flags
     /* This flag is set, if we stripped the subreg from the reference.
        In this case we must make conservative guesses, at what the
        outer mode was.  */
-    DF_REF_STRIPPED = 4
+    DF_REF_STRIPPED = 4,
+
+    /* This flag is set during register allocation if it's okay for
+    the reference's INSN to have one of its operands replaced with a
+    memory reference.  */
+    DF_REF_MEM_OK = 8
   };