From bd7b9a0f96a090ea290ad77d2e3de66a9b2f52e5 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 22 Aug 2001 01:18:33 -0700 Subject: [PATCH] ia64.c (emit_all_insn_group_barriers): Flush state at barrier insns. * config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state at barrier insns. Emit stop bits before barriers. From-SVN: r45102 --- gcc/ChangeLog | 3 +++ gcc/config/ia64/ia64.c | 22 +++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e5858db2836..25f0028f573d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2001-08-21 Richard Henderson + * config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state + at barrier insns. Emit stop bits before barriers. + * flow.c (flow_find_cross_jump): Don't consider unconditional return insns for commoning. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 2c539fe7616e..5cba6245ef05 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 ();