1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fcompare-debug -w" } */
3
4 typedef union tree_node *tree;
5 typedef unsigned int source_location;
6 enum tree_code
7 {
8 MINUS_EXPR,
9 MULT_EXPR,
10 };
11 struct tree_omp_clause
12 {
13 union omp_clause_subcode
14 {
15 enum tree_code reduction_code;
16 } subcode;
17 };
18 union tree_node
19 {
20 struct tree_omp_clause omp_clause;
21 };
22 enum tree_index
23 {
24 TI_ERROR_MARK,
25 };
26 typedef struct
27 {
28 unsigned allocatable:1;
29 unsigned dimension:1;
30 unsigned codimension:1;
31 unsigned external:1;
32 unsigned optional:1;
33 unsigned pointer:1;
34 unsigned contiguous:1;
35 unsigned referenced:1;
36 } symbol_attribute;
37 typedef unsigned int gfc_char_t;
38 typedef struct gfc_linebuf
39 {
40 source_location location;
41 } gfc_linebuf;
42 typedef struct
43 {
44 gfc_char_t *nextc;
45 gfc_linebuf *lb;
46 } locus;
47 typedef struct
48 {
49 struct gfc_symbol *sym;
50 struct gfc_namelist *next;
51 } gfc_namelist;
52 enum
53 {
54 OMP_LIST_PLUS,
55 OMP_LIST_REDUCTION_FIRST = OMP_LIST_PLUS,
56 OMP_LIST_MULT,
57 OMP_LIST_SUB,
58 OMP_LIST_NUM
59 };
60 typedef struct gfc_omp_clauses
61 {
62 gfc_namelist *lists[OMP_LIST_NUM];
63 } gfc_omp_clauses;
64 typedef struct gfc_symbol
65 {
66 symbol_attribute attr;
67 } gfc_symbol;
68 typedef struct gfc_code
69 {
70 locus loc;
71 union
72 {
73 gfc_omp_clauses *omp_clauses;
74 } ext;
75 } gfc_code;
76 typedef struct
77 {
78 } stmtblock_t;
79
80 static tree
gfc_trans_omp_reduction_list(gfc_namelist * namelist,tree list,enum tree_code reduction_code,locus where)81 gfc_trans_omp_reduction_list (gfc_namelist * namelist, tree list,
82 enum tree_code reduction_code, locus where)
83 {
84 for (; namelist != ((void *) 0); namelist = namelist->next)
85 if (namelist->sym->attr.referenced)
86 {
87 tree node = build_omp_clause (where.lb->location);
88 node->omp_clause.subcode.reduction_code = reduction_code;
89 gfc_trans_omp_array_reduction (namelist->sym, where);
90 }
91 }
92
93 static tree
gfc_trans_omp_clauses(stmtblock_t * block,gfc_omp_clauses * clauses,locus where)94 gfc_trans_omp_clauses (stmtblock_t * block, gfc_omp_clauses * clauses,
95 locus where)
96 {
97 tree omp_clauses = (tree) ((void *) 0);
98 int list;
99 for (list = 0; list < OMP_LIST_NUM; list++)
100 {
101 gfc_namelist *n = clauses->lists[list];
102 enum tree_code reduction_code;
103 if (n == ((void *) 0))
104 continue;
105 switch (list)
106 {
107 case OMP_LIST_MULT:
108 reduction_code = MULT_EXPR;
109 break;
110 case OMP_LIST_SUB:
111 reduction_code = MINUS_EXPR;
112 }
113 gfc_trans_omp_reduction_list (n, omp_clauses, reduction_code, where);
114 }
115 }
116
117 void
gfc_trans_omp_parallel_workshare(gfc_code * code)118 gfc_trans_omp_parallel_workshare (gfc_code * code)
119 {
120 stmtblock_t block;
121 gfc_trans_omp_clauses (&block, code->ext.omp_clauses, code->loc);
122 }
123