diff options
author | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-01-29 08:36:38 +0000 |
---|---|---|
committer | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-01-29 08:36:38 +0000 |
commit | 27e4242f6f3a70ffb0c8666aac34a31d1adecc1c (patch) | |
tree | a7eeeda3c5d513c3a360d3bc0e6986901a4f154b /gcc | |
parent | 5be42fa921560bbdaa277e40df5346e650bf72a2 (diff) | |
download | gcc-27e4242f6f3a70ffb0c8666aac34a31d1adecc1c.tar.gz |
* reorg.c (relax_delay_slots): Take account of NOTE_INSN_SWITCH_TEXT_SECTIONS
and targetm.can_follow_jump.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220235 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/reorg.c | 21 |
2 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 67f5f7fb446..38cb9e509ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-01-29 Kaz Kojima <kkojima@gcc.gnu.org> + + PR target/64761 + * reorg.c (switch_text_sections_between_p): New function. + (relax_delay_slots): Call it when testing if the jump insn + is removable. Use targetm.can_follow_jump when testing if + the conditional branch can follow an unconditional jump. + 2015-01-27 Caroline Tice <cmtice@google.com> Committing VTV Cywin/Ming patch for Patrick Wollgast diff --git a/gcc/reorg.c b/gcc/reorg.c index 05b84442f2f..2be34572d99 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -3213,6 +3213,19 @@ label_before_next_insn (rtx x, rtx scan_limit) return insn; } +/* Return TRUE if there is a NOTE_INSN_SWITCH_TEXT_SECTIONS note in between + BEG and END. */ + +static bool +switch_text_sections_between_p (const rtx_insn *beg, const rtx_insn *end) +{ + const rtx_insn *p; + for (p = beg; p != end; p = NEXT_INSN (p)) + if (NOTE_P (p) && NOTE_KIND (p) == NOTE_INSN_SWITCH_TEXT_SECTIONS) + return true; + return false; +} + /* Once we have tried two ways to fill a delay slot, make a pass over the code to try to improve the results and to do such things as more jump @@ -3249,7 +3262,8 @@ relax_delay_slots (rtx_insn *first) target_label = find_end_label (target_label); if (target_label && next_active_insn (target_label) == next - && ! condjump_in_parallel_p (insn)) + && ! condjump_in_parallel_p (insn) + && ! (next && switch_text_sections_between_p (insn, next))) { delete_jump (insn); continue; @@ -3264,12 +3278,13 @@ relax_delay_slots (rtx_insn *first) /* See if this jump conditionally branches around an unconditional jump. If so, invert this jump and point it to the target of the - second jump. */ + second jump. Check if it's possible on the target. */ if (next && simplejump_or_return_p (next) && any_condjump_p (insn) && target_label && next_active_insn (target_label) == next_active_insn (next) - && no_labels_between_p (insn, next)) + && no_labels_between_p (insn, next) + && targetm.can_follow_jump (insn, next)) { rtx label = JUMP_LABEL (next); |