All of lore.kernel.org
 help / color / mirror / Atom feed
From: aldot at uclibc.org <aldot@uclibc.org>
To: buildroot@busybox.net
Subject: [Buildroot] svn commit: trunk/buildroot/toolchain/gcc/4.2.0
Date: Mon, 25 Jun 2007 02:44:13 -0700 (PDT)	[thread overview]
Message-ID: <20070625094413.ECE9DA45D1@busybox.net> (raw)

Author: aldot
Date: 2007-06-25 02:44:12 -0700 (Mon, 25 Jun 2007)
New Revision: 18916

Log:
- for -Os, turn switch statements into if-else chains


Added:
   trunk/buildroot/toolchain/gcc/4.2.0/904-flatten-switch-stmt-00.patch


Changeset:
Added: trunk/buildroot/toolchain/gcc/4.2.0/904-flatten-switch-stmt-00.patch
===================================================================
--- trunk/buildroot/toolchain/gcc/4.2.0/904-flatten-switch-stmt-00.patch	                        (rev 0)
+++ trunk/buildroot/toolchain/gcc/4.2.0/904-flatten-switch-stmt-00.patch	2007-06-25 09:44:12 UTC (rev 18916)
@@ -0,0 +1,153 @@
+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--
+

                 reply	other threads:[~2007-06-25  9:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070625094413.ECE9DA45D1@busybox.net \
    --to=aldot@uclibc.org \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.