re PR tree-optimization/47086 (ICE: verify_flow_info failed: BB 3 can not throw but...
authorJeff Law <law@redhat.com>
Tue, 11 Jan 2011 14:10:54 +0000 (07:10 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 11 Jan 2011 14:10:54 +0000 (07:10 -0700)
* PR tree-optimization/47086
* tree-ssa-loop-ivopts.c (find_givs_in_stmt_scev): Do not record
IVs from statements that might throw.

* PR tree-optimization/47086
* gcc.dg/pr47086.c: New test.

From-SVN: r168659

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr47086.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivopts.c

index e565b2e92e575baccc6c02d95f6bf4f6079e3c76..b372b6c7e68197a4e3dbb9f5178251f211fb6022 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-11  Jeff Law  <law@redhat.com>
+
+       * PR tree-optimization/47086
+       * tree-ssa-loop-ivopts.c (find_givs_in_stmt_scev): Do not record
+       IVs from statements that might throw.
+
 2011-01-10  Jan Hubicka  <jh@suse.cz>
 
        PR lto/45375
index 64f7ad06be2b4d355493ef5db41d8e99a0609daf..710431c8424bb277dd16fce8cf37b6350b37c602 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-11  Jeff Law <law@redhat.com>
+
+       * PR tree-optimization/47086
+       * gcc.dg/pr47086.c: New test.
+
 2011-01-11  Jason Merrill  <jason@redhat.com>
 
        PR c++/46658
diff --git a/gcc/testsuite/gcc.dg/pr47086.c b/gcc/testsuite/gcc.dg/pr47086.c
new file mode 100644 (file)
index 0000000..71743fe
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fexceptions -fnon-call-exceptions -ftrapv" } */
+
+void
+foo ()
+{
+  int n = 0;
+  while (1)
+    {
+      int i[n % 1];
+      n++;
+    }
+}
+
index 59e2fef5976b4b27c19e846309a4716e237b1836..479b46fb8dcd450963f3fabcc7f723814bf78667 100644 (file)
@@ -1,5 +1,5 @@
 /* Induction variable optimizations.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -1102,6 +1102,12 @@ find_givs_in_stmt_scev (struct ivopts_data *data, gimple stmt, affine_iv *iv)
       || contains_abnormal_ssa_name_p (iv->step))
     return false;
 
+  /* If STMT could throw, then do not consider STMT as defining a GIV.  
+     While this will suppress optimizations, we can not safely delete this
+     GIV and associated statements, even if it appears it is not used.  */
+  if (stmt_could_throw_p (stmt))
+    return false;
+
   return true;
 }