patches/gcc/4.3.1/250-904-flatten-switch-stmt-00.patch
changeset 746 b150d6f590fc
parent 745 e445c00d134d
child 747 d3e603e7c17c
     1.1 --- a/patches/gcc/4.3.1/250-904-flatten-switch-stmt-00.patch	Mon Jul 28 20:17:48 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.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,