1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/patches/gcc/4.3.2/160-flatten-switch-stmt-00.patch Mon May 07 00:27:05 2012 +0200
1.3 @@ -0,0 +1,76 @@
1.4 +Original patch from gentoo: gentoo/src/patchsets/gcc/4.3.1/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.1.orig/gcc/stmt.c gcc-4.3.1/gcc/stmt.c
1.57 +--- gcc-4.3.1.orig/gcc/stmt.c 2008-05-09 20:12:13.000000000 +0200
1.58 ++++ gcc-4.3.1/gcc/stmt.c 2008-06-10 14:57:58.000000000 +0200
1.59 +@@ -2509,7 +2509,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 +@@ -3067,6 +3071,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,