https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79514

--- Comment #10 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Jakub Jelinek from comment #9)
> Created attachment 40868 [details]
> gcc7-pr79514.patch
> 
> You mean like this?  That certainly works for x86, but I'm afraid it is
> going to break or penalize various other arches.
> The thing is, HAVE_PRE_MODIFY_DISP is set to 1 only on 5 targets, but quick
> grep reveals that there are many more targets that somehow handle pre_modify
> or have insn patterns using that.  This is not unlike HAVE_PRE_DEC and
> similar, x86 also doesn't claim it has HAVE_PRE_DEC, yet it uses it for
> pushes.
> So I think pushxf1 expander in i386.md is the way to go.

Years ago, I defined HAVE_PRE_DEC, and I was told that it is intended for
targets that can increment pointer on *any* memory access, not just on stack
pointer. So, x86 uses PRE_DEC and POST_INC only to abstract push and pop insn.
Various parts of the compiler (modulo auto-inc-dec.c) mostly check for PRE_DEC
and POST_INC to skip further optimizations, which is non-issue for push and
pop.

But this generic part of the code assumes that any target can handle
PRE_MODIFY, and emits insn even for !HAVE_PRE_MODIFY_DISP. This is
conservatively incorrect, so conditionally disabling the part that blindly
emits PRE_MODIFY is IMO the way to go.

Maybe this issue should be discussed on the ML.

BTW:

-      dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                               gen_int_mode (offset, Pmode));
+      if (offset)
+       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
+                                 gen_int_mode (offset, Pmode));
+      else
+       dest_addr = stack_pointer_rtx;

plus_constant?

Reply via email to