Skip to content

Commit 1e47d70

Browse files
committed
[Flang][OpenMP][MLIR][Lower] Update lowering to use wrapper ops
This patch introduces the following changes: - Complete OpenMP directive sets to include masked and taskloop-related ones. - Refactor clause processing to store related operands in structures. These are combined into construct-specific operand structures using a mixin pattern and simplify keeping track of operand lists used for creating OpenMP operations and reduces argument lists. - Update the lowering to MLIR of loop constructs to follow the wrapper + canonical loop approach. This includes some changes to privatization that need testing. - Add lowering for the omp.canonical_loop operation, based on omp.wsloop. - Significant refactor of OpenMP construct lowering, separating composite constructs into their own "gen" functions and handling combined loop constructs in a more scalable way. Updated genOMP functions to follow the same set of patterns to make it more understandable. Split clause processing calls from code generation for operations in preparation for reusing the same code when dealing with composite constructs. - Add basic support for taskloop, for completeness sake. - Document missing clauses. - Move some code from OpenMP.cpp to ClauseProcessor.cpp and call it there to simplify calls to certain process methods that were always followed by the same post-processing. - Add and populate "composite" attribute on wrapper operations. - Add empty constructors for wrapper operations. - Update `LoopWrapperInterface` to avoid compilation problems. - Update `Task*` operation's names to follow the same capitalization convention. - Changes to SCF to OpenMP conversion to produce a wrapper omp.wsloop with a nested omp.canonical_loop rather than an invalid omp.wsloop. - Document missing verifier checks on wrapper operations. - Make temporary changes to OpenMP to LLVM IR translation to make this compilable. All these changes are still WIP, as they haven't been tested.
1 parent 0553a46 commit 1e47d70

File tree

17 files changed

+2503
-1775
lines changed

17 files changed

+2503
-1775
lines changed

flang/include/flang/Semantics/openmp-directive-sets.h

+96-76
Original file line numberDiff line numberDiff line change
@@ -24,68 +24,80 @@ namespace llvm::omp {
2424
// - all<Directive>Set: All standalone or combined uses of the directive.
2525

2626
static const OmpDirectiveSet topParallelSet{
27-
Directive::OMPD_parallel,
28-
Directive::OMPD_parallel_do,
2927
Directive::OMPD_parallel_do_simd,
28+
Directive::OMPD_parallel_do,
29+
Directive::OMPD_parallel_masked_taskloop_simd,
30+
Directive::OMPD_parallel_masked_taskloop,
31+
Directive::OMPD_parallel_master_taskloop_simd,
32+
Directive::OMPD_parallel_master_taskloop,
3033
Directive::OMPD_parallel_sections,
3134
Directive::OMPD_parallel_workshare,
35+
Directive::OMPD_parallel,
3236
};
3337

3438
static const OmpDirectiveSet allParallelSet{
35-
Directive::OMPD_distribute_parallel_do,
36-
Directive::OMPD_distribute_parallel_do_simd,
37-
Directive::OMPD_parallel,
38-
Directive::OMPD_parallel_do,
39-
Directive::OMPD_parallel_do_simd,
40-
Directive::OMPD_parallel_sections,
41-
Directive::OMPD_parallel_workshare,
42-
Directive::OMPD_target_parallel,
43-
Directive::OMPD_target_parallel_do,
44-
Directive::OMPD_target_parallel_do_simd,
45-
Directive::OMPD_target_teams_distribute_parallel_do,
46-
Directive::OMPD_target_teams_distribute_parallel_do_simd,
47-
Directive::OMPD_teams_distribute_parallel_do,
48-
Directive::OMPD_teams_distribute_parallel_do_simd,
39+
OmpDirectiveSet{
40+
Directive::OMPD_distribute_parallel_do_simd,
41+
Directive::OMPD_distribute_parallel_do,
42+
Directive::OMPD_target_parallel_do_simd,
43+
Directive::OMPD_target_parallel_do,
44+
Directive::OMPD_target_parallel,
45+
Directive::OMPD_target_teams_distribute_parallel_do_simd,
46+
Directive::OMPD_target_teams_distribute_parallel_do,
47+
Directive::OMPD_teams_distribute_parallel_do_simd,
48+
Directive::OMPD_teams_distribute_parallel_do,
49+
} | topParallelSet,
4950
};
5051

5152
static const OmpDirectiveSet topDoSet{
52-
Directive::OMPD_do,
5353
Directive::OMPD_do_simd,
54+
Directive::OMPD_do,
5455
};
5556

5657
static const OmpDirectiveSet allDoSet{
57-
Directive::OMPD_distribute_parallel_do,
58-
Directive::OMPD_distribute_parallel_do_simd,
59-
Directive::OMPD_parallel_do,
60-
Directive::OMPD_parallel_do_simd,
61-
Directive::OMPD_do,
62-
Directive::OMPD_do_simd,
63-
Directive::OMPD_target_parallel_do,
64-
Directive::OMPD_target_parallel_do_simd,
65-
Directive::OMPD_target_teams_distribute_parallel_do,
66-
Directive::OMPD_target_teams_distribute_parallel_do_simd,
67-
Directive::OMPD_teams_distribute_parallel_do,
68-
Directive::OMPD_teams_distribute_parallel_do_simd,
58+
OmpDirectiveSet{
59+
Directive::OMPD_distribute_parallel_do_simd,
60+
Directive::OMPD_distribute_parallel_do,
61+
Directive::OMPD_parallel_do_simd,
62+
Directive::OMPD_parallel_do,
63+
Directive::OMPD_target_parallel_do_simd,
64+
Directive::OMPD_target_parallel_do,
65+
Directive::OMPD_target_teams_distribute_parallel_do_simd,
66+
Directive::OMPD_target_teams_distribute_parallel_do,
67+
Directive::OMPD_teams_distribute_parallel_do_simd,
68+
Directive::OMPD_teams_distribute_parallel_do,
69+
} | topDoSet,
6970
};
7071

7172
static const OmpDirectiveSet topTaskloopSet{
72-
Directive::OMPD_taskloop,
7373
Directive::OMPD_taskloop_simd,
74+
Directive::OMPD_taskloop,
7475
};
7576

76-
static const OmpDirectiveSet allTaskloopSet{topTaskloopSet};
77+
static const OmpDirectiveSet allTaskloopSet{
78+
OmpDirectiveSet{
79+
Directive::OMPD_masked_taskloop_simd,
80+
Directive::OMPD_masked_taskloop,
81+
Directive::OMPD_master_taskloop_simd,
82+
Directive::OMPD_master_taskloop,
83+
Directive::OMPD_parallel_masked_taskloop_simd,
84+
Directive::OMPD_parallel_masked_taskloop,
85+
Directive::OMPD_parallel_master_taskloop_simd,
86+
Directive::OMPD_parallel_master_taskloop,
87+
} | topTaskloopSet,
88+
};
7789

7890
static const OmpDirectiveSet topTargetSet{
79-
Directive::OMPD_target,
80-
Directive::OMPD_target_parallel,
81-
Directive::OMPD_target_parallel_do,
8291
Directive::OMPD_target_parallel_do_simd,
92+
Directive::OMPD_target_parallel_do,
93+
Directive::OMPD_target_parallel,
8394
Directive::OMPD_target_simd,
84-
Directive::OMPD_target_teams,
85-
Directive::OMPD_target_teams_distribute,
86-
Directive::OMPD_target_teams_distribute_parallel_do,
8795
Directive::OMPD_target_teams_distribute_parallel_do_simd,
96+
Directive::OMPD_target_teams_distribute_parallel_do,
8897
Directive::OMPD_target_teams_distribute_simd,
98+
Directive::OMPD_target_teams_distribute,
99+
Directive::OMPD_target_teams,
100+
Directive::OMPD_target,
89101
};
90102

91103
static const OmpDirectiveSet allTargetSet{topTargetSet};
@@ -95,61 +107,61 @@ static const OmpDirectiveSet topSimdSet{
95107
};
96108

97109
static const OmpDirectiveSet allSimdSet{
98-
Directive::OMPD_distribute_parallel_do_simd,
99-
Directive::OMPD_distribute_simd,
100-
Directive::OMPD_do_simd,
101-
Directive::OMPD_parallel_do_simd,
102-
Directive::OMPD_simd,
103-
Directive::OMPD_target_parallel_do_simd,
104-
Directive::OMPD_target_simd,
105-
Directive::OMPD_target_teams_distribute_parallel_do_simd,
106-
Directive::OMPD_target_teams_distribute_simd,
107-
Directive::OMPD_taskloop_simd,
108-
Directive::OMPD_teams_distribute_parallel_do_simd,
109-
Directive::OMPD_teams_distribute_simd,
110+
OmpDirectiveSet{
111+
Directive::OMPD_distribute_parallel_do_simd,
112+
Directive::OMPD_distribute_simd,
113+
Directive::OMPD_do_simd,
114+
Directive::OMPD_masked_taskloop_simd,
115+
Directive::OMPD_master_taskloop_simd,
116+
Directive::OMPD_parallel_do_simd,
117+
Directive::OMPD_parallel_masked_taskloop_simd,
118+
Directive::OMPD_parallel_master_taskloop_simd,
119+
Directive::OMPD_target_parallel_do_simd,
120+
Directive::OMPD_target_simd,
121+
Directive::OMPD_target_teams_distribute_parallel_do_simd,
122+
Directive::OMPD_target_teams_distribute_simd,
123+
Directive::OMPD_taskloop_simd,
124+
Directive::OMPD_teams_distribute_parallel_do_simd,
125+
Directive::OMPD_teams_distribute_simd,
126+
} | topSimdSet,
110127
};
111128

112129
static const OmpDirectiveSet topTeamsSet{
113-
Directive::OMPD_teams,
114-
Directive::OMPD_teams_distribute,
115-
Directive::OMPD_teams_distribute_parallel_do,
116130
Directive::OMPD_teams_distribute_parallel_do_simd,
131+
Directive::OMPD_teams_distribute_parallel_do,
117132
Directive::OMPD_teams_distribute_simd,
133+
Directive::OMPD_teams_distribute,
134+
Directive::OMPD_teams,
118135
};
119136

120137
static const OmpDirectiveSet allTeamsSet{
121-
llvm::omp::OMPD_target_teams,
122-
llvm::omp::OMPD_target_teams_distribute,
123-
llvm::omp::OMPD_target_teams_distribute_parallel_do,
124-
llvm::omp::OMPD_target_teams_distribute_parallel_do_simd,
125-
llvm::omp::OMPD_target_teams_distribute_simd,
126-
llvm::omp::OMPD_teams,
127-
llvm::omp::OMPD_teams_distribute,
128-
llvm::omp::OMPD_teams_distribute_parallel_do,
129-
llvm::omp::OMPD_teams_distribute_parallel_do_simd,
130-
llvm::omp::OMPD_teams_distribute_simd,
138+
OmpDirectiveSet{
139+
llvm::omp::OMPD_target_teams_distribute_parallel_do_simd,
140+
llvm::omp::OMPD_target_teams_distribute_parallel_do,
141+
llvm::omp::OMPD_target_teams_distribute_simd,
142+
llvm::omp::OMPD_target_teams_distribute,
143+
llvm::omp::OMPD_target_teams,
144+
} | topTeamsSet,
131145
};
132146

133147
static const OmpDirectiveSet topDistributeSet{
134-
Directive::OMPD_distribute,
135-
Directive::OMPD_distribute_parallel_do,
136148
Directive::OMPD_distribute_parallel_do_simd,
149+
Directive::OMPD_distribute_parallel_do,
137150
Directive::OMPD_distribute_simd,
151+
Directive::OMPD_distribute,
138152
};
139153

140154
static const OmpDirectiveSet allDistributeSet{
141-
llvm::omp::OMPD_distribute,
142-
llvm::omp::OMPD_distribute_parallel_do,
143-
llvm::omp::OMPD_distribute_parallel_do_simd,
144-
llvm::omp::OMPD_distribute_simd,
145-
llvm::omp::OMPD_target_teams_distribute,
146-
llvm::omp::OMPD_target_teams_distribute_parallel_do,
147-
llvm::omp::OMPD_target_teams_distribute_parallel_do_simd,
148-
llvm::omp::OMPD_target_teams_distribute_simd,
149-
llvm::omp::OMPD_teams_distribute,
150-
llvm::omp::OMPD_teams_distribute_parallel_do,
151-
llvm::omp::OMPD_teams_distribute_parallel_do_simd,
152-
llvm::omp::OMPD_teams_distribute_simd,
155+
OmpDirectiveSet{
156+
llvm::omp::OMPD_target_teams_distribute_parallel_do_simd,
157+
llvm::omp::OMPD_target_teams_distribute_parallel_do,
158+
llvm::omp::OMPD_target_teams_distribute_simd,
159+
llvm::omp::OMPD_target_teams_distribute,
160+
llvm::omp::OMPD_teams_distribute_parallel_do_simd,
161+
llvm::omp::OMPD_teams_distribute_parallel_do,
162+
llvm::omp::OMPD_teams_distribute_simd,
163+
llvm::omp::OMPD_teams_distribute,
164+
} | topDistributeSet,
153165
};
154166

155167
//===----------------------------------------------------------------------===//
@@ -188,8 +200,16 @@ static const OmpDirectiveSet loopConstructSet{
188200
Directive::OMPD_distribute,
189201
Directive::OMPD_do_simd,
190202
Directive::OMPD_do,
203+
Directive::OMPD_masked_taskloop,
204+
Directive::OMPD_masked_taskloop_simd,
205+
Directive::OMPD_master_taskloop,
206+
Directive::OMPD_master_taskloop_simd,
191207
Directive::OMPD_parallel_do_simd,
192208
Directive::OMPD_parallel_do,
209+
Directive::OMPD_parallel_masked_taskloop,
210+
Directive::OMPD_parallel_masked_taskloop_simd,
211+
Directive::OMPD_parallel_master_taskloop,
212+
Directive::OMPD_parallel_master_taskloop_simd,
193213
Directive::OMPD_simd,
194214
Directive::OMPD_target_parallel_do_simd,
195215
Directive::OMPD_target_parallel_do,

0 commit comments

Comments
 (0)