http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55116
--- Comment #9 from H.J. Lu <hjl.tools at gmail dot com> 2012-10-30 01:36:26 UTC --- This helps: diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 43d4cb8..d076ad6 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -5460,6 +5460,7 @@ strip_address_mutations (rtx *loc, enum rtx_code *outer_code) /* (and ... (const_int -X)) is used to align to X bytes. */ loc = &XEXP (*loc, 0); else if (code == SUBREG + && GET_MODE (*loc) == Pmode && !OBJECT_P (SUBREG_REG (*loc)) && subreg_lowpart_p (*loc)) /* (subreg (operator ...) ...) inside and is used for mode