From d7f2fbf618e5109a30bbe4a6e03a8e2aad4215aa Mon Sep 17 00:00:00 2001
From: Jan Hubicka <jh@suse.cz>
Date: Thu, 4 Sep 2008 12:45:57 +0200
Subject: [PATCH] re PR middle-end/37343 (ICE in expand_expr_real_1, at
 expr.c:7290)

	PR middle-end/37343
	* tree-switch-conversion.c (check_final_bb): Accept only IP
	invariants.
	* g++.dg/torture/pr37343.C New file.

From-SVN: r139983
---
 gcc/ChangeLog                          |  6 ++++++
 gcc/testsuite/ChangeLog                |  7 ++++++-
 gcc/testsuite/g++.dg/torture/pr37343.C | 19 +++++++++++++++++++
 gcc/tree-switch-conversion.c           |  2 +-
 4 files changed, 32 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr37343.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02d59e08915a..7dd49a719c7e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-09-04  Jan Hubicka  <jh@suse.cz>
+
+	PR middle-end/37343
+	* tree-switch-conversion.c (check_final_bb): Accept only IP
+	invariants.
+
 2008-09-04  Jan Hubicka  <jh@suse.cz>
 
 	* tree-vrp.c (vrp_evaluate_conditional_warnv_with_ops_using_ranges):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 226a77da0a8c..5e1b4669c14f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-03  Jan Hubicka  <jh@suse.cz>
+
+	PR middle-end/37343
+	* g++.dg/torture/pr37343.C New file.
+
 2008-09-03  Ira Rosen  <irar@il.ibm.com>
 
 	* gcc.dg/vect/slp-perm-1.c: Add call to check_vect.
@@ -11,7 +16,7 @@
 	PR tree-optimization/37345
 	PR tree-optimization/37358
 	PR tree-optimization/37357
-	* g++.dg/torture/pr37345.c: New file.
+	* g++.dg/torture/pr37345.C: New file.
 
 2008-09-03  Tobias Grosser  <grosser@fim.uni-passau.de>
 
diff --git a/gcc/testsuite/g++.dg/torture/pr37343.C b/gcc/testsuite/g++.dg/torture/pr37343.C
new file mode 100644
index 000000000000..c4614f39faa4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr37343.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+typedef enum RW { rwBitmapGrey, rwBitmapGrey16 } RW;
+void FindDepth(RW);
+void ParseDumpBitmap(RW kind, int maxfiles) 
+{
+    static const RW normalTypes[] = { };
+    const RW *bitmapTypes;
+    int i;
+    switch (kind) {
+        case rwBitmapGrey:
+        case rwBitmapGrey16:
+            bitmapTypes = &kind;
+            break;
+        default:
+            bitmapTypes = normalTypes;
+    }
+    for (i = 0; i < maxfiles; i++)
+        FindDepth(bitmapTypes[i]);
+}
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index 8bcfcfde5ca0..e9757454f219 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -298,7 +298,7 @@ check_final_bb (void)
 
 	  if ((bb == info.switch_bb
 	       || (single_pred_p (bb) && single_pred (bb) == info.switch_bb))
-	      && !is_gimple_min_invariant (gimple_phi_arg_def (phi, i)))
+	      && !is_gimple_ip_invariant (gimple_phi_arg_def (phi, i)))
 	    {
 	      info.reason = "   Non-invariant value from a case\n";
 	      return false; /* Non-invariant argument.  */
-- 
GitLab