From c5237b8b8ece31f3f1a076d06460178710b90fae Mon Sep 17 00:00:00 2001 From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Fri, 17 Nov 2006 08:57:45 +0000 Subject: [PATCH] PR middle-end/29584 * tree-ssa-forwprop.c (simplify_switch_expr): Don't optimize if DEF doesn't have integral type. * gcc.dg/torture/pr29584.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118921 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr29584.c | 28 ++++++++++++++++++++++++++ gcc/tree-ssa-forwprop.c | 4 +++- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr29584.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a74dde70bde..968e679b9194 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-11-17 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/29584 + * tree-ssa-forwprop.c (simplify_switch_expr): Don't + optimize if DEF doesn't have integral type. + 2006-11-16 Mike Stump <mrs@apple.com> * config/darwin.h (LINK_COMMAND_SPEC): Don't do dwarf stuff on diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c58709639995..6ba65d40a585 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-17 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/29584 + * gcc.dg/torture/pr29584.c: New test. + 2006-11-17 Joseph Myers <joseph@codesourcery.com> * gcc.dg/tree-ssa/stdarg-2.c, gcc.dg/tree-ssa/stdarg-4.c: diff --git a/gcc/testsuite/gcc.dg/torture/pr29584.c b/gcc/testsuite/gcc.dg/torture/pr29584.c new file mode 100644 index 000000000000..84bfddc5e1eb --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr29584.c @@ -0,0 +1,28 @@ +/* PR middle-end/29584 */ +/* { dg-do compile } */ + +extern void *foo1 (void); +extern void foo2 (void); +extern void foo3 (void *, void *); +extern int foo4 (void); + +void +bar (void) +{ + int i; + void *s; + for (i = 1; i < 4; i++) + { + if (foo4 ()) + foo2 (); + switch (0x8000000UL + i * 0x400) + { + case 0x80000000UL ... 0x80000000UL + 0x3a000000UL - 1: + s = 0; + break; + default: + s = foo1 (); + } + foo3 ((void *) (0x8000000UL + i * 0x400), s); + } +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index e2c5ed48e709..a3caf235062e 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -934,7 +934,9 @@ simplify_switch_expr (tree stmt) need_precision = TYPE_PRECISION (ti); fail = false; - if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti)) + if (! INTEGRAL_TYPE_P (ti)) + fail = true; + else if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti)) fail = true; else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti)) need_precision += 1; -- GitLab