aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-07-17 00:20:10 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2002-07-16 22:20:10 +0000
commit2a500b9e70db56a16d4b06186708f1181eeb1b9a (patch)
tree7596767db4af978309d5cec69c5f8f9eacdb5129 /gcc
parent554b81110446a7af56af9417bd30437024443564 (diff)
downloadgcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.zip
gcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.tar.gz
gcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.tar.bz2
i386.h (MACHINE_DEPENDENT_REORG): New macro.
* i386.h (MACHINE_DEPENDENT_REORG): New macro. * i386.c (x86_machine_dependent_reorg): New function. * i386-protos.h (x86_machine_dependent_reorg): Declare. From-SVN: r55498
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/i386.c43
-rw-r--r--gcc/config/i386/i386.h1
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c0fddd..3939b61 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jul 17 00:19:20 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.h (MACHINE_DEPENDENT_REORG): New macro.
+ * i386.c (x86_machine_dependent_reorg): New function.
+ * i386-protos.h (x86_machine_dependent_reorg): Declare.
+
2002-07-16 Zack Weinberg <zack@codesourcery.com>
* builtins.c (std_expand_builtin_va_start): Remove unused
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index d49ce1a..a81e0f5 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -209,6 +209,7 @@ extern int x86_field_alignment PARAMS ((tree, int));
#endif
extern rtx ix86_tls_get_addr PARAMS ((void));
+extern void x86_machine_dependent_reorg PARAMS ((rtx));
/* In winnt.c */
extern void i386_pe_encode_section_info PARAMS ((tree, int));
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 5c49f17..6e19b5c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13677,4 +13677,47 @@ x86_field_alignment (field, computed)
return computed;
}
+/* Implement machine specific optimizations.
+ At the moment we implement single transformation: AMD Athlon works faster
+ when RET is not destination of conditional jump or directly preceeded
+ by other jump instruction. We avoid the penalty by inserting NOP just
+ before the RET instructions in such cases. */
+void
+x86_machine_dependent_reorg (first)
+ rtx first ATTRIBUTE_UNUSED;
+{
+ edge e;
+
+ if (!TARGET_ATHLON || !optimize || optimize_size)
+ return;
+ for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ {
+ basic_block bb = e->src;
+ rtx ret = bb->end;
+ rtx prev;
+ bool insert = false;
+
+ if (!returnjump_p (ret) || !maybe_hot_bb_p (bb))
+ continue;
+ prev = prev_nonnote_insn (ret);
+ if (prev && GET_CODE (prev) == CODE_LABEL)
+ {
+ edge e;
+ for (e = bb->pred; e; e = e->pred_next)
+ if (EDGE_FREQUENCY (e) && e->src->index > 0
+ && !(e->flags & EDGE_FALLTHRU))
+ insert = 1;
+ }
+ if (!insert)
+ {
+ prev = prev_real_insn (ret);
+ if (prev && GET_CODE (prev) == JUMP_INSN
+ && any_condjump_p (prev))
+ insert = 1;
+ }
+ if (insert)
+ emit_insn_before (gen_nop (), ret);
+ }
+}
+
#include "gt-i386.h"
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index be4e1b6..7cf9721 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -3354,6 +3354,7 @@ enum fp_cw_mode {FP_CW_STORED, FP_CW_UNINITIALIZED, FP_CW_ANY};
((SRC) < FIRST_STACK_REG || (SRC) > LAST_STACK_REG)
+#define MACHINE_DEPENDENT_REORG(X) x86_machine_dependent_reorg(X)
/*
Local variables:
version-control: t