* combine.c (make_compound_operation): Simplify (subreg (*_extend) 0).
authorRichard Henderson <rth@cygnus.com>
Thu, 26 Mar 1998 00:20:08 +0000 (16:20 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 26 Mar 1998 00:20:08 +0000 (16:20 -0800)
From-SVN: r18836

gcc/ChangeLog
gcc/combine.c

index dddc848..028e157 100644 (file)
@@ -1,3 +1,7 @@
+Thu Mar 26 00:19:47 1998  Richard Henderson  <rth@cygnus.com>
+
+       * combine.c (make_compound_operation): Simplify (subreg (*_extend) 0).
+
 Wed Mar 25 23:53:11 1998  Jeffrey A Law  (law@cygnus.com)
 
        * pa.c (pa_adjust_cost): Avoid redundant calls to get_attr_type.
index 8cb32dc..4bef563 100644 (file)
@@ -6038,6 +6038,23 @@ make_compound_operation (x, in_code)
 
          return newer;
        }
+
+      /* If this is a paradoxical subreg, and the new code is a sign or
+        zero extension, omit the subreg and widen the extension.  If it
+        is a regular subreg, we can still get rid of the subreg by not
+        widening so much, or in fact removing the extension entirely.  */
+      if ((GET_CODE (tem) == SIGN_EXTEND
+          || GET_CODE (tem) == ZERO_EXTEND)
+         && subreg_lowpart_p (x))
+       {
+         if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
+             || (GET_MODE_SIZE (mode) >
+                 GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
+           tem = gen_rtx_combine (GET_CODE (tem), mode, XEXP (tem, 0));
+         else
+           tem = gen_lowpart_for_combine (mode, XEXP (tem, 0));
+         return tem;
+       }
       break;
       
     default: