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