diff options
author | Felix Fietkau <nbd@openwrt.org> | 2009-10-10 19:25:48 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2009-10-10 19:25:48 +0000 |
commit | 13de9a716a6b7e58e3029db284574f0b4fad7eb9 (patch) | |
tree | 9805d1be913bda014319f149a2fee2ee1994722f /toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch | |
parent | 46b99120de90068732d8373489ff6ef2a14d73e2 (diff) | |
download | master-187ad058-13de9a716a6b7e58e3029db284574f0b4fad7eb9.tar.gz master-187ad058-13de9a716a6b7e58e3029db284574f0b4fad7eb9.tar.bz2 master-187ad058-13de9a716a6b7e58e3029db284574f0b4fad7eb9.zip |
gcc: add llvm-gcc and llvm from trunk (does not successfully compile a target yet, but gets close)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@18019 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch')
-rw-r--r-- | toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch b/toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch new file mode 100644 index 0000000000..f3a6372b64 --- /dev/null +++ b/toolchain/gcc/patches/llvm/904-flatten-switch-stmt-00.patch @@ -0,0 +1,72 @@ +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" + +--- a/gcc/stmt.c ++++ b/gcc/stmt.c +@@ -2574,7 +2574,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); + } +@@ -3136,6 +3140,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, |