diff options
author | Oleg Endo <olegendo@gcc.gnu.org> | 2015-01-13 00:30:57 +0000 |
---|---|---|
committer | Oleg Endo <olegendo@gcc.gnu.org> | 2015-01-13 00:30:57 +0000 |
commit | d9a5f0cc4f16f711ef503be185988b4eb1d230e6 (patch) | |
tree | e94fe6500501ca7a4703a2d5d695e65e75a4cc89 /gcc | |
parent | ca46eab70b12b0c4a81e6ed0a0fa20d54e943387 (diff) | |
download | gcc-d9a5f0cc4f16f711ef503be185988b4eb1d230e6.zip gcc-d9a5f0cc4f16f711ef503be185988b4eb1d230e6.tar.gz gcc-d9a5f0cc4f16f711ef503be185988b4eb1d230e6.tar.bz2 |
re PR target/64479 ([SH] wrong optimization delayed-branch)
gcc/
PR target/64479
* rtlanal.c (set_reg_p): Handle SEQUENCE constructs.
From-SVN: r219506
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/rtlanal.c | 13 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 89e22ea..8b86f54 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-01-13 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/64479 + * rtlanal.c (set_reg_p): Handle SEQUENCE constructs. + 2015-01-12 Kaz Kojima <kkojima@gcc.gnu.org> * config/sh/sh.c (sh_atomic_assign_expand_fenv): New function. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index a63bd40..4aadac2 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -1000,6 +1000,17 @@ reg_set_between_p (const_rtx reg, const rtx_insn *from_insn, int reg_set_p (const_rtx reg, const_rtx insn) { + /* After delay slot handling, call and branch insns might be in a + sequence. Check all the elements there. */ + if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE) + { + for (int i = 0; i < XVECLEN (PATTERN (insn), 0); ++i) + if (reg_set_p (reg, XVECEXP (PATTERN (insn), 0, i))) + return true; + + return false; + } + /* We can be passed an insn or part of one. If we are passed an insn, check if a side-effect of the insn clobbers REG. */ if (INSN_P (insn) @@ -1011,7 +1022,7 @@ reg_set_p (const_rtx reg, const_rtx insn) GET_MODE (reg), REGNO (reg))) || MEM_P (reg) || find_reg_fusage (insn, CLOBBER, reg))))) - return 1; + return true; return set_of (reg, insn) != NULL_RTX; } |