OSDN Git Service

PR middle-end/30751
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Feb 2007 22:18:26 +0000 (22:18 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Feb 2007 22:18:26 +0000 (22:18 +0000)
* lower-subreg.c (resolve_simple_move): Decompose subregs in
addresses.

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

gcc/ChangeLog
gcc/lower-subreg.c

index a4bd60e..d504109 100644 (file)
@@ -1,3 +1,9 @@
+2007-02-13  Ian Lance Taylor  <iant@google.com>
+
+       PR middle-end/30751
+       * lower-subreg.c (resolve_simple_move): Decompose subregs in
+       addresses.
+
 2007-02-13  Stuart Hastings  <stuart@apple.com>
 
        * gcc/config/i386/i386.md (fixuns_truncdfhi2): Require SSE2.
 2007-02-13  Stuart Hastings  <stuart@apple.com>
 
        * gcc/config/i386/i386.md (fixuns_truncdfhi2): Require SSE2.
index fbb506c..908b10e 100644 (file)
@@ -501,7 +501,7 @@ resolve_subreg_use (rtx *px, void *data)
         that the note must be removed.  */
       if (!x)
        {
         that the note must be removed.  */
       if (!x)
        {
-         gcc_assert(!insn);
+         gcc_assert (!insn);
          return 1;
        }
 
          return 1;
        }
 
@@ -711,6 +711,23 @@ resolve_simple_move (rtx set, rtx insn)
       return insn;
     }
 
       return insn;
     }
 
+  /* It's possible for the code to use a subreg of a decomposed
+     register while forming an address.  We need to handle that before
+     passing the address to emit_move_insn.  We pass NULL_RTX as the
+     insn parameter to resolve_subreg_use because we can not validate
+     the insn yet.  */
+  if (MEM_P (src) || MEM_P (dest))
+    {
+      int acg;
+
+      if (MEM_P (src))
+       for_each_rtx (&XEXP (src, 0), resolve_subreg_use, NULL_RTX);
+      if (MEM_P (dest))
+       for_each_rtx (&XEXP (dest, 0), resolve_subreg_use, NULL_RTX);
+      acg = apply_change_group ();
+      gcc_assert (acg);
+    }
+
   /* If SRC is a register which we can't decompose, or has side
      effects, we need to move via a temporary register.  */
 
   /* If SRC is a register which we can't decompose, or has side
      effects, we need to move via a temporary register.  */