As discussed at the bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67305 neon_vector_mem_operand is broken. As the comments says "/* Reject eliminable registers. */", the code block at the head of this function which checks eliminable registers is designed to do early reject only, there shouldn't be any early accept. If this code hunk doesn't reject the incoming rtx, then the rtx pattern should still go through all default checks below. All other similar functions, thumb1_legitimate_address_p, arm_coproc_mem_operand, neon_struct_mem_operand etc are exactly follow this check flow. So as Jim Wilson commented on the bugzilla, instead of "return !strict", we need to only do the check if strict be true, and only does rejection which means return FALSE, for all other cases, we need to go through those normal checks below. neon_vector_mem_operand is only used by several misalign pattern, I guess that's why this bug is not exposed for long time. boostrap & regression OK on armv8 aarch32, ok for trunk? 2015-11-04 Jiong Wang Jim Wilson gcc/ PR target/67305 * config/arm/arm.md (neon_vector_mem_operand): Return FALSE if strict be true and eliminable registers mentioned.