@@ -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.
@@ -2084,7 +2091,7 @@ static void genCompositeDistributeSimd(
2084
2091
2085
2092
assert (wrapperArgs.empty () &&
2086
2093
" Block args for omp.simd and omp.distribute currently not expected" );
2087
- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2094
+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
2088
2095
loopNestClauseOps, iv, /* wrapperSyms=*/ {}, wrapperArgs,
2089
2096
llvm::omp::Directive::OMPD_distribute_simd, dsp);
2090
2097
}
@@ -2098,19 +2105,25 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2098
2105
DataSharingProcessor &dsp) {
2099
2106
lower::StatementContext stmtCtx;
2100
2107
2108
+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2109
+ ConstructQueue::const_iterator doItem = item;
2110
+ ConstructQueue::const_iterator simdItem = std::next (doItem);
2111
+
2101
2112
// Clause processing.
2102
2113
mlir::omp::WsloopOperands wsloopClauseOps;
2103
2114
llvm::SmallVector<const semantics::Symbol *> wsloopReductionSyms;
2104
2115
llvm::SmallVector<mlir::Type> wsloopReductionTypes;
2105
- genWsloopClauses (converter, semaCtx, stmtCtx, item ->clauses , loc,
2116
+ genWsloopClauses (converter, semaCtx, stmtCtx, doItem ->clauses , loc,
2106
2117
wsloopClauseOps, wsloopReductionTypes, wsloopReductionSyms);
2107
2118
2108
2119
mlir::omp::SimdOperands simdClauseOps;
2109
- genSimdClauses (converter, semaCtx, item ->clauses , loc, simdClauseOps);
2120
+ genSimdClauses (converter, semaCtx, simdItem ->clauses , loc, simdClauseOps);
2110
2121
2122
+ // Pass the innermost leaf construct's clauses because that's where COLLAPSE
2123
+ // is placed by construct decomposition.
2111
2124
mlir::omp::LoopNestOperands loopNestClauseOps;
2112
2125
llvm::SmallVector<const semantics::Symbol *> iv;
2113
- genLoopNestClauses (converter, semaCtx, eval, item ->clauses , loc,
2126
+ genLoopNestClauses (converter, semaCtx, eval, simdItem ->clauses , loc,
2114
2127
loopNestClauseOps, iv);
2115
2128
2116
2129
// Operation creation.
@@ -2131,7 +2144,7 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2131
2144
2132
2145
assert (wsloopReductionSyms.size () == wrapperArgs.size () &&
2133
2146
" Number of symbols and wrapper block arguments must match" );
2134
- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2147
+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
2135
2148
loopNestClauseOps, iv, wsloopReductionSyms, wrapperArgs,
2136
2149
llvm::omp::Directive::OMPD_do_simd, dsp);
2137
2150
}
@@ -2141,13 +2154,50 @@ static void genCompositeTaskloopSimd(
2141
2154
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2142
2155
mlir::Location loc, const ConstructQueue &queue,
2143
2156
ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2157
+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2144
2158
TODO (loc, " Composite TASKLOOP SIMD" );
2145
2159
}
2146
2160
2147
2161
// ===----------------------------------------------------------------------===//
2148
2162
// Dispatch
2149
2163
// ===----------------------------------------------------------------------===//
2150
2164
2165
+ static bool genOMPCompositeDispatch (
2166
+ lower::AbstractConverter &converter, lower::SymMap &symTable,
2167
+ semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2168
+ mlir::Location loc, const ConstructQueue &queue,
2169
+ ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2170
+ using llvm::omp::Directive;
2171
+ using llvm::omp::getLeafConstructs, lower::omp::matchLeafSequence;
2172
+
2173
+ if (matchLeafSequence (
2174
+ item, queue,
2175
+ getLeafConstructs (Directive::OMPD_distribute_parallel_do)))
2176
+ genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2177
+ queue, item, dsp);
2178
+ else if (matchLeafSequence (
2179
+ item, queue,
2180
+ getLeafConstructs (Directive::OMPD_distribute_parallel_do_simd)))
2181
+ genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2182
+ loc, queue, item, dsp);
2183
+ else if (matchLeafSequence (
2184
+ item, queue, getLeafConstructs (Directive::OMPD_distribute_simd)))
2185
+ genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2186
+ item, dsp);
2187
+ else if (matchLeafSequence (item, queue,
2188
+ getLeafConstructs (Directive::OMPD_do_simd)))
2189
+ genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2190
+ dsp);
2191
+ else if (matchLeafSequence (item, queue,
2192
+ getLeafConstructs (Directive::OMPD_taskloop_simd)))
2193
+ genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2194
+ item, dsp);
2195
+ else
2196
+ return false ;
2197
+
2198
+ return true ;
2199
+ }
2200
+
2151
2201
static void genOMPDispatch (lower::AbstractConverter &converter,
2152
2202
lower::SymMap &symTable,
2153
2203
semantics::SemanticsContext &semaCtx,
@@ -2161,10 +2211,18 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2161
2211
llvm::omp::Association::Loop;
2162
2212
if (loopLeaf) {
2163
2213
symTable.pushScope ();
2214
+ // TODO: Use one DataSharingProcessor for each leaf of a composite
2215
+ // construct.
2164
2216
loopDsp.emplace (converter, semaCtx, item->clauses , eval,
2165
2217
/* shouldCollectPreDeterminedSymbols=*/ true ,
2166
2218
/* useDelayedPrivatization=*/ false , &symTable);
2167
2219
loopDsp->processStep1 ();
2220
+
2221
+ if (genOMPCompositeDispatch (converter, symTable, semaCtx, eval, loc, queue,
2222
+ item, *loopDsp)) {
2223
+ symTable.popScope ();
2224
+ return ;
2225
+ }
2168
2226
}
2169
2227
2170
2228
switch (llvm::omp::Directive dir = item->id ) {
@@ -2263,24 +2321,13 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2263
2321
2264
2322
// Composite constructs
2265
2323
case llvm::omp::Directive::OMPD_distribute_parallel_do:
2266
- genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2267
- queue, item, *loopDsp);
2268
- break ;
2269
2324
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
2270
- genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2271
- loc, queue, item, *loopDsp);
2272
- break ;
2273
2325
case llvm::omp::Directive::OMPD_distribute_simd:
2274
- genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2275
- item, *loopDsp);
2276
- break ;
2277
2326
case llvm::omp::Directive::OMPD_do_simd:
2278
- genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2279
- *loopDsp);
2280
- break ;
2281
2327
case llvm::omp::Directive::OMPD_taskloop_simd:
2282
- genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2283
- item, *loopDsp);
2328
+ // Composite constructs should have been split into a sequence of leaf
2329
+ // constructs and lowered by genOMPCompositeDispatch().
2330
+ llvm_unreachable (" Unexpected composite construct." );
2284
2331
break ;
2285
2332
default :
2286
2333
break ;
0 commit comments