[Bug optimization/8092] [3.3/3.4 regression] cross-jump triggers too often
bernd dot paysan at gmx dot de
gcc-bugzilla@gcc.gnu.org
Fri Dec 26 22:53:00 GMT 2003
------- Additional Comments From bernd dot paysan at gmx dot de 2003-12-26 21:11 -------
The "too often" triggered crossjumping has partly been resolved with the
-fno-crossjumping option. However, this doesn't include computed gotos, GCC
still produces (from 3.3 on) crossjumps to computed gotos. Looking closer at
the code, this is intentional. The following patch fixes the problem when you
don't want crossjumping by not emitting a central dispatcher for computed
gotos. A central dispatcher is *bad*, because the branch predictor can not make
up any correlation between jump location and jump target.
--- gcc-3.4-20031217/gcc/stmt.c.orig 2003-12-05 12:11:05.000000000 +0100
+++ gcc-3.4-20031217/gcc/stmt.c 2003-12-26 21:54:32.000000000 +0100
@@ -523,7 +523,15 @@
emit_queue ();
- if (! cfun->computed_goto_common_label)
+ if (!flag_crossjumping)
+ {
+ emit_queue ();
+ do_pending_stack_adjust ();
+ emit_indirect_jump (x);
+
+ current_function_has_computed_jump = 1;
+ }
+ else if (! cfun->computed_goto_common_label)
{
cfun->computed_goto_common_reg = copy_to_mode_reg (Pmode, x);
cfun->computed_goto_common_label = gen_label_rtx ();
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8092
More information about the Gcc-bugs
mailing list