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]

[committed] OpenMP expansion regimplification fix (PR middle-end/85594, PR middle-end/88553)


Hi!

As the testcase shows, even result of force_gimple_operand_gsi
might need regimplification, e.g. if it is ADDR_EXPR of a reference with
a decl with DECL_VALUE_EXPR set.

Fixed thusly.  Additionally, I've noticed the OpenMP 4.5 support broke a
case where we assigned to addressable decl vback some expression and then
wanted to use that t expression rather than vback to avoid having
addressable decl in there, but 4.5 addition inserted code in between that
reused the temporary for something else.  Haven't managed to construct a
testcase quickly for that though.

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

2018-12-21  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/85594
	PR middle-end/88553
	* omp-expand.c (extract_omp_for_update_vars): Regimplify the condition
	if needed.
	(expand_omp_for_generic): Don't clobber t temporary for ordered loops.

	* gcc.dg/gomp/pr85594.c: New test.
	* gcc.dg/gomp/pr88553.c: New test.

--- gcc/omp-expand.c.jj	2018-11-19 14:43:35.710901282 +0100
+++ gcc/omp-expand.c	2018-12-21 16:33:21.732632819 +0100
@@ -2076,6 +2076,11 @@ extract_omp_for_update_vars (struct omp_
 	  t = fold_build2 (fd->loops[i].cond_code, boolean_type_node, v, t);
 	  stmt = gimple_build_cond_empty (t);
 	  gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+	  if (walk_tree (gimple_cond_lhs_ptr (as_a <gcond *> (stmt)),
+			 expand_omp_regimplify_p, NULL, NULL)
+	      || walk_tree (gimple_cond_rhs_ptr (as_a <gcond *> (stmt)),
+			    expand_omp_regimplify_p, NULL, NULL))
+	    gimple_regimplify_operands (stmt, &gsi);
 	  e = make_edge (bb, body_bb, EDGE_TRUE_VALUE);
 	  e->probability = profile_probability::guessed_always ().apply_scale (7, 8);
 	}
@@ -3209,20 +3214,21 @@ expand_omp_for_generic (struct omp_regio
 
 	  if (fd->ordered && counts[fd->collapse - 1] == NULL_TREE)
 	    {
+	      tree tem;
 	      if (fd->collapse > 1)
-		t = fd->loop.v;
+		tem = fd->loop.v;
 	      else
 		{
-		  t = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v),
-				   fd->loops[0].v, fd->loops[0].n1);
-		  t = fold_convert (fd->iter_type, t);
+		  tem = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v),
+				     fd->loops[0].v, fd->loops[0].n1);
+		  tem = fold_convert (fd->iter_type, tem);
 		}
 	      tree aref = build4 (ARRAY_REF, fd->iter_type,
 				  counts[fd->ordered], size_zero_node,
 				  NULL_TREE, NULL_TREE);
-	      t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
-					    true, GSI_SAME_STMT);
-	      expand_omp_build_assign (&gsi, aref, t);
+	      tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE,
+					      true, GSI_SAME_STMT);
+	      expand_omp_build_assign (&gsi, aref, tem);
 	    }
 
 	  t = build2 (fd->loop.cond_code, boolean_type_node,
--- gcc/testsuite/gcc.dg/gomp/pr85594.c.jj	2018-12-21 16:47:08.430529687 +0100
+++ gcc/testsuite/gcc.dg/gomp/pr85594.c	2018-12-21 16:46:59.682670326 +0100
@@ -0,0 +1,5 @@
+/* PR middle-end/85594 */
+/* { dg-do compile } */
+/* { dg-additional-options "-fwrapv" } */
+
+#include "pr81768-2.c"
--- gcc/testsuite/gcc.dg/gomp/pr88553.c.jj	2018-12-21 16:48:02.930653492 +0100
+++ gcc/testsuite/gcc.dg/gomp/pr88553.c	2018-12-21 16:48:20.577369790 +0100
@@ -0,0 +1,5 @@
+/* PR middle-end/88553 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O1 -ftree-loop-vectorize -fwrapv" } */
+
+#include "pr81768-2.c"

	Jakub


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