patches/gcc/4.2.0/260-flatten-switch-stmt-00.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Sep 21 22:42:35 2011 +0200 (2011-09-21)
changeset 2677 7df89370f805
parent 251 b23a09443f72
permissions -rw-r--r--
kernel/linux: add alternate download locations

Since kernel.org is dead, and there is no announced or known estimated
time or return to normality, it is impossible to download any kernel at
this time.

Add a known-working mirror.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@251
     1
Hi,
yann@251
     2
yann@251
     3
The attached patch makes sure that we create smaller object code for
yann@251
     4
simple switch statements. We just make sure to flatten the switch
yann@251
     5
statement into an if-else chain, basically.
yann@251
     6
yann@251
     7
This fixes a size-regression as compared to gcc-3.4, as can be seen
yann@251
     8
below.
yann@251
     9
yann@251
    10
2007-04-15  Bernhard Fischer  <..>
yann@251
    11
yann@251
    12
	* stmt.c (expand_case): Do not create a complex binary tree when
yann@251
    13
	optimizing for size but rather use the simple ordered list.
yann@251
    14
	(emit_case_nodes): do not emit jumps to the default_label when
yann@251
    15
	optimizing for size.
yann@251
    16
yann@251
    17
Not regtested so far.
yann@251
    18
Comments?
yann@251
    19
yann@251
    20
Attached is the test switch.c mentioned below.
yann@251
    21
yann@251
    22
$ 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@251
    23
gcc-$i  -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done
yann@251
    24
$ 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@251
    25
gcc-$i  -UCHAIN -Os -o switch-$i.o -c switch.c ;done
yann@251
    26
yann@251
    27
$ size switch-*.o
yann@251
    28
   text	   data	    bss	    dec	    hex	filename
yann@251
    29
    169	      0	      0	    169	     a9	switch-2.95.o
yann@251
    30
    115	      0	      0	    115	     73	switch-3.3.o
yann@251
    31
    103	      0	      0	    103	     67	switch-3.4.o
yann@251
    32
    124	      0	      0	    124	     7c	switch-4.0.o
yann@251
    33
    124	      0	      0	    124	     7c	switch-4.1.o
yann@251
    34
    124	      0	      0	    124	     7c	switch-4.2.orig-HEAD.o
yann@251
    35
     95	      0	      0	     95	     5f	switch-4.3-HEAD.o
yann@251
    36
    124	      0	      0	    124	     7c	switch-4.3.orig-HEAD.o
yann@251
    37
    166	      0	      0	    166	     a6	switch-CHAIN-2.95.o
yann@251
    38
    111	      0	      0	    111	     6f	switch-CHAIN-3.3.o
yann@251
    39
     95	      0	      0	     95	     5f	switch-CHAIN-3.4.o
yann@251
    40
     95	      0	      0	     95	     5f	switch-CHAIN-4.0.o
yann@251
    41
     95	      0	      0	     95	     5f	switch-CHAIN-4.1.o
yann@251
    42
     95	      0	      0	     95	     5f	switch-CHAIN-4.2.orig-HEAD.o
yann@251
    43
     95	      0	      0	     95	     5f	switch-CHAIN-4.3-HEAD.o
yann@251
    44
     95	      0	      0	     95	     5f	switch-CHAIN-4.3.orig-HEAD.o
yann@251
    45
yann@251
    46
yann@251
    47
Content-Type: text/x-diff; charset=us-ascii
yann@251
    48
Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff"
yann@251
    49
yann@251
    50
Index: gcc-4.2.0/gcc/stmt.c
yann@251
    51
===================================================================
yann@251
    52
--- gcc-4.2.0.orig/gcc/stmt.c	(revision 123843)
yann@251
    53
+++ gcc-4.2.0/gcc/stmt.c	(working copy)
yann@251
    54
@@ -2517,7 +2517,11 @@ expand_case (tree exp)
yann@251
    55
 	  use_cost_table
yann@251
    56
 	    = (TREE_CODE (orig_type) != ENUMERAL_TYPE
yann@251
    57
 	       && estimate_case_costs (case_list));
yann@251
    58
-	  balance_case_nodes (&case_list, NULL);
yann@251
    59
+	  /* When optimizing for size, we want a straight list to avoid
yann@251
    60
+	     jumps as much as possible. This basically creates an if-else
yann@251
    61
+	     chain.  */
yann@251
    62
+	  if (!optimize_size)
yann@251
    63
+	    balance_case_nodes (&case_list, NULL);
yann@251
    64
 	  emit_case_nodes (index, case_list, default_label, index_type);
yann@251
    65
 	  emit_jump (default_label);
yann@251
    66
 	}
yann@251
    67
@@ -3075,6 +3079,7 @@ emit_case_nodes (rtx index, case_node_pt
yann@251
    68
 	    {
yann@251
    69
 	      if (!node_has_low_bound (node, index_type))
yann@251
    70
 		{
yann@251
    71
+		  if (!optimize_size) /* don't jl to the .default_label. */
yann@251
    72
 		  emit_cmp_and_jump_insns (index,
yann@251
    73
 					   convert_modes
yann@251
    74
 					   (mode, imode,
yann@251
    75
yann@251
    76
yann@251
    77
Content-Type: text/x-csrc; charset=us-ascii
yann@251
    78
Content-Disposition: attachment; filename="switch.c"
yann@251
    79
yann@251
    80
int
yann@251
    81
commutative_tree_code (int code)
yann@251
    82
{
yann@251
    83
#define CASE(val, ret) case val:/* __asm__("# val="#val ",ret="#ret);*/ return ret;
yann@251
    84
#ifndef CHAIN
yann@251
    85
  switch (code)
yann@251
    86
    {
yann@251
    87
# if 1
yann@251
    88
  CASE(1,3)
yann@251
    89
  CASE(3,2)
yann@251
    90
  CASE(5,8)
yann@251
    91
  CASE(7,1)
yann@251
    92
  CASE(33,4)
yann@251
    93
  CASE(44,9)
yann@251
    94
  CASE(55,10)
yann@251
    95
  CASE(66,-1)
yann@251
    96
  CASE(77,99)
yann@251
    97
  CASE(666,0)
yann@251
    98
# else
yann@251
    99
    case 1:
yann@251
   100
      return 3;
yann@251
   101
    case 3:
yann@251
   102
      return 2;
yann@251
   103
    case 5:
yann@251
   104
      return 8;
yann@251
   105
    case 7:
yann@251
   106
      return 1;
yann@251
   107
    case 33:
yann@251
   108
      return 4;
yann@251
   109
    case 44:
yann@251
   110
      return 9;
yann@251
   111
    case 55:
yann@251
   112
      return 10;
yann@251
   113
    case 66:
yann@251
   114
      return -1;
yann@251
   115
    case 77:
yann@251
   116
      return 99;
yann@251
   117
    case 666:
yann@251
   118
      return 0;
yann@251
   119
# endif
yann@251
   120
    default:
yann@251
   121
      break;
yann@251
   122
    }
yann@251
   123
  return 4711;
yann@251
   124
yann@251
   125
#else
yann@251
   126
   if (code == 1)
yann@251
   127
	return 3;
yann@251
   128
  else if (code == 3)
yann@251
   129
	return 2;
yann@251
   130
  else if (code == 5)
yann@251
   131
	return 8;
yann@251
   132
  else if (code == 7)
yann@251
   133
	return 1;
yann@251
   134
  else if (code == 33)
yann@251
   135
	return 4;
yann@251
   136
  else if (code == 44)
yann@251
   137
	return 9;
yann@251
   138
  else if (code == 55)
yann@251
   139
	return 10;
yann@251
   140
  else if (code == 66)
yann@251
   141
	return -1;
yann@251
   142
  else if (code == 77)
yann@251
   143
	return 99;
yann@251
   144
  else if (code == 666)
yann@251
   145
	return 0;
yann@251
   146
  else
yann@251
   147
	return 4711;
yann@251
   148
#endif
yann@251
   149
}
yann@251
   150
yann@251
   151
yann@251
   152
--AhhlLboLdkugWU4S--
yann@251
   153