OSDN Git Service

PR rtl-optimization/27538
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 May 2006 16:07:12 +0000 (16:07 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 May 2006 16:07:12 +0000 (16:07 +0000)
* combine.c (expand_compound_operation): Call gen_lowpart
before calling simplify_shift_const.

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

gcc/ChangeLog
gcc/combine.c

index 1c6df66..c5ed8fc 100644 (file)
@@ -1,5 +1,11 @@
 2006-05-14  Roger Sayle  <roger@eyesopen.com>
 
+       PR rtl-optimization/27538
+       * combine.c (expand_compound_operation): Call gen_lowpart
+       before calling simplify_shift_const.
+
+2006-05-14  Roger Sayle  <roger@eyesopen.com>
+
        PR rtl-optimization/22563
        * expmed.c (store_fixed_bit_field): When using AND and IOR to store
        a fixed width bitfield, always force the intermediates into psuedos.
index ed9c497..33512ec 100644 (file)
@@ -5736,14 +5736,16 @@ expand_compound_operation (rtx x)
 
   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
   if (modewidth + len >= pos)
-    tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
-                               GET_MODE (x),
-                               simplify_shift_const (NULL_RTX, ASHIFT,
-                                                     GET_MODE (x),
-                                                     XEXP (x, 0),
-                                                     modewidth - pos - len),
-                               modewidth - len);
-
+    {
+      enum machine_mode mode = GET_MODE (x);
+      tem = gen_lowpart (mode, XEXP (x, 0));
+      if (!tem || GET_CODE (tem) == CLOBBER)
+       return x;
+      tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
+                                 tem, modewidth - pos - len);
+      tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
+                                 mode, tem, modewidth - len);
+    }
   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
                                  simplify_shift_const (NULL_RTX, LSHIFTRT,