123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- Hi,
- The attached patch makes sure that we create smaller object code for
- simple switch statements. We just make sure to flatten the switch
- statement into an if-else chain, basically.
- This fixes a size-regression as compared to gcc-3.4, as can be seen
- below.
- 2007-04-15 Bernhard Fischer <..>
- * stmt.c (expand_case): Do not create a complex binary tree when
- optimizing for size but rather use the simple ordered list.
- (emit_case_nodes): do not emit jumps to the default_label when
- optimizing for size.
- Not regtested so far.
- Comments?
- Attached is the test switch.c mentioned below.
- $ 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
- gcc-$i -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done
- $ 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
- gcc-$i -UCHAIN -Os -o switch-$i.o -c switch.c ;done
- $ size switch-*.o
- text data bss dec hex filename
- 169 0 0 169 a9 switch-2.95.o
- 115 0 0 115 73 switch-3.3.o
- 103 0 0 103 67 switch-3.4.o
- 124 0 0 124 7c switch-4.0.o
- 124 0 0 124 7c switch-4.1.o
- 124 0 0 124 7c switch-4.2.orig-HEAD.o
- 95 0 0 95 5f switch-4.3-HEAD.o
- 124 0 0 124 7c switch-4.3.orig-HEAD.o
- 166 0 0 166 a6 switch-CHAIN-2.95.o
- 111 0 0 111 6f switch-CHAIN-3.3.o
- 95 0 0 95 5f switch-CHAIN-3.4.o
- 95 0 0 95 5f switch-CHAIN-4.0.o
- 95 0 0 95 5f switch-CHAIN-4.1.o
- 95 0 0 95 5f switch-CHAIN-4.2.orig-HEAD.o
- 95 0 0 95 5f switch-CHAIN-4.3-HEAD.o
- 95 0 0 95 5f switch-CHAIN-4.3.orig-HEAD.o
- Content-Type: text/x-diff; charset=us-ascii
- Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff"
- Index: gcc-4.2.0/gcc/stmt.c
- ===================================================================
- --- gcc-4.2.0.orig/gcc/stmt.c (revision 123843)
- +++ gcc-4.2.0/gcc/stmt.c (working copy)
- @@ -2517,7 +2517,11 @@ expand_case (tree exp)
- use_cost_table
- = (TREE_CODE (orig_type) != ENUMERAL_TYPE
- && estimate_case_costs (case_list));
- - balance_case_nodes (&case_list, NULL);
- + /* When optimizing for size, we want a straight list to avoid
- + jumps as much as possible. This basically creates an if-else
- + chain. */
- + if (!optimize_size)
- + balance_case_nodes (&case_list, NULL);
- emit_case_nodes (index, case_list, default_label, index_type);
- emit_jump (default_label);
- }
- @@ -3075,6 +3079,7 @@ emit_case_nodes (rtx index, case_node_pt
- {
- if (!node_has_low_bound (node, index_type))
- {
- + if (!optimize_size) /* don't jl to the .default_label. */
- emit_cmp_and_jump_insns (index,
- convert_modes
- (mode, imode,
- Content-Type: text/x-csrc; charset=us-ascii
- Content-Disposition: attachment; filename="switch.c"
- int
- commutative_tree_code (int code)
- {
- #define CASE(val, ret) case val:/* __asm__("# val="#val ",ret="#ret);*/ return ret;
- #ifndef CHAIN
- switch (code)
- {
- # if 1
- CASE(1,3)
- CASE(3,2)
- CASE(5,8)
- CASE(7,1)
- CASE(33,4)
- CASE(44,9)
- CASE(55,10)
- CASE(66,-1)
- CASE(77,99)
- CASE(666,0)
- # else
- case 1:
- return 3;
- case 3:
- return 2;
- case 5:
- return 8;
- case 7:
- return 1;
- case 33:
- return 4;
- case 44:
- return 9;
- case 55:
- return 10;
- case 66:
- return -1;
- case 77:
- return 99;
- case 666:
- return 0;
- # endif
- default:
- break;
- }
- return 4711;
- #else
- if (code == 1)
- return 3;
- else if (code == 3)
- return 2;
- else if (code == 5)
- return 8;
- else if (code == 7)
- return 1;
- else if (code == 33)
- return 4;
- else if (code == 44)
- return 9;
- else if (code == 55)
- return 10;
- else if (code == 66)
- return -1;
- else if (code == 77)
- return 99;
- else if (code == 666)
- return 0;
- else
- return 4711;
- #endif
- }
- --AhhlLboLdkugWU4S--
|