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