This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PR tree-opt/33615 [2/2] Hoisting of throwing expression for -fnon-call-exceptions


Following on from:

    http://gcc.gnu.org/ml/gcc-patches/2007-10/msg00085.html

this second patch fixes the PRE case.  Bootstrapped & regression-tested
on x86_64-linux-gnu.  Also regression-tested on mipsisa32-elf.  OK to
install?

Richard


gcc/
	PR tree-optimization/33615
	* tree-ssa-pre.c (compute_avail): Don't call make_values_for_stmt
	if the statement might throw.  Fix formatting.

gcc/testsuite/
	PR tree-optimization/33615
	* g++.dg/tree-ssa/pr33615-2.C: New test.

Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c	2007-10-01 23:23:08.000000000 +0100
+++ gcc/tree-ssa-pre.c	2007-10-01 23:44:10.000000000 +0100
@@ -3555,10 +3555,11 @@ compute_avail (void)
 	    }
 
 	  else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
-	      && !ann->has_volatile_ops
-	      && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME
-	      && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI
-		   (GIMPLE_STMT_OPERAND (stmt, 0)))
+		   && !ann->has_volatile_ops
+		   && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME
+		   && (!SSA_NAME_OCCURS_IN_ABNORMAL_PHI
+		       (GIMPLE_STMT_OPERAND (stmt, 0)))
+		   && !tree_could_throw_p (stmt))
 	    {
 	      if (make_values_for_stmt (stmt, block))
 		continue;
Index: gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C
===================================================================
--- /dev/null	2007-09-27 09:37:00.556097250 +0100
+++ gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C	2007-10-01 23:44:10.000000000 +0100
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -fdump-tree-pre-details -w" } */
+
+extern volatile int y;
+
+double
+foo (double a, int x)
+{
+  while (x--)
+    {
+      y++;
+      a += 1.0 / 0.0;
+    }
+  return a;
+}
+
+// The expression 1.0 / 0.0 should not be treated as a loop invariant
+// if it may throw an exception.
+// { dg-final { scan-tree-dump-times "Replaced 1\\\.0e\\\+0 / 0\\\.0" 0 "pre" } }
+// { dg-final { cleanup-tree-dump "pre" } }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]