diff mbox series

[committed] openmp: Avoid floating point comparison at the end of bb with -fnon-call-exceptions [PR96424]

Message ID 20200808091338.GG2363@tucnak
State New
Headers show
Series [committed] openmp: Avoid floating point comparison at the end of bb with -fnon-call-exceptions [PR96424] | expand

Commit Message

Jakub Jelinek Aug. 8, 2020, 9:13 a.m. UTC
Hi!

The following testcase ICEs with -fexceptions -fnon-call-exceptions because
in that mode floating point comparisons should not be done at the end of bb
in GIMPLE_COND.  Fixed by forcing it into a bool SSA_NAME and comparing that against
false.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2020-08-08  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/96424
	* omp-expand.c: Include tree-eh.h.
	(expand_omp_for_init_vars): Handle -fexceptions -fnon-call-exceptions
	by forcing floating point comparison into a bool temporary.

	* c-c++-common/gomp/pr96424.c: New test.


	Jakub
diff mbox series

Patch

--- gcc/omp-expand.c.jj	2020-08-07 10:14:12.325077857 +0200
+++ gcc/omp-expand.c	2020-08-07 10:37:52.162835262 +0200
@@ -58,6 +58,7 @@  along with GCC; see the file COPYING3.
 #include "gimple-pretty-print.h"
 #include "stringpool.h"
 #include "attribs.h"
+#include "tree-eh.h"
 
 /* OMP region information.  Every parallel and workshare
    directive is enclosed between two markers, the OMP_* directive
@@ -2553,10 +2554,23 @@  expand_omp_for_init_vars (struct omp_for
 	      flag_rounding_math = save_flag_rounding_math;
 	      t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE, false,
 					    GSI_CONTINUE_LINKING);
-	      cond_stmt
-		= gimple_build_cond (LT_EXPR, t,
-				     build_zero_cst (double_type_node),
-				     NULL_TREE, NULL_TREE);
+	      if (flag_exceptions
+		  && cfun->can_throw_non_call_exceptions
+		  && operation_could_trap_p (LT_EXPR, true, false, NULL_TREE))
+		{
+		  tree tem = fold_build2 (LT_EXPR, boolean_type_node, t,
+					  build_zero_cst (double_type_node));
+		  tem = force_gimple_operand_gsi (gsi, tem, true, NULL_TREE,
+						  false, GSI_CONTINUE_LINKING);
+		  cond_stmt = gimple_build_cond (NE_EXPR, tem,
+						 boolean_false_node,
+						 NULL_TREE, NULL_TREE);
+		}
+	      else
+		cond_stmt
+		  = gimple_build_cond (LT_EXPR, t,
+				       build_zero_cst (double_type_node),
+				       NULL_TREE, NULL_TREE);
 	      gsi_insert_after (gsi, cond_stmt, GSI_CONTINUE_LINKING);
 	      e = split_block (gsi_bb (*gsi), cond_stmt);
 	      basic_block bb1 = e->src;
--- gcc/testsuite/c-c++-common/gomp/pr96424.c.jj	2020-08-07 11:40:25.966483529 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr96424.c	2020-08-07 11:39:59.245863234 +0200
@@ -0,0 +1,23 @@ 
+/* PR tree-optimization/96424 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O0 -fexceptions -fnon-call-exceptions -fprofile-use -Wno-missing-profile" } */
+
+void
+foo (void)
+{
+  int i, j;
+#pragma omp for collapse (2)
+  for (i = 0; i < 10; ++i)
+    for (j = 0; j <= i; ++j)
+      ;
+}
+
+void
+bar (void)
+{
+  int i, j;
+#pragma omp for collapse (2)
+  for (i = 0; i < 10; ++i)
+    for (j = 0; j < i; ++j)
+      ;
+}