]> gcc.gnu.org Git - gcc.git/commitdiff
re PR middle-end/30143 ([4.2 only] OpenMP can produce invalid gimple)
authorAndrew Pinski <pinskia@gmail.com>
Wed, 20 Dec 2006 17:50:17 +0000 (09:50 -0800)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Wed, 20 Dec 2006 17:50:17 +0000 (09:50 -0800)
2006-12-20  Andrew Pinski  <pinskia@gmail.com>

        PR middle-end/30143
        * omp-low.c (init_tmp_var): New function.
        (save_tmp_var): New function.
        (lower_omp_1): Use them for VAR_DECL.

2006-12-20  Andrew Pinski  <pinskia@gmail.com>

        PR middle-end/30143
        * gcc.dg/gomp/complex-1.c: New testcase.

From-SVN: r120080

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/complex-1.c [new file with mode: 0644]

index e247f0b121820a63e43ee25f776e4e099fdd9a49..6edf2cc07b3454889f0facba2fcb7609fe766460 100644 (file)
@@ -1,3 +1,10 @@
+2006-12-20  Andrew Pinski  <pinskia@gmail.com>
+
+       PR middle-end/30143
+       * omp-low.c (init_tmp_var): New function.       
+       (save_tmp_var): New function.
+       (lower_omp_1): Use them for VAR_DECL.
+
 2006-12-20  Andrew Pinski  <pinskia@gmail.com>
 
        * tree-gimple.c (is_gimple_min_invariant): Treat constant vector
index e744a244fe374aab8ec7d38c57eb1e5babba40f0..f3f4113b98c4bd85cef1c1dcb083dfd720e603bb 100644 (file)
@@ -4190,6 +4190,38 @@ lower_regimplify (tree *tp, struct walk_stmt_info *wi)
     tsi_link_before (&wi->tsi, pre, TSI_SAME_STMT);
 }
 
+/* Copy EXP into a temporary.  Insert the initialization statement before TSI.  */
+
+static tree
+init_tmp_var (tree exp, tree_stmt_iterator *tsi)
+{
+  tree t, stmt;
+
+  t = create_tmp_var (TREE_TYPE (exp), NULL);
+  DECL_GIMPLE_REG_P (t) = 1;
+  stmt = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (t), t, exp);
+  SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi)));
+  tsi_link_before (tsi, stmt, TSI_SAME_STMT);
+
+  return t;
+}
+
+/* Similarly, but copy from the temporary and insert the statement
+   after the iterator.  */
+
+static tree
+save_tmp_var (tree exp, tree_stmt_iterator *tsi)
+{
+  tree t, stmt;
+
+  t = create_tmp_var (TREE_TYPE (exp), NULL);
+  DECL_GIMPLE_REG_P (t) = 1;
+  stmt = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (t), exp, t);
+  SET_EXPR_LOCUS (stmt, EXPR_LOCUS (tsi_stmt (*tsi)));
+  tsi_link_after (tsi, stmt, TSI_SAME_STMT);
+
+  return t;
+}
 
 /* Callback for walk_stmts.  Lower the OpenMP directive pointed by TP.  */
 
@@ -4255,7 +4287,17 @@ lower_omp_1 (tree *tp, int *walk_subtrees, void *data)
 
     case VAR_DECL:
       if (ctx && DECL_HAS_VALUE_EXPR_P (t))
-       lower_regimplify (tp, wi);
+       {
+         lower_regimplify (&t, wi);
+         if (wi->val_only)
+           {
+             if (wi->is_lhs)
+               t = save_tmp_var (t, &wi->tsi);
+             else
+               t = init_tmp_var (t, &wi->tsi);
+           }
+         *tp = t;
+       }
       break;
 
     case ADDR_EXPR:
index d666489aa3e4c65a9248138eac0fcf3a7ae15db0..dac041bfecbf1a09c134685d2702cf398c8291a8 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-20  Andrew Pinski  <pinskia@gmail.com>
+
+       PR middle-end/30143
+       * gcc.dg/gomp/complex-1.c: New testcase.
+
 2006-12-20  Roger Sayle  <roger@eyesopen.com>
 
        * gfortran.dg/array_memset_1.f90: New test case.
diff --git a/gcc/testsuite/gcc.dg/gomp/complex-1.c b/gcc/testsuite/gcc.dg/gomp/complex-1.c
new file mode 100644 (file)
index 0000000..0858ac9
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O1" } */
+/* PR middle-end/30143 */
+
+
+int f (int n)
+{
+  int i;
+  _Complex float t;
+#pragma omp parallel
+    for (i = 1; i < n - 1; ++i)
+      t+=1;
+}
This page took 0.167205 seconds and 5 git commands to generate.