1.1 --- a/patches/gcc/4.3.0/250-flatten-switch-stmt-00.patch Mon Jul 28 21:08:01 2008 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,76 +0,0 @@
1.4 -Original patch from gentoo: gentoo/src/patchsets/gcc/4.3.0/gentoo/18_all_904-flatten-switch-stmt-00.patch
1.5 -http://gcc.gnu.org/ml/gcc-patches/2007-04/msg00927.html
1.6 -
1.7 -Hi,
1.8 -
1.9 -The attached patch makes sure that we create smaller object code for
1.10 -simple switch statements. We just make sure to flatten the switch
1.11 -statement into an if-else chain, basically.
1.12 -
1.13 -This fixes a size-regression as compared to gcc-3.4, as can be seen
1.14 -below.
1.15 -
1.16 -2007-04-15 Bernhard Fischer <..>
1.17 -
1.18 - * stmt.c (expand_case): Do not create a complex binary tree when
1.19 - optimizing for size but rather use the simple ordered list.
1.20 - (emit_case_nodes): do not emit jumps to the default_label when
1.21 - optimizing for size.
1.22 -
1.23 -Not regtested so far.
1.24 -Comments?
1.25 -
1.26 -Attached is the test switch.c mentioned below.
1.27 -
1.28 -$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do
1.29 -gcc-$i -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done
1.30 -$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do
1.31 -gcc-$i -UCHAIN -Os -o switch-$i.o -c switch.c ;done
1.32 -
1.33 -$ size switch-*.o
1.34 - text data bss dec hex filename
1.35 - 169 0 0 169 a9 switch-2.95.o
1.36 - 115 0 0 115 73 switch-3.3.o
1.37 - 103 0 0 103 67 switch-3.4.o
1.38 - 124 0 0 124 7c switch-4.0.o
1.39 - 124 0 0 124 7c switch-4.1.o
1.40 - 124 0 0 124 7c switch-4.2.orig-HEAD.o
1.41 - 95 0 0 95 5f switch-4.3-HEAD.o
1.42 - 124 0 0 124 7c switch-4.3.orig-HEAD.o
1.43 - 166 0 0 166 a6 switch-CHAIN-2.95.o
1.44 - 111 0 0 111 6f switch-CHAIN-3.3.o
1.45 - 95 0 0 95 5f switch-CHAIN-3.4.o
1.46 - 95 0 0 95 5f switch-CHAIN-4.0.o
1.47 - 95 0 0 95 5f switch-CHAIN-4.1.o
1.48 - 95 0 0 95 5f switch-CHAIN-4.2.orig-HEAD.o
1.49 - 95 0 0 95 5f switch-CHAIN-4.3-HEAD.o
1.50 - 95 0 0 95 5f switch-CHAIN-4.3.orig-HEAD.o
1.51 -
1.52 -
1.53 -Content-Type: text/x-diff; charset=us-ascii
1.54 -Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff"
1.55 -
1.56 -diff -durN gcc-4.3.0.orig/gcc/stmt.c gcc-4.3.0/gcc/stmt.c
1.57 ---- gcc-4.3.0.orig/gcc/stmt.c 2007-12-04 22:55:32.000000000 +0100
1.58 -+++ gcc-4.3.0/gcc/stmt.c 2008-06-10 14:44:33.000000000 +0200
1.59 -@@ -2508,7 +2508,11 @@
1.60 - use_cost_table
1.61 - = (TREE_CODE (orig_type) != ENUMERAL_TYPE
1.62 - && estimate_case_costs (case_list));
1.63 -- balance_case_nodes (&case_list, NULL);
1.64 -+ /* When optimizing for size, we want a straight list to avoid
1.65 -+ jumps as much as possible. This basically creates an if-else
1.66 -+ chain. */
1.67 -+ if (!optimize_size)
1.68 -+ balance_case_nodes (&case_list, NULL);
1.69 - emit_case_nodes (index, case_list, default_label, index_type);
1.70 - emit_jump (default_label);
1.71 - }
1.72 -@@ -3066,6 +3070,7 @@
1.73 - {
1.74 - if (!node_has_low_bound (node, index_type))
1.75 - {
1.76 -+ if (!optimize_size) /* don't jl to the .default_label. */
1.77 - emit_cmp_and_jump_insns (index,
1.78 - convert_modes
1.79 - (mode, imode,