OSDN Git Service

2013-04-03 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Apr 2013 12:02:56 +0000 (12:02 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Apr 2013 12:02:56 +0000 (12:02 +0000)
PR tree-optimization/56501
* tree-switch-conversion.c (check_process_case): Properly
handle !single_succ_p case.

* gcc.dg/torture/pr56501.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@197405 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr56501.c [new file with mode: 0644]
gcc/tree-switch-conversion.c

index d9a748f..42b104b 100644 (file)
@@ -1,3 +1,9 @@
+2013-04-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56501
+       * tree-switch-conversion.c (check_process_case): Properly
+       handle !single_succ_p case.
+
 2013-04-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index a7e62e4..a469035 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56501
+       * gcc.dg/torture/pr56501.c: New testcase.
+
 2013-04-03  Tobias Burnus  <burnus@net-b.de>
 
        Backport from mainline:
diff --git a/gcc/testsuite/gcc.dg/torture/pr56501.c b/gcc/testsuite/gcc.dg/torture/pr56501.c
new file mode 100644 (file)
index 0000000..d6fc29d
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+int a;
+void try_help () __attribute__ ((__noreturn__));
+void try_help ()
+{
+}
+
+int main ()
+{
+  switch (a)
+    {
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+      case '8':
+      case '9':
+         break;
+      default:
+         try_help ();
+    }
+}
index 4fb3e8a..20888d2 100644 (file)
@@ -283,7 +283,12 @@ check_process_case (tree cs)
          return false;
        }
 
-      e = single_succ_edge (label_bb);
+      if (!single_succ_p (label_bb))
+       {
+         info.reason
+           = "  Bad case - a non-final BB without a single successor\n";
+         return false;
+       }
       following_bb = single_succ (label_bb);
     }