summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/omp-low.c44
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/gomp/complex-1.c13
4 files changed, 68 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e247f0b1218..6edf2cc07b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
CONSTRUCTORs as min invariants.
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index e744a244fe3..f3f4113b98c 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d666489aa3e..dac041bfecb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..0858ac9d3fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/complex-1.c
@@ -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;
+}