Commit 75a4c3c1 by Andrew Pinski Committed by Andrew Pinski

re PR middle-end/30143 ([4.2 only] OpenMP can produce invalid gimple)

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
parent 1863bbca
2006-12-20 Andrew Pinski <pinskia@gmail.com> 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 * tree-gimple.c (is_gimple_min_invariant): Treat constant vector
CONSTRUCTORs as min invariants. CONSTRUCTORs as min invariants.
......
...@@ -4190,6 +4190,38 @@ lower_regimplify (tree *tp, struct walk_stmt_info *wi) ...@@ -4190,6 +4190,38 @@ lower_regimplify (tree *tp, struct walk_stmt_info *wi)
tsi_link_before (&wi->tsi, pre, TSI_SAME_STMT); 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. */ /* 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) ...@@ -4255,7 +4287,17 @@ lower_omp_1 (tree *tp, int *walk_subtrees, void *data)
case VAR_DECL: case VAR_DECL:
if (ctx && DECL_HAS_VALUE_EXPR_P (t)) 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; break;
case ADDR_EXPR: case ADDR_EXPR:
......
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> 2006-12-20 Roger Sayle <roger@eyesopen.com>
* gfortran.dg/array_memset_1.f90: New test case. * gfortran.dg/array_memset_1.f90: New test case.
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment