diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-08-22 08:18:33 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-08-22 08:18:33 +0000 |
commit | 811aa2572b2d35ad8306d5ae6583de81b1d4827d (patch) | |
tree | 7975e291deb515e41e959e0994b0df29d86e0c5b /gcc/config | |
parent | 39068549063954805cce0d684635c7eb050b3394 (diff) | |
download | gcc-811aa2572b2d35ad8306d5ae6583de81b1d4827d.tar.gz |
* config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state
at barrier insns. Emit stop bits before barriers.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45102 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/ia64/ia64.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 2c539fe7616..5cba6245ef0 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -4811,13 +4811,25 @@ emit_all_insn_group_barriers (dump, insns) for (insn = insns; insn; insn = NEXT_INSN (insn)) { - if (GET_CODE (insn) == INSN - && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE - && XINT (PATTERN (insn), 1) == 2) - init_insn_group_barriers (); + if (GET_CODE (insn) == BARRIER) + { + rtx last = prev_active_insn (insn); + + if (! last) + continue; + if (GET_CODE (last) == JUMP_INSN + && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC) + last = prev_active_insn (last); + if (recog_memoized (last) != CODE_FOR_insn_group_barrier) + emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last); + + init_insn_group_barriers (); + } else if (INSN_P (insn)) { - if (group_barrier_needed_p (insn)) + if (recog_memoized (insn) == CODE_FOR_insn_group_barrier) + init_insn_group_barriers (); + else if (group_barrier_needed_p (insn)) { emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), insn); init_insn_group_barriers (); |