patches/gcc/4.3.3/160-flatten-switch-stmt-00.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Aug 02 18:28:10 2011 +0200 (2011-08-02)
changeset 2590 b64cfb67944e
permissions -rw-r--r--
scripts/functions: svn retrieval first tries the mirror for tarballs

The svn download helper looks for the local tarballs dir to see if it
can find a pre-downloaded tarball, and if it does not find it, does
the actual fetch to upstream via svn.

In the process, it does not even try to get a tarball from the local
mirror, which can be useful if the mirror has been pre-populated
manually (or with a previously downloaded tree).

Fake a tarball get with the standard tarball-download helper, but
without specifying any upstream URL, which makes the helper directly
try the LAN mirror.

Of course, if no mirror is specified, no URL wil be available, and
the standard svn retrieval will kick in.

Reported-by: ANDY KENNEDY <ANDY.KENNEDY@adtran.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
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,