@@ -2044,6 +2044,7 @@ static void genCompositeDistributeParallelDoSimd(
20442044 semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
20452045 mlir::Location loc, const ConstructQueue &queue,
20462046 ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2047+ assert (std::distance (item, queue.end ()) == 4 && " Invalid leaf constructs" );
20472048 TODO (loc, " Composite DISTRIBUTE PARALLEL DO SIMD" );
20482049}
20492050
@@ -2054,17 +2055,23 @@ static void genCompositeDistributeSimd(
20542055 ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
20552056 lower::StatementContext stmtCtx;
20562057
2058+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
2059+ ConstructQueue::const_iterator distributeItem = item;
2060+ ConstructQueue::const_iterator simdItem = std::next (distributeItem);
2061+
20572062 // Clause processing.
20582063 mlir::omp::DistributeOperands distributeClauseOps;
2059- genDistributeClauses (converter, semaCtx, stmtCtx, item ->clauses , loc ,
2060- distributeClauseOps);
2064+ genDistributeClauses (converter, semaCtx, stmtCtx, distributeItem ->clauses ,
2065+ loc, distributeClauseOps);
20612066
20622067 mlir::omp::SimdOperands simdClauseOps;
2063- genSimdClauses (converter, semaCtx, item ->clauses , loc, simdClauseOps);
2068+ genSimdClauses (converter, semaCtx, simdItem ->clauses , loc, simdClauseOps);
20642069
2070+ // Pass the innermost leaf construct's clauses because that's where COLLAPSE
2071+ // is placed by construct decomposition.
20652072 mlir::omp::LoopNestOperands loopNestClauseOps;
20662073 llvm::SmallVector<const semantics::Symbol *> iv;
2067- genLoopNestClauses (converter, semaCtx, eval, item ->clauses , loc,
2074+ genLoopNestClauses (converter, semaCtx, eval, simdItem ->clauses , loc,
20682075 loopNestClauseOps, iv);
20692076
20702077 // Operation creation.
@@ -2086,7 +2093,7 @@ static void genCompositeDistributeSimd(
20862093 llvm::concat<mlir::BlockArgument>(distributeOp.getRegion ().getArguments (),
20872094 simdOp.getRegion ().getArguments ()));
20882095
2089- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2096+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
20902097 loopNestClauseOps, iv, /* wrapperSyms=*/ {}, wrapperArgs,
20912098 llvm::omp::Directive::OMPD_distribute_simd, dsp);
20922099}
@@ -2100,19 +2107,25 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
21002107 DataSharingProcessor &dsp) {
21012108 lower::StatementContext stmtCtx;
21022109
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+
21032114 // Clause processing.
21042115 mlir::omp::WsloopOperands wsloopClauseOps;
21052116 llvm::SmallVector<const semantics::Symbol *> wsloopReductionSyms;
21062117 llvm::SmallVector<mlir::Type> wsloopReductionTypes;
2107- genWsloopClauses (converter, semaCtx, stmtCtx, item ->clauses , loc,
2118+ genWsloopClauses (converter, semaCtx, stmtCtx, doItem ->clauses , loc,
21082119 wsloopClauseOps, wsloopReductionTypes, wsloopReductionSyms);
21092120
21102121 mlir::omp::SimdOperands simdClauseOps;
2111- genSimdClauses (converter, semaCtx, item ->clauses , loc, simdClauseOps);
2122+ genSimdClauses (converter, semaCtx, simdItem ->clauses , loc, simdClauseOps);
21122123
2124+ // Pass the innermost leaf construct's clauses because that's where COLLAPSE
2125+ // is placed by construct decomposition.
21132126 mlir::omp::LoopNestOperands loopNestClauseOps;
21142127 llvm::SmallVector<const semantics::Symbol *> iv;
2115- genLoopNestClauses (converter, semaCtx, eval, item ->clauses , loc,
2128+ genLoopNestClauses (converter, semaCtx, eval, simdItem ->clauses , loc,
21162129 loopNestClauseOps, iv);
21172130
21182131 // Operation creation.
@@ -2133,7 +2146,7 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
21332146 auto wrapperArgs = llvm::to_vector (llvm::concat<mlir::BlockArgument>(
21342147 wsloopOp.getRegion ().getArguments (), simdOp.getRegion ().getArguments ()));
21352148
2136- genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item ,
2149+ genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, simdItem ,
21372150 loopNestClauseOps, iv, wsloopReductionSyms, wrapperArgs,
21382151 llvm::omp::Directive::OMPD_do_simd, dsp);
21392152}
@@ -2143,13 +2156,44 @@ static void genCompositeTaskloopSimd(
21432156 semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
21442157 mlir::Location loc, const ConstructQueue &queue,
21452158 ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2159+ assert (std::distance (item, queue.end ()) == 2 && " Invalid leaf constructs" );
21462160 TODO (loc, " Composite TASKLOOP SIMD" );
21472161}
21482162
21492163// ===----------------------------------------------------------------------===//
21502164// Dispatch
21512165// ===----------------------------------------------------------------------===//
21522166
2167+ static bool genOMPCompositeDispatch (
2168+ lower::AbstractConverter &converter, lower::SymMap &symTable,
2169+ semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2170+ mlir::Location loc, const ConstructQueue &queue,
2171+ ConstructQueue::const_iterator item, DataSharingProcessor &dsp) {
2172+ using llvm::omp::Directive;
2173+ using lower::omp::matchLeafSequence;
2174+
2175+ if (matchLeafSequence (item, queue, Directive::OMPD_distribute_parallel_do))
2176+ genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2177+ queue, item, dsp);
2178+ else if (matchLeafSequence (item, queue,
2179+ Directive::OMPD_distribute_parallel_do_simd))
2180+ genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2181+ loc, queue, item, dsp);
2182+ else if (matchLeafSequence (item, queue, Directive::OMPD_distribute_simd))
2183+ genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2184+ item, dsp);
2185+ else if (matchLeafSequence (item, queue, Directive::OMPD_do_simd))
2186+ genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2187+ dsp);
2188+ else if (matchLeafSequence (item, queue, Directive::OMPD_taskloop_simd))
2189+ genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2190+ item, dsp);
2191+ else
2192+ return false ;
2193+
2194+ return true ;
2195+ }
2196+
21532197static void genOMPDispatch (lower::AbstractConverter &converter,
21542198 lower::SymMap &symTable,
21552199 semantics::SemanticsContext &semaCtx,
@@ -2163,10 +2207,18 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21632207 llvm::omp::Association::Loop;
21642208 if (loopLeaf) {
21652209 symTable.pushScope ();
2210+ // TODO: Use one DataSharingProcessor for each leaf of a composite
2211+ // construct.
21662212 loopDsp.emplace (converter, semaCtx, item->clauses , eval,
21672213 /* shouldCollectPreDeterminedSymbols=*/ true ,
21682214 /* useDelayedPrivatization=*/ false , &symTable);
21692215 loopDsp->processStep1 ();
2216+
2217+ if (genOMPCompositeDispatch (converter, symTable, semaCtx, eval, loc, queue,
2218+ item, *loopDsp)) {
2219+ symTable.popScope ();
2220+ return ;
2221+ }
21702222 }
21712223
21722224 switch (llvm::omp::Directive dir = item->id ) {
@@ -2262,29 +2314,11 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
22622314 // that use this construct, add a single construct for now.
22632315 genSingleOp (converter, symTable, semaCtx, eval, loc, queue, item);
22642316 break ;
2265-
2266- // Composite constructs
2267- case llvm::omp::Directive::OMPD_distribute_parallel_do:
2268- genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2269- queue, item, *loopDsp);
2270- break ;
2271- case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
2272- genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2273- loc, queue, item, *loopDsp);
2274- break ;
2275- case llvm::omp::Directive::OMPD_distribute_simd:
2276- genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2277- item, *loopDsp);
2278- break ;
2279- case llvm::omp::Directive::OMPD_do_simd:
2280- genCompositeDoSimd (converter, symTable, semaCtx, eval, loc, queue, item,
2281- *loopDsp);
2282- break ;
2283- case llvm::omp::Directive::OMPD_taskloop_simd:
2284- genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2285- item, *loopDsp);
2286- break ;
22872317 default :
2318+ // Combined and composite constructs should have been split into a sequence
2319+ // of leaf constructs when building the construct queue.
2320+ assert (!llvm::omp::isLeafConstruct (dir) &&
2321+ " Unexpected compound construct." );
22882322 break ;
22892323 }
22902324
0 commit comments