aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2004-10-01 15:22:26 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2004-10-01 08:22:26 -0700
commit29c4d22b06b699bbea8d57b9bfa8c12ada569261 (patch)
tree54b57557dcba247480b883bc8ddbb7cdf25e55e0
parent0f0377f6dde05e7bc08025824b24ce8917cbcee7 (diff)
downloadgcc-29c4d22b06b699bbea8d57b9bfa8c12ada569261.zip
gcc-29c4d22b06b699bbea8d57b9bfa8c12ada569261.tar.gz
gcc-29c4d22b06b699bbea8d57b9bfa8c12ada569261.tar.bz2
re PR tree-optimization/17343 (a dispatch table can be shortened for certain switch statements)
2004-10-01 Andrew Pinski <pinskia@physics.uc.edu> PR tree-opt/17343 * gcc.dg/tree-ssa/pr17343.c: New test. 2004-10-01 Andrew Pinski <pinskia@physics.uc.edu> PR tree-opt/17343 * tree-cfg.c (group_case_labels): Get the label and not the case expr for the default case. When the label we looking at is the default, decrement the new_size. From-SVN: r88397
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr17343.c36
-rw-r--r--gcc/tree-cfg.c8
4 files changed, 56 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 80912c3..f32a14b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2004-10-01 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/17343
+ * tree-cfg.c (group_case_labels): Get the label and not
+ the case expr for the default case.
+ When the label we looking at is the default, decrement the
+ new_size.
+
2004-10-01 Jan Hubicka <jh@suse.cz>
* c-decl.c (c_expand_body): Update call tree_rest_of_compilation.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6b3b270..cf4646c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-01 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/17343
+ * gcc.dg/tree-ssa/pr17343.c: New test.
+
2004-10-01 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/tree-ssa/stdarg-1.c: Removed.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr17343.c b/gcc/testsuite/gcc.dg/tree-ssa/pr17343.c
new file mode 100644
index 0000000..b415d66
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr17343.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+void foo0(void);
+void foo1(void);
+void foo2(void);
+void foo3(void);
+
+void
+foo (int a)
+{
+ switch (a)
+ {
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ goto ddd;
+ case 14:
+ foo1();
+ break;
+ case 15:
+ foo2();
+ break;
+ case 16:
+ foo3();
+ break;
+ default:
+ ddd:
+ foo0();
+ break;
+ }
+}
+/* There should be precisely two references to ddd. One in the switch
+ and one for the label, we used not to combine the case 10-13 into
+ the default case. */
+/* { dg-final { scan-tree-dump-times "ddd" 1 "optimized"} } */
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 72f7378..e047943 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -941,7 +941,12 @@ group_case_labels (void)
tree labels = SWITCH_LABELS (stmt);
int old_size = TREE_VEC_LENGTH (labels);
int i, j, new_size = old_size;
- tree default_label = TREE_VEC_ELT (labels, old_size - 1);
+ tree default_case = TREE_VEC_ELT (labels, old_size - 1);
+ tree default_label;
+
+ /* The default lable is always the last case in a switch
+ statement after gimplification. */
+ default_label = CASE_LABEL (default_case);
/* Look for possible opportunities to merge cases.
Ignore the last element of the label vector because it
@@ -961,6 +966,7 @@ group_case_labels (void)
{
TREE_VEC_ELT (labels, i) = NULL_TREE;
i++;
+ new_size--;
continue;
}