diff options
author | kan <kan@FreeBSD.org> | 2006-08-26 21:29:10 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2006-08-26 21:29:10 +0000 |
commit | ab6c6e434e4ca0bf593007d49dee6eceb73286c0 (patch) | |
tree | 843ffc6140f66bf60562adb1bf8d3d82b9739b5e /contrib/gcc/sched-rgn.c | |
parent | 8a6911d2bb988a943624cbf4e4041b827d9ade53 (diff) | |
download | FreeBSD-src-ab6c6e434e4ca0bf593007d49dee6eceb73286c0.zip FreeBSD-src-ab6c6e434e4ca0bf593007d49dee6eceb73286c0.tar.gz |
Gcc 3.4.6 as of 2006/08/25 #116475.
Diffstat (limited to 'contrib/gcc/sched-rgn.c')
-rw-r--r-- | contrib/gcc/sched-rgn.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/contrib/gcc/sched-rgn.c b/contrib/gcc/sched-rgn.c index b8e474d..7107445 100644 --- a/contrib/gcc/sched-rgn.c +++ b/contrib/gcc/sched-rgn.c @@ -2078,6 +2078,42 @@ add_branch_dependences (rtx head, rtx tail) insn = PREV_INSN (insn); } +#ifdef HAVE_cc0 + /* There may be other cc0 setters earlier on in this block. + Look for them and include them in the set not to be disturbed. */ + if (insn != head && last != NULL_RTX) + { + rtx earlier_cc0_setter = NULL_RTX; + + for (insn = last; insn != NULL_RTX && insn != head;) + { + insn = prev_nonnote_insn (insn); + if (sets_cc0_p (insn)) + earlier_cc0_setter = insn; + } + + if (earlier_cc0_setter != NULL_RTX) + { + insn = last; + do + { + insn = prev_nonnote_insn (insn); + + if (last != 0 && ! find_insn_list (insn, LOG_LINKS (last))) + { + add_dependence (last, insn, REG_DEP_ANTI); + INSN_REF_COUNT (insn)++; + } + + CANT_MOVE (insn) = 1; + + last = insn; + } + while (insn != earlier_cc0_setter); + } + } +#endif + /* Make sure these insns are scheduled last in their block. */ insn = last; if (insn != 0) |