From 0645c1a22d29fcbe12ee8f774709b20b1bc3f594 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Thu, 17 Oct 2013 17:41:07 +0000 Subject: [PATCH] tree-flow.h (struct omp_region): Move to omp-low.c. * tree-flow.h (struct omp_region): Move to omp-low.c. Remove omp_ prototypes and variables. * gimple.h (omp_reduction_init): Move prototype to omp-low.h. (copy_var_decl): Relocate prototype from tree-flow.h. * gimple.c (copy_var_decl): Relocate from omp-low.c. * tree.h: Move prototype to omp-low.h. * omp-low.h: New File. Relocate prototypes here. * omp-low.c (struct omp_region): Make local here. (root_omp_region): Make static. (copy_var_decl) Move to gimple.c. (new_omp_region): Make static. (make_gimple_omp_edges): New. Refactored from tree-cfg.c make_edges. * tree-cfg.c: Include omp-low.h. (make_edges): Factor out OMP specific bits to make_gimple_omp_edges. * gimplify.c: Include omp-low.h. * tree-parloops.c: Likewise. c * c-parser.c: Include omp-low.h. * c-typeck.c: Likewise. cp * parser.c: Include omp-low.h. * semantics.c: Likewise. fortran * trans-openmp.c: Include omp-low.h. From-SVN: r203786 --- gcc/ChangeLog | 19 ++++ gcc/c/ChangeLog | 5 ++ gcc/c/c-parser.c | 1 + gcc/c/c-typeck.c | 1 + gcc/cp/ChangeLog | 5 ++ gcc/cp/parser.c | 1 + gcc/cp/semantics.c | 1 + gcc/fortran/ChangeLog | 4 + gcc/fortran/trans-openmp.c | 1 + gcc/gimple.c | 21 +++++ gcc/gimple.h | 4 +- gcc/gimplify.c | 1 + gcc/omp-low.c | 180 ++++++++++++++++++++++++++++++++----- gcc/omp-low.h | 31 +++++++ gcc/tree-cfg.c | 97 +------------------- gcc/tree-flow.h | 50 ----------- gcc/tree-parloops.c | 1 + gcc/tree.h | 1 - 18 files changed, 254 insertions(+), 170 deletions(-) create mode 100644 gcc/omp-low.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fdf943d6d0d..2e1db73c24a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2013-10-17 Andrew MacLeod + + * tree-flow.h (struct omp_region): Move to omp-low.c. + Remove omp_ prototypes and variables. + * gimple.h (omp_reduction_init): Move prototype to omp-low.h. + (copy_var_decl): Relocate prototype from tree-flow.h. + * gimple.c (copy_var_decl): Relocate from omp-low.c. + * tree.h: Move prototype to omp-low.h. + * omp-low.h: New File. Relocate prototypes here. + * omp-low.c (struct omp_region): Make local here. + (root_omp_region): Make static. + (copy_var_decl) Move to gimple.c. + (new_omp_region): Make static. + (make_gimple_omp_edges): New. Refactored from tree-cfg.c make_edges. + * tree-cfg.c: Include omp-low.h. + (make_edges): Factor out OMP specific bits to make_gimple_omp_edges. + * gimplify.c: Include omp-low.h. + * tree-parloops.c: Likewise. + 2013-10-17 Uros Bizjak * config/i386/i386.c (ix86_fixup_binary_operands): When both source diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 62f3f9f6212..0e2409aa182 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2013-10-17 Andrew MacLeod + + * c-parser.c: Include omp-low.h. + * c-typeck.c: Likewise. + 2013-10-17 Marek Polacek PR c/58267 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 7545067a019..9b6abe0e95e 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see #include "target.h" #include "cgraph.h" #include "plugin.h" +#include "omp-low.h" /* Initialization routine for this file. */ diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 16e39b2ad70..1d83137cd3f 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see #include "bitmap.h" #include "gimple.h" #include "tree-inline.h" +#include "omp-low.h" #include "c-family/c-objc.h" #include "c-family/c-common.h" #include "c-family/c-ubsan.h" diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3ce68e8e75c..4a5043a5f5b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-10-17 Andrew MacLeod + + * parser.c: Include omp-low.h. + * semantics.c: Likewise. + 2013-10-17 Paolo Carlini PR c++/58596 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e33f5a278ab..54520b414e7 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pretty-print.h" #include "parser.h" #include "type-utils.h" +#include "omp-low.h" /* The lexer. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 41965b643b0..e56052d4fda 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple.h" #include "bitmap.h" #include "hash-table.h" +#include "omp-low.h" static bool verify_constant (tree, bool, bool *, bool *); #define VERIFY_CONSTANT(X) \ diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 068a11d49bb..067d1fdca5b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,7 @@ +2013-10-17 Andrew MacLeod + + * trans-openmp.c: Include omp-low.h. + 2013-10-16 Tobias Burnus PR fortran/58652 diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 1c4ae62a3d9..bf282498eab 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "trans-array.h" #include "trans-const.h" #include "arith.h" +#include "omp-low.h" int ompws_flags; diff --git a/gcc/gimple.c b/gcc/gimple.c index 9bc62c0026b..573dbb1fc5b 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4063,3 +4063,24 @@ nonfreeing_call_p (gimple call) return false; } + +/* Create a new VAR_DECL and copy information from VAR to it. */ + +tree +copy_var_decl (tree var, tree name, tree type) +{ + tree copy = build_decl (DECL_SOURCE_LOCATION (var), VAR_DECL, name, type); + + TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (var); + TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (var); + DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (var); + DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (var); + DECL_IGNORED_P (copy) = DECL_IGNORED_P (var); + DECL_CONTEXT (copy) = DECL_CONTEXT (var); + TREE_NO_WARNING (copy) = TREE_NO_WARNING (var); + TREE_USED (copy) = 1; + DECL_SEEN_IN_BIND_EXPR_P (copy) = 1; + DECL_ATTRIBUTES (copy) = DECL_ATTRIBUTES (var); + + return copy; +} diff --git a/gcc/gimple.h b/gcc/gimple.h index c0c19ce995a..ea7858e4524 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -1086,9 +1086,7 @@ extern tree canonicalize_cond_expr_cond (tree); extern void dump_decl_set (FILE *, bitmap); extern bool gimple_can_coalesce_p (tree, tree); extern bool nonfreeing_call_p (gimple); - -/* In omp-low.c. */ -extern tree omp_reduction_init (tree, tree); +extern tree copy_var_decl (tree, tree, tree); /* In trans-mem.c. */ extern void diagnose_tm_safe_errors (tree); diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 9bc42e46a7d..a67f1a3746e 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see #include "pointer-set.h" #include "splay-tree.h" #include "vec.h" +#include "omp-low.h" #include "langhooks-def.h" /* FIXME: for lhd_set_decl_assembler_name */ #include "tree-pass.h" /* FIXME: only for PROP_gimple_any */ diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 26f0c35e285..208f20c407d 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "optabs.h" #include "cfgloop.h" #include "target.h" +#include "omp-low.h" /* Lowering of OpenMP parallel and workshare constructs proceeds in two @@ -56,6 +57,45 @@ along with GCC; see the file COPYING3. If not see scanned for parallel regions which are then moved to a new function, to be invoked by the thread library. */ +/* Parallel region information. Every parallel and workshare + directive is enclosed between two markers, the OMP_* directive + and a corresponding OMP_RETURN statement. */ + +struct omp_region +{ + /* The enclosing region. */ + struct omp_region *outer; + + /* First child region. */ + struct omp_region *inner; + + /* Next peer region. */ + struct omp_region *next; + + /* Block containing the omp directive as its last stmt. */ + basic_block entry; + + /* Block containing the OMP_RETURN as its last stmt. */ + basic_block exit; + + /* Block containing the OMP_CONTINUE as its last stmt. */ + basic_block cont; + + /* If this is a combined parallel+workshare region, this is a list + of additional arguments needed by the combined parallel+workshare + library call. */ + vec *ws_args; + + /* The code for the omp directive of this region. */ + enum gimple_code type; + + /* Schedule kind, only used for OMP_FOR type regions. */ + enum omp_clause_schedule_kind sched_kind; + + /* True if this is a combined parallel+workshare region. */ + bool is_combined_parallel; +}; + /* Context structure. Used to store information about each parallel directive in the code. */ @@ -135,7 +175,7 @@ struct omp_for_data static splay_tree all_contexts; static int taskreg_nesting_level; static int target_nesting_level; -struct omp_region *root_omp_region; +static struct omp_region *root_omp_region; static bitmap task_shared_vars; static void scan_omp (gimple_seq *, omp_context *); @@ -872,27 +912,6 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) return false; } -/* Create a new VAR_DECL and copy information from VAR to it. */ - -tree -copy_var_decl (tree var, tree name, tree type) -{ - tree copy = build_decl (DECL_SOURCE_LOCATION (var), VAR_DECL, name, type); - - TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (var); - TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (var); - DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (var); - DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (var); - DECL_IGNORED_P (copy) = DECL_IGNORED_P (var); - DECL_CONTEXT (copy) = DECL_CONTEXT (var); - TREE_NO_WARNING (copy) = TREE_NO_WARNING (var); - TREE_USED (copy) = 1; - DECL_SEEN_IN_BIND_EXPR_P (copy) = 1; - DECL_ATTRIBUTES (copy) = DECL_ATTRIBUTES (var); - - return copy; -} - /* Construct a new automatic decl similar to VAR. */ static tree @@ -1219,7 +1238,7 @@ debug_all_omp_regions (void) /* Create a new parallel region starting at STMT inside region PARENT. */ -struct omp_region * +static struct omp_region * new_omp_region (basic_block bb, enum gimple_code type, struct omp_region *parent) { @@ -10312,6 +10331,121 @@ diagnose_sb_2 (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, return NULL_TREE; } +/* Called from tree-cfg.c::make_edges to create cfg edges for all GIMPLE_OMP + codes. */ +bool +make_gimple_omp_edges (basic_block bb, struct omp_region **region) +{ + gimple last = last_stmt (bb); + enum gimple_code code = gimple_code (last); + struct omp_region *cur_region = *region; + bool fallthru = false; + + switch (code) + { + case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TASK: + case GIMPLE_OMP_FOR: + case GIMPLE_OMP_SINGLE: + case GIMPLE_OMP_TEAMS: + case GIMPLE_OMP_MASTER: + case GIMPLE_OMP_TASKGROUP: + case GIMPLE_OMP_ORDERED: + case GIMPLE_OMP_CRITICAL: + case GIMPLE_OMP_SECTION: + cur_region = new_omp_region (bb, code, cur_region); + fallthru = true; + break; + + case GIMPLE_OMP_TARGET: + cur_region = new_omp_region (bb, code, cur_region); + fallthru = true; + if (gimple_omp_target_kind (last) == GF_OMP_TARGET_KIND_UPDATE) + cur_region = cur_region->outer; + break; + + case GIMPLE_OMP_SECTIONS: + cur_region = new_omp_region (bb, code, cur_region); + fallthru = true; + break; + + case GIMPLE_OMP_SECTIONS_SWITCH: + fallthru = false; + break; + + case GIMPLE_OMP_ATOMIC_LOAD: + case GIMPLE_OMP_ATOMIC_STORE: + fallthru = true; + break; + + case GIMPLE_OMP_RETURN: + /* In the case of a GIMPLE_OMP_SECTION, the edge will go + somewhere other than the next block. This will be + created later. */ + cur_region->exit = bb; + fallthru = cur_region->type != GIMPLE_OMP_SECTION; + cur_region = cur_region->outer; + break; + + case GIMPLE_OMP_CONTINUE: + cur_region->cont = bb; + switch (cur_region->type) + { + case GIMPLE_OMP_FOR: + /* Mark all GIMPLE_OMP_FOR and GIMPLE_OMP_CONTINUE + succs edges as abnormal to prevent splitting + them. */ + single_succ_edge (cur_region->entry)->flags |= EDGE_ABNORMAL; + /* Make the loopback edge. */ + make_edge (bb, single_succ (cur_region->entry), + EDGE_ABNORMAL); + + /* Create an edge from GIMPLE_OMP_FOR to exit, which + corresponds to the case that the body of the loop + is not executed at all. */ + make_edge (cur_region->entry, bb->next_bb, EDGE_ABNORMAL); + make_edge (bb, bb->next_bb, EDGE_FALLTHRU | EDGE_ABNORMAL); + fallthru = false; + break; + + case GIMPLE_OMP_SECTIONS: + /* Wire up the edges into and out of the nested sections. */ + { + basic_block switch_bb = single_succ (cur_region->entry); + + struct omp_region *i; + for (i = cur_region->inner; i ; i = i->next) + { + gcc_assert (i->type == GIMPLE_OMP_SECTION); + make_edge (switch_bb, i->entry, 0); + make_edge (i->exit, bb, EDGE_FALLTHRU); + } + + /* Make the loopback edge to the block with + GIMPLE_OMP_SECTIONS_SWITCH. */ + make_edge (bb, switch_bb, 0); + + /* Make the edge from the switch to exit. */ + make_edge (switch_bb, bb->next_bb, 0); + fallthru = false; + } + break; + + default: + gcc_unreachable (); + } + break; + + default: + gcc_unreachable (); + } + + if (*region != cur_region) + *region = cur_region; + + return fallthru; +} + static unsigned int diagnose_omp_structured_block_errors (void) { diff --git a/gcc/omp-low.h b/gcc/omp-low.h new file mode 100644 index 00000000000..6b5a2ff304d --- /dev/null +++ b/gcc/omp-low.h @@ -0,0 +1,31 @@ +/* Header file for openMP lowering directives. + Copyright (C) 2013 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#ifndef GCC_OMP_LOW_H +#define GCC_OMP_LOW_H + +struct omp_region; + +extern tree find_omp_clause (tree, enum omp_clause_code); +extern void omp_expand_local (basic_block); +extern void free_omp_regions (void); +extern tree omp_reduction_init (tree, tree); +extern bool make_gimple_omp_edges (basic_block, struct omp_region **); + +#endif /* GCC_OMP_LOW_H */ diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 8b667917747..9268615395a 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-inline.h" #include "target.h" #include "tree-ssa-live.h" +#include "omp-low.h" /* This file contains functions for building the Control Flow Graph (CFG) for a function tree. */ @@ -607,97 +608,8 @@ make_edges (void) fallthru = true; break; - case GIMPLE_OMP_PARALLEL: - case GIMPLE_OMP_TASK: - case GIMPLE_OMP_FOR: - case GIMPLE_OMP_SINGLE: - case GIMPLE_OMP_TEAMS: - case GIMPLE_OMP_MASTER: - case GIMPLE_OMP_TASKGROUP: - case GIMPLE_OMP_ORDERED: - case GIMPLE_OMP_CRITICAL: - case GIMPLE_OMP_SECTION: - cur_region = new_omp_region (bb, code, cur_region); - fallthru = true; - break; - - case GIMPLE_OMP_TARGET: - cur_region = new_omp_region (bb, code, cur_region); - fallthru = true; - if (gimple_omp_target_kind (last) == GF_OMP_TARGET_KIND_UPDATE) - cur_region = cur_region->outer; - break; - - case GIMPLE_OMP_SECTIONS: - cur_region = new_omp_region (bb, code, cur_region); - fallthru = true; - break; - - case GIMPLE_OMP_SECTIONS_SWITCH: - fallthru = false; - break; - - case GIMPLE_OMP_ATOMIC_LOAD: - case GIMPLE_OMP_ATOMIC_STORE: - fallthru = true; - break; - - case GIMPLE_OMP_RETURN: - /* In the case of a GIMPLE_OMP_SECTION, the edge will go - somewhere other than the next block. This will be - created later. */ - cur_region->exit = bb; - fallthru = cur_region->type != GIMPLE_OMP_SECTION; - cur_region = cur_region->outer; - break; - - case GIMPLE_OMP_CONTINUE: - cur_region->cont = bb; - switch (cur_region->type) - { - case GIMPLE_OMP_FOR: - /* Mark all GIMPLE_OMP_FOR and GIMPLE_OMP_CONTINUE - succs edges as abnormal to prevent splitting - them. */ - single_succ_edge (cur_region->entry)->flags |= EDGE_ABNORMAL; - /* Make the loopback edge. */ - make_edge (bb, single_succ (cur_region->entry), - EDGE_ABNORMAL); - - /* Create an edge from GIMPLE_OMP_FOR to exit, which - corresponds to the case that the body of the loop - is not executed at all. */ - make_edge (cur_region->entry, bb->next_bb, EDGE_ABNORMAL); - make_edge (bb, bb->next_bb, EDGE_FALLTHRU | EDGE_ABNORMAL); - fallthru = false; - break; - - case GIMPLE_OMP_SECTIONS: - /* Wire up the edges into and out of the nested sections. */ - { - basic_block switch_bb = single_succ (cur_region->entry); - - struct omp_region *i; - for (i = cur_region->inner; i ; i = i->next) - { - gcc_assert (i->type == GIMPLE_OMP_SECTION); - make_edge (switch_bb, i->entry, 0); - make_edge (i->exit, bb, EDGE_FALLTHRU); - } - - /* Make the loopback edge to the block with - GIMPLE_OMP_SECTIONS_SWITCH. */ - make_edge (bb, switch_bb, 0); - - /* Make the edge from the switch to exit. */ - make_edge (switch_bb, bb->next_bb, 0); - fallthru = false; - } - break; - - default: - gcc_unreachable (); - } + CASE_GIMPLE_OMP: + fallthru = make_gimple_omp_edges (bb, &cur_region); break; case GIMPLE_TRANSACTION: @@ -721,8 +633,7 @@ make_edges (void) make_edge (bb, bb->next_bb, EDGE_FALLTHRU); } - if (root_omp_region) - free_omp_regions (); + free_omp_regions (); /* Fold COND_EXPR_COND of each COND_EXPR. */ fold_cond_expr_cond (); diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 5ea5d06c4b3..d849c2944bc 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -37,56 +37,6 @@ along with GCC; see the file COPYING3. If not see #include "tree-into-ssa.h" #include "tree-ssa-loop.h" -/*--------------------------------------------------------------------------- - OpenMP Region Tree ----------------------------------------------------------------------------*/ - -/* Parallel region information. Every parallel and workshare - directive is enclosed between two markers, the OMP_* directive - and a corresponding OMP_RETURN statement. */ - -struct omp_region -{ - /* The enclosing region. */ - struct omp_region *outer; - - /* First child region. */ - struct omp_region *inner; - - /* Next peer region. */ - struct omp_region *next; - - /* Block containing the omp directive as its last stmt. */ - basic_block entry; - - /* Block containing the OMP_RETURN as its last stmt. */ - basic_block exit; - - /* Block containing the OMP_CONTINUE as its last stmt. */ - basic_block cont; - - /* If this is a combined parallel+workshare region, this is a list - of additional arguments needed by the combined parallel+workshare - library call. */ - vec *ws_args; - - /* The code for the omp directive of this region. */ - enum gimple_code type; - - /* Schedule kind, only used for OMP_FOR type regions. */ - enum omp_clause_schedule_kind sched_kind; - - /* True if this is a combined parallel+workshare region. */ - bool is_combined_parallel; -}; - -extern struct omp_region *root_omp_region; -extern struct omp_region *new_omp_region (basic_block, enum gimple_code, - struct omp_region *); -extern void free_omp_regions (void); -void omp_expand_local (basic_block); -tree copy_var_decl (tree, tree, tree); - /* Location to track pending stmt for edge insertion. */ #define PENDING_STMT(e) ((e)->insns.g) diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index 056950dd066..cdef5c62fbe 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-vectorizer.h" #include "tree-hasher.h" #include "tree-parloops.h" +#include "omp-low.h" /* This pass tries to distribute iterations of loops into several threads. The implementation is straightforward -- for each loop we test whether its diff --git a/gcc/tree.h b/gcc/tree.h index 2b6e762cbe8..2f4514d6a74 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3553,7 +3553,6 @@ extern tree build_translation_unit_decl (tree); extern tree build_block (tree, tree, tree, tree); extern tree build_empty_stmt (location_t); extern tree build_omp_clause (location_t, enum omp_clause_code); -extern tree find_omp_clause (tree, enum omp_clause_code); extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL); #define build_vl_exp(c, n) build_vl_exp_stat (c, n MEM_STAT_INFO)