| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fcompare-debug -w" } */ |
| |
| typedef union tree_node *tree; |
| typedef unsigned int source_location; |
| enum tree_code |
| { |
| MINUS_EXPR, |
| MULT_EXPR, |
| }; |
| struct tree_omp_clause |
| { |
| union omp_clause_subcode |
| { |
| enum tree_code reduction_code; |
| } subcode; |
| }; |
| union tree_node |
| { |
| struct tree_omp_clause omp_clause; |
| }; |
| enum tree_index |
| { |
| TI_ERROR_MARK, |
| }; |
| typedef struct |
| { |
| unsigned allocatable:1; |
| unsigned dimension:1; |
| unsigned codimension:1; |
| unsigned external:1; |
| unsigned optional:1; |
| unsigned pointer:1; |
| unsigned contiguous:1; |
| unsigned referenced:1; |
| } symbol_attribute; |
| typedef unsigned int gfc_char_t; |
| typedef struct gfc_linebuf |
| { |
| source_location location; |
| } gfc_linebuf; |
| typedef struct |
| { |
| gfc_char_t *nextc; |
| gfc_linebuf *lb; |
| } locus; |
| typedef struct |
| { |
| struct gfc_symbol *sym; |
| struct gfc_namelist *next; |
| } gfc_namelist; |
| enum |
| { |
| OMP_LIST_PLUS, |
| OMP_LIST_REDUCTION_FIRST = OMP_LIST_PLUS, |
| OMP_LIST_MULT, |
| OMP_LIST_SUB, |
| OMP_LIST_NUM |
| }; |
| typedef struct gfc_omp_clauses |
| { |
| gfc_namelist *lists[OMP_LIST_NUM]; |
| } gfc_omp_clauses; |
| typedef struct gfc_symbol |
| { |
| symbol_attribute attr; |
| } gfc_symbol; |
| typedef struct gfc_code |
| { |
| locus loc; |
| union |
| { |
| gfc_omp_clauses *omp_clauses; |
| } ext; |
| } gfc_code; |
| typedef struct |
| { |
| } stmtblock_t; |
| |
| static tree |
| gfc_trans_omp_reduction_list (gfc_namelist * namelist, tree list, |
| enum tree_code reduction_code, locus where) |
| { |
| for (; namelist != ((void *) 0); namelist = namelist->next) |
| if (namelist->sym->attr.referenced) |
| { |
| tree node = build_omp_clause (where.lb->location); |
| node->omp_clause.subcode.reduction_code = reduction_code; |
| gfc_trans_omp_array_reduction (namelist->sym, where); |
| } |
| } |
| |
| static tree |
| gfc_trans_omp_clauses (stmtblock_t * block, gfc_omp_clauses * clauses, |
| locus where) |
| { |
| tree omp_clauses = (tree) ((void *) 0); |
| int list; |
| for (list = 0; list < OMP_LIST_NUM; list++) |
| { |
| gfc_namelist *n = clauses->lists[list]; |
| enum tree_code reduction_code; |
| if (n == ((void *) 0)) |
| continue; |
| switch (list) |
| { |
| case OMP_LIST_MULT: |
| reduction_code = MULT_EXPR; |
| break; |
| case OMP_LIST_SUB: |
| reduction_code = MINUS_EXPR; |
| } |
| gfc_trans_omp_reduction_list (n, omp_clauses, reduction_code, where); |
| } |
| } |
| |
| void |
| gfc_trans_omp_parallel_workshare (gfc_code * code) |
| { |
| stmtblock_t block; |
| gfc_trans_omp_clauses (&block, code->ext.omp_clauses, code->loc); |
| } |