aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-05-01 11:50:59 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-05-01 11:50:59 +0200
commit30776a1468d25d156c02b2484d5ad7578f829d2e (patch)
tree8b474243cad264fb5c3c25797a360bfb208f12b8 /gcc/rtlanal.c
parentf16b9dc289af11bc64e8ae27a6723f2f82ca2cc5 (diff)
downloadgcc-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.c18
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;
}