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