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)

Reply via email to