http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50099
--- Comment #7 from Michael Hope <michael.hope at linaro dot org> 2011-09-05 00:05:23 UTC --- arm_legitimate_index_p() seems to be wrong. Near the end it has: /* For ARM v4 we may be doing a sign-extend operation during the load. */ if (arm_arch4) { if (mode == HImode || mode == HFmode || (outer == SIGN_EXTEND && mode == QImode)) range = 256; else range = 4096; } else range = (mode == HImode || mode == HFmode) ? 4095 : 4096; The final 4096 range is incorrect for ARM mode sign extends. The arm_arch4 path looks good.