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