This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: patch to fix PR55116


H.J. in

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55116

reported an interesting address

(and:DI (subreg:DI (plus:SI (ashift:SI (reg:SI 96 [ glob_vol_int.22 ])
(const_int 2 [0x2]))
(symbol_ref:SI ("glob_vol_int_arr") <var_decl 0x7ffff03c2720 glob_vol_int_arr>)) 0)
(const_int 4294967295 [0xffffffff]))


which can not be correctly extracted. Here `and' with `subreg' behaves as an address mutation.

The following patch fixes the problem.

Ok to commit, Richard?

2012-10-29 Vladimir Makarov <vmakarov@redhat.com>

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



Index: rtlanal.c
===================================================================
--- rtlanal.c   (revision 192942)
+++ rtlanal.c   (working copy)
@@ -5459,6 +5459,11 @@ strip_address_mutations (rtx *loc, enum
       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
+              && ! REG_P (XEXP (*loc, 0)) && ! MEM_P (XEXP (*loc, 0)))
+       /* (subreg (operator ...) ...) usually inside and is used for
+          mode conversion too.  */
+       loc = &XEXP (*loc, 0);
       else
        return loc;
       if (outer_code)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]