aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-08-22 01:18:33 -0700
committerRichard Henderson <rth@gcc.gnu.org>2001-08-22 01:18:33 -0700
commitbd7b9a0f96a090ea290ad77d2e3de66a9b2f52e5 (patch)
tree7975e291deb515e41e959e0994b0df29d86e0c5b /gcc
parent687eccc06ebdf6db0905b1a7644a4a90c7e9d16a (diff)
downloadgcc-bd7b9a0f96a090ea290ad77d2e3de66a9b2f52e5.zip
gcc-bd7b9a0f96a090ea290ad77d2e3de66a9b2f52e5.tar.gz
gcc-bd7b9a0f96a090ea290ad77d2e3de66a9b2f52e5.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/ia64/ia64.c22
2 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6e5858d..25f0028f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2001-08-21 Richard Henderson <rth@redhat.com>
+ * 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 2c539fe..5cba624 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 ();