diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-05-01 11:50:59 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-05-01 11:50:59 +0200 |
commit | 30776a1468d25d156c02b2484d5ad7578f829d2e (patch) | |
tree | 8b474243cad264fb5c3c25797a360bfb208f12b8 /gcc/rtlanal.c | |
parent | f16b9dc289af11bc64e8ae27a6723f2f82ca2cc5 (diff) | |
download | gcc-30776a1468d25d156c02b2484d5ad7578f829d2e.zip gcc-30776a1468d25d156c02b2484d5ad7578f829d2e.tar.gz gcc-30776a1468d25d156c02b2484d5ad7578f829d2e.tar.bz2 |
re PR target/79430 (action of statement incorrectly optimised away)
PR target/79430
* rtlanal.c (reg_set_p): If reg is a stack_pointer_rtx, also
check for stack push/pop autoinc.
* config/i386/i386.c (ix86_agi_dependent): Return false
if the only reason why modified_in_p returned true is that
addr is SP based and set_insn is a push or pop.
From-SVN: r247429
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index acb4230..321363f 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -1221,6 +1221,24 @@ reg_set_p (const_rtx reg, const_rtx insn) || find_reg_fusage (insn, CLOBBER, reg))))) return true; + /* There are no REG_INC notes for SP autoinc. */ + if (reg == stack_pointer_rtx && INSN_P (insn)) + { + subrtx_var_iterator::array_type array; + FOR_EACH_SUBRTX_VAR (iter, array, PATTERN (insn), 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) + return true; + iter.skip_subrtxes (); + } + } + } + return set_of (reg, insn) != NULL_RTX; } |