patches/gcc/4.3.3/160-flatten-switch-stmt-00.patch
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@1162
     1
Original patch from: ../4.3.2/160-flatten-switch-stmt-00.patch
yann@1162
     2
yann@1162
     3
-= BEGIN original header =-
yann@1162
     4
Original patch from gentoo: gentoo/src/patchsets/gcc/4.3.1/gentoo/18_all_904-flatten-switch-stmt-00.patch
yann@1162
     5
http://gcc.gnu.org/ml/gcc-patches/2007-04/msg00927.html
yann@1162
     6
yann@1162
     7
Hi,
yann@1162
     8
yann@1162
     9
The attached patch makes sure that we create smaller object code for
yann@1162
    10
simple switch statements. We just make sure to flatten the switch
yann@1162
    11
statement into an if-else chain, basically.
yann@1162
    12
yann@1162
    13
This fixes a size-regression as compared to gcc-3.4, as can be seen
yann@1162
    14
below.
yann@1162
    15
yann@1162
    16
2007-04-15  Bernhard Fischer  <..>
yann@1162
    17
yann@1162
    18
	* stmt.c (expand_case): Do not create a complex binary tree when
yann@1162
    19
	optimizing for size but rather use the simple ordered list.
yann@1162
    20
	(emit_case_nodes): do not emit jumps to the default_label when
yann@1162
    21
	optimizing for size.
yann@1162
    22
yann@1162
    23
Not regtested so far.
yann@1162
    24
Comments?
yann@1162
    25
yann@1162
    26
Attached is the test switch.c mentioned below.
yann@1162
    27
yann@1162
    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
yann@1162
    29
gcc-$i  -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done
yann@1162
    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
yann@1162
    31
gcc-$i  -UCHAIN -Os -o switch-$i.o -c switch.c ;done
yann@1162
    32
yann@1162
    33
$ size switch-*.o
yann@1162
    34
   text	   data	    bss	    dec	    hex	filename
yann@1162
    35
    169	      0	      0	    169	     a9	switch-2.95.o
yann@1162
    36
    115	      0	      0	    115	     73	switch-3.3.o
yann@1162
    37
    103	      0	      0	    103	     67	switch-3.4.o
yann@1162
    38
    124	      0	      0	    124	     7c	switch-4.0.o
yann@1162
    39
    124	      0	      0	    124	     7c	switch-4.1.o
yann@1162
    40
    124	      0	      0	    124	     7c	switch-4.2.orig-HEAD.o
yann@1162
    41
     95	      0	      0	     95	     5f	switch-4.3-HEAD.o
yann@1162
    42
    124	      0	      0	    124	     7c	switch-4.3.orig-HEAD.o
yann@1162
    43
    166	      0	      0	    166	     a6	switch-CHAIN-2.95.o
yann@1162
    44
    111	      0	      0	    111	     6f	switch-CHAIN-3.3.o
yann@1162
    45
     95	      0	      0	     95	     5f	switch-CHAIN-3.4.o
yann@1162
    46
     95	      0	      0	     95	     5f	switch-CHAIN-4.0.o
yann@1162
    47
     95	      0	      0	     95	     5f	switch-CHAIN-4.1.o
yann@1162
    48
     95	      0	      0	     95	     5f	switch-CHAIN-4.2.orig-HEAD.o
yann@1162
    49
     95	      0	      0	     95	     5f	switch-CHAIN-4.3-HEAD.o
yann@1162
    50
     95	      0	      0	     95	     5f	switch-CHAIN-4.3.orig-HEAD.o
yann@1162
    51
yann@1162
    52
yann@1162
    53
Content-Type: text/x-diff; charset=us-ascii
yann@1162
    54
Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff"
yann@1162
    55
yann@1162
    56
-= END original header =-
yann@1162
    57
yann@1162
    58
diff -durN gcc-4.3.3.orig/gcc/stmt.c gcc-4.3.3/gcc/stmt.c
yann@1162
    59
--- gcc-4.3.3.orig/gcc/stmt.c	2008-05-09 20:12:13.000000000 +0200
yann@1162
    60
+++ gcc-4.3.3/gcc/stmt.c	2009-01-27 22:19:28.000000000 +0100
yann@1162
    61
@@ -2509,7 +2509,11 @@
yann@1162
    62
 	  use_cost_table
yann@1162
    63
 	    = (TREE_CODE (orig_type) != ENUMERAL_TYPE
yann@1162
    64
 	       && estimate_case_costs (case_list));
yann@1162
    65
-	  balance_case_nodes (&case_list, NULL);
yann@1162
    66
+	  /* When optimizing for size, we want a straight list to avoid
yann@1162
    67
+	     jumps as much as possible. This basically creates an if-else
yann@1162
    68
+	     chain.  */
yann@1162
    69
+	  if (!optimize_size)
yann@1162
    70
+	    balance_case_nodes (&case_list, NULL);
yann@1162
    71
 	  emit_case_nodes (index, case_list, default_label, index_type);
yann@1162
    72
 	  emit_jump (default_label);
yann@1162
    73
 	}
yann@1162
    74
@@ -3067,6 +3071,7 @@
yann@1162
    75
 	    {
yann@1162
    76
 	      if (!node_has_low_bound (node, index_type))
yann@1162
    77
 		{
yann@1162
    78
+		  if (!optimize_size) /* don't jl to the .default_label. */
yann@1162
    79
 		  emit_cmp_and_jump_insns (index,
yann@1162
    80
 					   convert_modes
yann@1162
    81
 					   (mode, imode,