patches/gcc/4.3.1/160-flatten-switch-stmt-00.patch
changeset 747 d3e603e7c17c
parent 746 b150d6f590fc
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/4.3.1/160-flatten-switch-stmt-00.patch	Mon Jul 28 21:32:33 2008 +0000
     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,