diff options
author | Andrew Pinski <pinskia@physics.uc.edu> | 2004-10-01 15:22:26 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2004-10-01 08:22:26 -0700 |
commit | 29c4d22b06b699bbea8d57b9bfa8c12ada569261 (patch) | |
tree | 54b57557dcba247480b883bc8ddbb7cdf25e55e0 /gcc | |
parent | 0f0377f6dde05e7bc08025824b24ce8917cbcee7 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr17343.c | 36 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 8 |
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; } |