PR rtl-optimization/31455
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2007 15:06:19 +0000 (15:06 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jun 2007 15:06:19 +0000 (15:06 +0000)
* lower-subreg.c (find_decomposable_subregs): Don't decompose
subregs which have a cast between modes which are not tieable.

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

gcc/ChangeLog
gcc/lower-subreg.c

index c1ee9fb..ece60c7 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-01  Ian Lance Taylor  <iant@google.com>
+
+       PR rtl-optimization/31455
+       * lower-subreg.c (find_decomposable_subregs): Don't decompose
+       subregs which have a cast between modes which are not tieable.
+
 2007-06-01  Uros Bizjak  <ubizjak@gmail.com>
 
        * expr.c (force_operand) [DIV, MOD, UDIV, UMOD, ASHIFTRT]: Remove
index ac29272..0b50a88 100644 (file)
@@ -281,6 +281,18 @@ find_decomposable_subregs (rtx *px, void *data)
          bitmap_set_bit (decomposable_context, regno);
          return -1;
        }
+
+      /* If this is a cast from one mode to another, where the modes
+        have the same size, and they are not tieable, then mark this
+        register as non-decomposable.  If we decompose it we are
+        likely to mess up whatever the backend is trying to do.  */
+      if (outer_words > 1
+         && outer_size == inner_size
+         && !MODES_TIEABLE_P (GET_MODE (x), GET_MODE (inner)))
+       {
+         bitmap_set_bit (non_decomposable_context, regno);
+         return -1;
+       }
     }
   else if (REG_P (x))
     {