re PR middle-end/55116 (LRA failed to decompose ASHIFT)
authorVladimir Makarov <vmakarov@redhat.com>
Mon, 29 Oct 2012 16:36:57 +0000 (16:36 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Mon, 29 Oct 2012 16:36:57 +0000 (16:36 +0000)
2012-10-29  Vladimir Makarov  <vmakarov@redhat.com>

PR middle-end/55116
* rtlanal.c (strip_address_mutation): Add SUBREG case.

From-SVN: r192949

gcc/ChangeLog
gcc/rtlanal.c

index 1c0b052325bf0ce391ae981b23684c54878fbcce..cf534c63d68b37d32705fb71f90fecd43c32f25a 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-29  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR middle-end/55116
+       * rtlanal.c (strip_address_mutation): Add SUBREG case.
+
 2012-10-29  Jan Hubicka  <jh@suse.cz>
 
        * ipa-inline.c (want_inline_function_called_once_p): Rename to ...
index 399886c1a94a1994721f8bcc6352fefb5a4c216a..bfc58b0e4079874e9dffaf10863e89a52b681604 100644 (file)
@@ -5459,6 +5459,12 @@ strip_address_mutations (rtx *loc, enum rtx_code *outer_code)
       else if (code == AND && CONST_INT_P (XEXP (*loc, 1)))
        /* (and ... (const_int -X)) is used to align to X bytes.  */
        loc = &XEXP (*loc, 0);
+      else if (code == SUBREG
+               && !OBJECT_P (SUBREG_REG (*loc))
+               && subreg_lowpart_p (*loc))
+       /* (subreg (operator ...) ...) inside and is used for mode
+          conversion too.  */
+       loc = &XEXP (*loc, 0);
       else
        return loc;
       if (outer_code)