diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2007-02-05 07:57:49 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2007-02-05 07:57:49 +0000 |
commit | 4fe70b3151497166c316c45e5eec842f9de3a3f2 (patch) | |
tree | 72e2ca11bf540b559a9b8d7dbb132697b28c88ff /gcc | |
parent | 3c1c7aaea2a967a51f6ec39b39bbd8d4fa6d6aed (diff) | |
download | gcc-4fe70b3151497166c316c45e5eec842f9de3a3f2.zip gcc-4fe70b3151497166c316c45e5eec842f9de3a3f2.tar.gz gcc-4fe70b3151497166c316c45e5eec842f9de3a3f2.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 39 |
4 files changed, 32 insertions, 38 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c5e6880..bd78f58 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +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> * decl.c (grokdeclarator): Use OPT_Wreturn_type instead of 0. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 7eb26c5..4de73ff 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3040,13 +3040,9 @@ extern void decl_shadowed_for_var_insert (tree, tree); (TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE))) /* 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) \ - (TREE_LANG_FLAG_0 (OMP_ATOMIC_CHECK (NODE))) - -/* Used to store the operation code when OMP_ATOMIC_DEPENDENT_P is set. */ -#define OMP_ATOMIC_CODE(NODE) \ - (OMP_ATOMIC_CHECK (NODE)->exp.complexity) + (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST) /* Used while gimplifying continue statements bound to OMP_FOR nodes. */ #define OMP_FOR_GIMPLIFYING_P(NODE) \ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 21e014b..ba20353 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8917,12 +8917,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, break; case OMP_ATOMIC: - { - tree op0, op1; - op0 = RECUR (TREE_OPERAND (t, 0)); - op1 = RECUR (TREE_OPERAND (t, 1)); - finish_omp_atomic (OMP_ATOMIC_CODE (t), op0, op1); - } + if (OMP_ATOMIC_DEPENDENT_P (t)) + { + tree op1 = TREE_OPERAND (t, 1); + tree lhs = RECUR (TREE_OPERAND (op1, 0)); + tree rhs = RECUR (TREE_OPERAND (op1, 1)); + finish_omp_atomic (TREE_CODE (op1), lhs, rhs); + } break; default: diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fea3341..326bcfb 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3867,41 +3867,28 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond, void finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) { - tree orig_lhs; - tree orig_rhs; - bool dependent_p; tree stmt; - orig_lhs = lhs; - orig_rhs = rhs; - dependent_p = false; - stmt = NULL_TREE; - - /* Even in a template, we can detect invalid uses of the atomic - pragma if neither LHS nor RHS is type-dependent. */ - if (processing_template_decl) + if (processing_template_decl + && (type_dependent_expression_p (lhs) + || type_dependent_expression_p (rhs))) + stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node, + build2 (code, void_type_node, lhs, rhs)); + else { - dependent_p = (type_dependent_expression_p (lhs) - || type_dependent_expression_p (rhs)); - if (!dependent_p) + /* Even in a template, we can detect invalid uses of the atomic + pragma if neither LHS nor RHS is type-dependent. */ + if (processing_template_decl) { lhs = build_non_dependent_expr (lhs); rhs = build_non_dependent_expr (rhs); } - } - if (!dependent_p) - { + stmt = c_finish_omp_atomic (code, lhs, rhs); - if (stmt == error_mark_node) - return; } - if (processing_template_decl) - { - stmt = build2 (OMP_ATOMIC, void_type_node, orig_lhs, orig_rhs); - OMP_ATOMIC_DEPENDENT_P (stmt) = 1; - OMP_ATOMIC_CODE (stmt) = code; - } - add_stmt (stmt); + + if (stmt != error_mark_node) + add_stmt (stmt); } void |