From: Kyrylo Tkachov <[email protected]>
The switch-dispatch transformation trades code size for dispatch speed. At
-O2 on an AArch64 Olympus system it improves mawk by 5.7% and QuickJS-ng by
25.2%. Their text changes are 3.73% and 0.90%, respectively. At -Ofast it
improves 714.cpython_r by 7.7% with a 0.20% text change.
Enable the option at -O2 for speed builds, where the existing computed-goto
unfactoring also runs. Keep it disabled for -Os, -Oz, and size-optimized
functions. A target without TARGET_ASM_JUMP_TABLE_BASE has unchanged generated
code.
gcc/ChangeLog:
PR middle-end/126236
* opts.cc (default_options_table): Enable
-fduplicate-switch-dispatch at -O2 for speed builds.
* doc/invoke.texi: Document it.
gcc/testsuite/ChangeLog:
PR middle-end/126236
* gcc.target/aarch64/switch-dispatch-1.c: Test default enablement at
-O2.
Signed-off-by: Kyrylo Tkachov <[email protected]>
---
gcc/doc/invoke.texi | 3 +++
gcc/opts.cc | 1 +
gcc/testsuite/gcc.target/aarch64/switch-dispatch-1.c | 2 +-
3 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 54c85eae25b..7279c565213 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -13650,6 +13650,7 @@ also turns on the following optimization flags:
-fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks -fdep-fusion
-fdevirtualize -fdevirtualize-speculatively
+-fduplicate-switch-dispatch
-fexpensive-optimizations
-ffinite-loops
-fgcse -fgcse-lm
@@ -14307,6 +14308,8 @@ extension.
It trades size for speed, so the amount copied is bounded by
@option{--param=max-goto-duplication-insns}.
+Enabled at levels @option{-O2}, @option{-O3}.
+
@opindex fif-conversion
@opindex fno-if-conversion
@item -fif-conversion
diff --git a/gcc/opts.cc b/gcc/opts.cc
index 8048264b609..a6f838c7dec 100644
--- a/gcc/opts.cc
+++ b/gcc/opts.cc
@@ -685,6 +685,7 @@ static const struct default_options default_options_table[]
=
{ OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
{ OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
{ OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
+ { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fduplicate_switch_dispatch, NULL, 1 },
{ OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
{ OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
REORDER_BLOCKS_ALGORITHM_STC },
diff --git a/gcc/testsuite/gcc.target/aarch64/switch-dispatch-1.c
b/gcc/testsuite/gcc.target/aarch64/switch-dispatch-1.c
index 5d60bed79d9..72b6e613fb4 100644
--- a/gcc/testsuite/gcc.target/aarch64/switch-dispatch-1.c
+++ b/gcc/testsuite/gcc.target/aarch64/switch-dispatch-1.c
@@ -1,6 +1,6 @@
/* PR middle-end/126236 */
/* { dg-do assemble } */
-/* { dg-options "-O2 -fduplicate-switch-dispatch -save-temps" } */
+/* { dg-options "-O2 -save-temps" } */
/* Each of the 11 continuing handlers, the default handler and the loop entry
get a dispatch of their own, so 13 register indirect branches. All of them
--
2.50.1 (Apple Git-155)