patches/gcc/4.2.0/260-flatten-switch-stmt-00.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jul 28 21:32:33 2008 +0000 (2008-07-28)
changeset 747 d3e603e7c17c
parent 251 patches/gcc/4.2.0/904-flatten-switch-stmt-00.patch@b23a09443f72
permissions -rw-r--r--
Fourth step at renaming patches: renumber all patches with a 10-step.
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