diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/omp-low.c | 44 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/complex-1.c | 13 |
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; +} |