aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOleg Endo <olegendo@gcc.gnu.org>2015-01-13 00:30:57 +0000
committerOleg Endo <olegendo@gcc.gnu.org>2015-01-13 00:30:57 +0000
commitd9a5f0cc4f16f711ef503be185988b4eb1d230e6 (patch)
treee94fe6500501ca7a4703a2d5d695e65e75a4cc89 /gcc
parentca46eab70b12b0c4a81e6ed0a0fa20d54e943387 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/rtlanal.c13
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;
}