@@ -2042,6 +2042,7 @@ static void genCompositeDistributeParallelDoSimd(
2042
2042
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2043
2043
mlir::Location loc, const ConstructQueue &queue,
2044
2044
ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2045
+ assert (std::distance (item, queue.end ()) == 4 && " Invalid leaf constructs" );
2045
2046
TODO (loc, " Composite DISTRIBUTE PARALLEL DO SIMD" );
2046
2047
}
2047
2048
@@ -2052,17 +2053,23 @@ static void genCompositeDistributeSimd(
2052
2053
ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2053
2054
lower::StatementContext stmtCtx;
2054
2055
2056
+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2057
+ ConstructQueue::const_iterator distributeItem = item;
2058
+ ConstructQueue::const_iterator simdItem = std::next (distributeItem);
2059
+
2055
2060
// Clause processing.
2056
2061
mlir::omp::DistributeOperands distributeClauseOps;
2057
- genDistributeClauses (converter, semaCtx, stmtCtx, item ->clauses , loc ,
2058
- distributeClauseOps);
2062
+ genDistributeClauses (converter, semaCtx, stmtCtx, distributeItem ->clauses ,
2063
+ loc, distributeClauseOps);
2059
2064
2060
2065
mlir::omp::SimdOperands simdClauseOps;
2061
- genSimdClauses (converter, semaCtx, item ->clauses , loc, simdClauseOps);
2066
+ genSimdClauses (converter, semaCtx, simdItem ->clauses , loc, simdClauseOps);
2062
2067
2068
+ // Pass the innermost leaf construct's clauses because that's where COLLAPSE
2069
+ // is placed by construct decomposition.
2063
2070
mlir::omp::LoopNestOperands loopNestClauseOps;
2064
2071
llvm::SmallVector<const semantics::Symbol *> iv;
2065
- genLoopNestClauses (converter, semaCtx, eval, item ->clauses , loc,
2072
+ genLoopNestClauses (converter, semaCtx, eval, simdItem ->clauses , loc,
2066
2073
loopNestClauseOps, iv);
2067
2074
2068
2075
// Operation creation.
@@ -2086,7 +2093,7 @@ static void genCompositeDistributeSimd(
2086
2093
2087
2094
assert (wrapperArgs.empty () &&
2088
2095
" Block args for omp.simd and omp.distribute currently not expected" );
2089
- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2096
+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
2090
2097
loopNestClauseOps, iv, /* wrapperSyms=*/ {}, wrapperArgs,
2091
2098
llvm::omp::Directive::OMPD_distribute_simd, dsp);
2092
2099
}
@@ -2100,19 +2107,25 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2100
2107
DataSharingProcessor &dsp) {
2101
2108
lower::StatementContext stmtCtx;
2102
2109
2110
+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2111
+ ConstructQueue::const_iterator doItem = item;
2112
+ ConstructQueue::const_iterator simdItem = std::next (doItem);
2113
+
2103
2114
// Clause processing.
2104
2115
mlir::omp::WsloopOperands wsloopClauseOps;
2105
2116
llvm::SmallVector<const semantics::Symbol *> wsloopReductionSyms;
2106
2117
llvm::SmallVector<mlir::Type> wsloopReductionTypes;
2107
- genWsloopClauses (converter, semaCtx, stmtCtx, item ->clauses , loc,
2118
+ genWsloopClauses (converter, semaCtx, stmtCtx, doItem ->clauses , loc,
2108
2119
wsloopClauseOps, wsloopReductionTypes, wsloopReductionSyms);
2109
2120
2110
2121
mlir::omp::SimdOperands simdClauseOps;
2111
- genSimdClauses (converter, semaCtx, item ->clauses , loc, simdClauseOps);
2122
+ genSimdClauses (converter, semaCtx, simdItem ->clauses , loc, simdClauseOps);
2112
2123
2124
+ // Pass the innermost leaf construct's clauses because that's where COLLAPSE
2125
+ // is placed by construct decomposition.
2113
2126
mlir::omp::LoopNestOperands loopNestClauseOps;
2114
2127
llvm::SmallVector<const semantics::Symbol *> iv;
2115
- genLoopNestClauses (converter, semaCtx, eval, item ->clauses , loc,
2128
+ genLoopNestClauses (converter, semaCtx, eval, simdItem ->clauses , loc,
2116
2129
loopNestClauseOps, iv);
2117
2130
2118
2131
// Operation creation.
@@ -2135,7 +2148,7 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2135
2148
2136
2149
assert (wsloopReductionSyms.size () == wrapperArgs.size () &&
2137
2150
" Number of symbols and wrapper block arguments must match" );
2138
- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2151
+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
2139
2152
loopNestClauseOps, iv, wsloopReductionSyms, wrapperArgs,
2140
2153
llvm::omp::Directive::OMPD_do_simd, dsp);
2141
2154
}
@@ -2145,13 +2158,50 @@ static void genCompositeTaskloopSimd(
2145
2158
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2146
2159
mlir::Location loc, const ConstructQueue &queue,
2147
2160
ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2161
+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2148
2162
TODO (loc, " Composite TASKLOOP SIMD" );
2149
2163
}
2150
2164
2151
2165
// ===----------------------------------------------------------------------===//
2152
2166
// Dispatch
2153
2167
// ===----------------------------------------------------------------------===//
2154
2168
2169
+ static bool genOMPCompositeDispatch (
2170
+ lower::AbstractConverter &converter, lower::SymMap &symTable,
2171
+ semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2172
+ mlir::Location loc, const ConstructQueue &queue,
2173
+ ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2174
+ using llvm::omp::Directive;
2175
+ using llvm::omp::getLeafConstructs, lower::omp::matchLeafSequence;
2176
+
2177
+ if (matchLeafSequence (
2178
+ item, queue,
2179
+ getLeafConstructs (Directive::OMPD_distribute_parallel_do)))
2180
+ genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2181
+ queue, item, dsp);
2182
+ else if (matchLeafSequence (
2183
+ item, queue,
2184
+ getLeafConstructs (Directive::OMPD_distribute_parallel_do_simd)))
2185
+ genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2186
+ loc, queue, item, dsp);
2187
+ else if (matchLeafSequence (
2188
+ item, queue, getLeafConstructs (Directive::OMPD_distribute_simd)))
2189
+ genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2190
+ item, dsp);
2191
+ else if (matchLeafSequence (item, queue,
2192
+ getLeafConstructs (Directive::OMPD_do_simd)))
2193
+ genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2194
+ dsp);
2195
+ else if (matchLeafSequence (item, queue,
2196
+ getLeafConstructs (Directive::OMPD_taskloop_simd)))
2197
+ genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2198
+ item, dsp);
2199
+ else
2200
+ return false ;
2201
+
2202
+ return true ;
2203
+ }
2204
+
2155
2205
static void genOMPDispatch (lower::AbstractConverter &converter,
2156
2206
lower::SymMap &symTable,
2157
2207
semantics::SemanticsContext &semaCtx,
@@ -2165,10 +2215,18 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2165
2215
llvm::omp::Association::Loop;
2166
2216
if (loopLeaf) {
2167
2217
symTable.pushScope ();
2218
+ // TODO: Use one DataSharingProcessor for each leaf of a composite
2219
+ // construct.
2168
2220
loopDsp.emplace (converter, semaCtx, item->clauses , eval,
2169
2221
/* shouldCollectPreDeterminedSymbols=*/ true ,
2170
2222
/* useDelayedPrivatization=*/ false , &symTable);
2171
2223
loopDsp->processStep1 ();
2224
+
2225
+ if (genOMPCompositeDispatch (converter, symTable, semaCtx, eval, loc, queue,
2226
+ item, *loopDsp)) {
2227
+ symTable.popScope ();
2228
+ return ;
2229
+ }
2172
2230
}
2173
2231
2174
2232
switch (llvm::omp::Directive dir = item->id ) {
@@ -2267,24 +2325,13 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2267
2325
2268
2326
// Composite constructs
2269
2327
case llvm::omp::Directive::OMPD_distribute_parallel_do:
2270
- genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2271
- queue, item, *loopDsp);
2272
- break ;
2273
2328
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
2274
- genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2275
- loc, queue, item, *loopDsp);
2276
- break ;
2277
2329
case llvm::omp::Directive::OMPD_distribute_simd:
2278
- genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2279
- item, *loopDsp);
2280
- break ;
2281
2330
case llvm::omp::Directive::OMPD_do_simd:
2282
- genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2283
- *loopDsp);
2284
- break ;
2285
2331
case llvm::omp::Directive::OMPD_taskloop_simd:
2286
- genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2287
- item, *loopDsp);
2332
+ // Composite constructs should have been split into a sequence of leaf
2333
+ // constructs and lowered by genOMPCompositeDispatch().
2334
+ llvm_unreachable (" Unexpected composite construct." );
2288
2335
break ;
2289
2336
default :
2290
2337
break ;
0 commit comments