[PATCH] More conservative reg-stack push/pop sp modification fix (PR target/79430)
Richard Biener
rguenther@suse.de
Thu Apr 27 09:22:00 GMT 2017
On Thu, 27 Apr 2017, Jakub Jelinek wrote:
> Hi!
>
> As the patch I've just posted is probably too dangerous for 7.1, here
> is a more localized version of the fix, which doesn't change reg_set_p/
> modified_in_p/modified_between_p etc. behavior that is used in many spots,
> but just changes emit_swap_insn that has seen that problem (this code in
> emit_swap_insn is new in 7, so it is a P1 wrong-code regression).
>
> What the patch does is instead of relying on modified_between_p to catch
> this it checks whether i1src is sp based and if it is, checks the insns
> while skipping over them whether they are push/pop (autoinc of sp) and
> if so, punts.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for 7.1?
Looks good to me.
Thanks,
Richard.
> 2017-04-27 Jakub Jelinek <jakub@redhat.com>
>
> PR target/79430
> * reg-stack.c (emit_swap_insn): If i1src mentions the stack pointer,
> punt if tmp contains autoinc of stack pointer.
>
> --- gcc/reg-stack.c.jj 2017-04-26 10:13:49.000000000 +0200
> +++ gcc/reg-stack.c 2017-04-26 13:13:19.487471078 +0200
> @@ -915,6 +915,7 @@ emit_swap_insn (rtx_insn *insn, stack_pt
> rtx i2set;
> rtx_insn *tmp = PREV_INSN (i1);
> rtx_insn *limit = PREV_INSN (BB_HEAD (current_block));
> + bool sp_used = reg_overlap_mentioned_p (stack_pointer_rtx, i1src);
> /* Find the previous insn involving stack regs, but don't pass a
> block boundary. */
> while (tmp != limit)
> @@ -928,6 +929,31 @@ emit_swap_insn (rtx_insn *insn, stack_pt
> i2 = tmp;
> break;
> }
> + /* FIXME: modified_between_p does not consider autoinc
> + modifications of stack pointer if i1src refers to
> + stack pointer, check it here manually. */
> + if (sp_used && NONDEBUG_INSN_P (tmp))
> + {
> + subrtx_var_iterator::array_type array;
> + FOR_EACH_SUBRTX_VAR (iter, array, PATTERN (tmp), NONCONST)
> + {
> + rtx mem = *iter;
> + if (mem
> + && MEM_P (mem)
> + && (GET_RTX_CLASS (GET_CODE (XEXP (mem, 0)))
> + == RTX_AUTOINC))
> + {
> + if (XEXP (XEXP (mem, 0), 0) == stack_pointer_rtx)
> + {
> + i2 = tmp;
> + break;
> + }
> + iter.skip_subrtxes ();
> + }
> + }
> + if (i2)
> + break;
> + }
> tmp = PREV_INSN (tmp);
> }
> if (i2 != NULL_RTX
>
More information about the Gcc-patches
mailing list