Commit 4fe70b31 by Paolo Bonzini Committed by Paolo Bonzini

cp-tree.h (OMP_ATOMIC_CODE): Delete.

2007-02-05  Paolo Bonzini  <bonzini@gnu.org>

	* cp-tree.h (OMP_ATOMIC_CODE): Delete.
	(OMP_ATOMIC_DEPENDENT_P): Rewrite.
	* pt.c (tsubst_expr): Adjust for new format of dependent OMP_ATOMIC
	expressions.
	* semantics.c (finish_omp_atomic): Store a whole expression node
	in operand 1, and integer_zero_node in operand 0, for dependent
	OMP_ATOMIC.  Rewrite to make flow easier to understand.

From-SVN: r121592
parent 3c1c7aae
2007-02-05 Paolo Bonzini <bonzini@gnu.org>
* cp-tree.h (OMP_ATOMIC_CODE): Delete.
(OMP_ATOMIC_DEPENDENT_P): Rewrite.
* pt.c (tsubst_expr): Adjust for new format of dependent OMP_ATOMIC
expressions.
* semantics.c (finish_omp_atomic): Store a whole expression node
in operand 1, and integer_zero_node in operand 0, for dependent
OMP_ATOMIC. Rewrite to make flow easier to understand.
2007-02-03 Gabriel Dos Reis <gdr@integrable-solutions.net> 2007-02-03 Gabriel Dos Reis <gdr@integrable-solutions.net>
* decl.c (grokdeclarator): Use OPT_Wreturn_type instead of 0. * decl.c (grokdeclarator): Use OPT_Wreturn_type instead of 0.
......
...@@ -3040,13 +3040,9 @@ extern void decl_shadowed_for_var_insert (tree, tree); ...@@ -3040,13 +3040,9 @@ extern void decl_shadowed_for_var_insert (tree, tree);
(TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE))) (TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE)))
/* True for an OMP_ATOMIC that has dependent parameters. These are stored /* True for an OMP_ATOMIC that has dependent parameters. These are stored
as bare LHS/RHS, and not as ADDR/RHS, as in the generic statement. */ as an expr in operand 1, and integer_zero_node in operand 0. */
#define OMP_ATOMIC_DEPENDENT_P(NODE) \ #define OMP_ATOMIC_DEPENDENT_P(NODE) \
(TREE_LANG_FLAG_0 (OMP_ATOMIC_CHECK (NODE))) (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST)
/* Used to store the operation code when OMP_ATOMIC_DEPENDENT_P is set. */
#define OMP_ATOMIC_CODE(NODE) \
(OMP_ATOMIC_CHECK (NODE)->exp.complexity)
/* Used while gimplifying continue statements bound to OMP_FOR nodes. */ /* Used while gimplifying continue statements bound to OMP_FOR nodes. */
#define OMP_FOR_GIMPLIFYING_P(NODE) \ #define OMP_FOR_GIMPLIFYING_P(NODE) \
......
...@@ -8917,12 +8917,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, ...@@ -8917,12 +8917,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
break; break;
case OMP_ATOMIC: case OMP_ATOMIC:
{ if (OMP_ATOMIC_DEPENDENT_P (t))
tree op0, op1; {
op0 = RECUR (TREE_OPERAND (t, 0)); tree op1 = TREE_OPERAND (t, 1);
op1 = RECUR (TREE_OPERAND (t, 1)); tree lhs = RECUR (TREE_OPERAND (op1, 0));
finish_omp_atomic (OMP_ATOMIC_CODE (t), op0, op1); tree rhs = RECUR (TREE_OPERAND (op1, 1));
} finish_omp_atomic (TREE_CODE (op1), lhs, rhs);
}
break; break;
default: default:
......
...@@ -3867,41 +3867,28 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond, ...@@ -3867,41 +3867,28 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
void void
finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) finish_omp_atomic (enum tree_code code, tree lhs, tree rhs)
{ {
tree orig_lhs;
tree orig_rhs;
bool dependent_p;
tree stmt; tree stmt;
orig_lhs = lhs; if (processing_template_decl
orig_rhs = rhs; && (type_dependent_expression_p (lhs)
dependent_p = false; || type_dependent_expression_p (rhs)))
stmt = NULL_TREE; stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node,
build2 (code, void_type_node, lhs, rhs));
/* Even in a template, we can detect invalid uses of the atomic else
pragma if neither LHS nor RHS is type-dependent. */
if (processing_template_decl)
{ {
dependent_p = (type_dependent_expression_p (lhs) /* Even in a template, we can detect invalid uses of the atomic
|| type_dependent_expression_p (rhs)); pragma if neither LHS nor RHS is type-dependent. */
if (!dependent_p) if (processing_template_decl)
{ {
lhs = build_non_dependent_expr (lhs); lhs = build_non_dependent_expr (lhs);
rhs = build_non_dependent_expr (rhs); rhs = build_non_dependent_expr (rhs);
} }
}
if (!dependent_p)
{
stmt = c_finish_omp_atomic (code, lhs, rhs); stmt = c_finish_omp_atomic (code, lhs, rhs);
if (stmt == error_mark_node)
return;
} }
if (processing_template_decl)
{ if (stmt != error_mark_node)
stmt = build2 (OMP_ATOMIC, void_type_node, orig_lhs, orig_rhs); add_stmt (stmt);
OMP_ATOMIC_DEPENDENT_P (stmt) = 1;
OMP_ATOMIC_CODE (stmt) = code;
}
add_stmt (stmt);
} }
void void
......
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