diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-07 17:17:07 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-07 17:17:07 +0000 |
commit | 14e08599fc071226b123c0da28e7dfe9dd931c73 (patch) | |
tree | bf69301266f96ab07cb8e81f040fa1c0f1d8b4cc /gcc/reorg.c | |
parent | af7760503767f92778c0ff857a0ff50437888996 (diff) | |
download | gcc-14e08599fc071226b123c0da28e7dfe9dd931c73.tar.gz |
* rtl.h (update_alignments): Declare.
* final.c (grow_label_align): New function extracted from...
(shorten_branches): ...here. Call it.
(update_alignments): New function.
* reorg.c (sibling_labels): New variable.
(get_label_before): Add SIBLING parameter. If it is non-zero, push
the new label along with it onto the sibling_labels vector.
(fill_simple_delay_slots): Adjust call to get_label_before.
(fill_slots_from_thread): Likewise.
(relax_delay_slots): Likewise.
(make_return_insns): Likewise.
(dbr_schedule): Invoke update_alignment on the sibling_labels vector.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201575 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reorg.c')
-rw-r--r-- | gcc/reorg.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/gcc/reorg.c b/gcc/reorg.c index 78804088a43..d39cc7d8a4a 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -1856,10 +1856,15 @@ update_reg_unused_notes (rtx insn, rtx redundant_insn) } } -/* Return the label before INSN, or put a new label there. */ +static vec <rtx> sibling_labels; + +/* Return the label before INSN, or put a new label there. If SIBLING is + non-zero, it is another label associated with the new label (if any), + typically the former target of the jump that will be redirected to + the new label. */ static rtx -get_label_before (rtx insn) +get_label_before (rtx insn, rtx sibling) { rtx label; @@ -1874,6 +1879,11 @@ get_label_before (rtx insn) label = gen_label_rtx (); emit_label_after (label, prev); LABEL_NUSES (label) = 0; + if (sibling) + { + sibling_labels.safe_push (label); + sibling_labels.safe_push (sibling); + } } return label; } @@ -2219,7 +2229,7 @@ fill_simple_delay_slots (int non_jumps_p) rtx new_label = next_real_insn (next_trial); if (new_label != 0) - new_label = get_label_before (new_label); + new_label = get_label_before (new_label, JUMP_LABEL (trial)); else new_label = find_end_label (simple_return_rtx); @@ -2770,7 +2780,7 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread, else if (LABEL_P (new_thread)) label = new_thread; else - label = get_label_before (new_thread); + label = get_label_before (new_thread, JUMP_LABEL (insn)); if (label) { @@ -3321,7 +3331,7 @@ relax_delay_slots (rtx first) /* Now emit a label before the special USE insn, and redirect our jump to the new label. */ - target_label = get_label_before (PREV_INSN (tmp)); + target_label = get_label_before (PREV_INSN (tmp), target_label); reorg_redirect_jump (delay_insn, target_label); next = insn; continue; @@ -3495,7 +3505,7 @@ make_return_insns (rtx first) for (insn = first; insn; insn = NEXT_INSN (insn)) if (JUMP_P (insn) && ANY_RETURN_P (PATTERN (insn))) { - rtx t = get_label_before (insn); + rtx t = get_label_before (insn, NULL_RTX); if (PATTERN (insn) == ret_rtx) real_return_label = t; else @@ -3825,6 +3835,12 @@ dbr_schedule (rtx first) fprintf (dump_file, "\n"); } + if (!sibling_labels.is_empty ()) + { + update_alignments (sibling_labels); + sibling_labels.release (); + } + free_resource_info (); free (uid_to_ruid); crtl->dbr_scheduled_p = true; |