https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67305
--- Comment #7 from Jiong Wang <jiwang at gcc dot gnu.org> --- (In reply to Segher Boessenkool from comment #6) > The predicate here is "neon_permissive_struct_operand", and indeed > it is _very_ permissive ;-) > > This goes through neon_vector_mem_operand(op, 2, false) which immediately > says "ok!" because there is a frame pointer buried somewhere deep in > that huge expression. It looks like the "return !strict;" should read > "if (strict) return false;". agree. these blocks of code looks wrong to me. my understanding is virtual register elimination may cause the const_offset changed from out of range to within range, so we normally allow any const_offset if it's used with elim register like (plus elim_reg, const_offset) if strict_p == false. so here we should only allow eliminable registers if it's used together with a constant to form something like (plus elim_reg, const_offset), while we are allowing any rtx format when strict_p == false. And Richard, what's your opinion on the "right shift" back to "signed divide" issue at tree level?