diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-10-19 20:23:44 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-10-19 20:23:44 +0000 |
commit | 86236ca9d56c88ec48a1e1f1c7b96424572772a7 (patch) | |
tree | 342a09e2dec122b2933a81fc78272e3040cf0cf1 /gcc/reorg.c | |
parent | 8708c37328ab7710919834b778a4b76179e63e07 (diff) | |
download | gcc-86236ca9d56c88ec48a1e1f1c7b96424572772a7.tar.gz |
1998-10-18 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
* reorg.c (steal_delay_list_from_target) Check for insns that
modify the condition codes and effect the direction of the jump
in the sequence.
Sat Oct 17 13:09:09 1998 Graham <grahams@rcp.co.uk>
* function.c (purge_addressof_1): Replace call to
emit_insns_before() with emit_insn_before().
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23189 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reorg.c')
-rw-r--r-- | gcc/reorg.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/gcc/reorg.c b/gcc/reorg.c index c93f49e4785..9400615e23a 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -61,6 +61,10 @@ Boston, MA 02111-1307, USA. */ we can hoist insns from the fall-through path for forward branches or steal insns from the target of backward branches. + The TMS320C3x and C4x have three branch delay slots. When the three + slots are filled, the branch penalty is zero. Most insns can fill the + delay slots except jump insns. + Three techniques for filling delay slots have been implemented so far: (1) `fill_simple_delay_slots' is the simplest, most efficient way @@ -1687,6 +1691,7 @@ steal_delay_list_from_target (insn, condition, seq, delay_list, int must_annul = *pannul_p; int i; int used_annul = 0; + struct resources cc_set; /* We can't do anything if there are more delay slots in SEQ than we can handle, or if we don't know that it will be a taken branch. @@ -1696,7 +1701,23 @@ steal_delay_list_from_target (insn, condition, seq, delay_list, Also, exit if the branch has more than one set, since then it is computing other results that can't be ignored, e.g. the HPPA mov&branch instruction. ??? It may be possible to move other sets into INSN in addition to - moving the instructions in the delay slots. */ + moving the instructions in the delay slots. + + We can not steal the delay list if one of the instructions in the + current delay_list modifies the condition codes and the jump in the + sequence is a conditional jump. We can not do this because we can + not change the direction of the jump because the condition codes + will effect the direction of the jump in the sequence. */ + + CLEAR_RESOURCE (&cc_set); + for (temp = delay_list; temp; temp = XEXP (temp, 1)) + { + rtx trial = XEXP (temp, 0); + + mark_set_resources (trial, &cc_set, 0, 1); + if (insn_references_resource_p (XVECEXP (seq , 0, 0), &cc_set, 0)) + return delay_list; + } if (XVECLEN (seq, 0) - 1 > slots_remaining || ! condition_dominates_p (condition, XVECEXP (seq, 0, 0)) @@ -3716,8 +3737,6 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely, delay_list = add_to_delay_list (temp, delay_list); - mark_set_resources (trial, &opposite_needed, 0, 1); - if (slots_to_fill == ++(*pslots_filled)) { /* Even though we have filled all the slots, we @@ -3795,9 +3814,7 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely, { /* If this is the `true' thread, we will want to follow the jump, so we can only do this if we have taken everything up to here. */ - if (thread_if_true && trial == new_thread - && ! insn_references_resource_p (XVECEXP (PATTERN (trial), 0, 0), - &opposite_needed, 0)) + if (thread_if_true && trial == new_thread) delay_list = steal_delay_list_from_target (insn, condition, PATTERN (trial), delay_list, &set, &needed, |