@@ -551,14 +551,15 @@ createComputeOp(Fortran::lower::AbstractConverter &converter,
551
551
llvm::SmallVector<int32_t , 8 > operandSegments;
552
552
addOperand (operands, operandSegments, async);
553
553
addOperands (operands, operandSegments, waitOperands);
554
- if constexpr (std::is_same_v<Op, mlir::acc::ParallelOp >) {
554
+ if constexpr (! std::is_same_v<Op, mlir::acc::SerialOp >) {
555
555
addOperand (operands, operandSegments, numGangs);
556
556
addOperand (operands, operandSegments, numWorkers);
557
557
addOperand (operands, operandSegments, vectorLength);
558
558
}
559
559
addOperand (operands, operandSegments, ifCond);
560
560
addOperand (operands, operandSegments, selfCond);
561
- addOperands (operands, operandSegments, reductionOperands);
561
+ if constexpr (!std::is_same_v<Op, mlir::acc::KernelsOp>)
562
+ addOperands (operands, operandSegments, reductionOperands);
562
563
addOperands (operands, operandSegments, copyOperands);
563
564
addOperands (operands, operandSegments, copyinOperands);
564
565
addOperands (operands, operandSegments, copyinReadonlyOperands);
@@ -570,11 +571,18 @@ createComputeOp(Fortran::lower::AbstractConverter &converter,
570
571
addOperands (operands, operandSegments, presentOperands);
571
572
addOperands (operands, operandSegments, devicePtrOperands);
572
573
addOperands (operands, operandSegments, attachOperands);
573
- addOperands (operands, operandSegments, privateOperands);
574
- addOperands (operands, operandSegments, firstprivateOperands);
574
+ if constexpr (!std::is_same_v<Op, mlir::acc::KernelsOp>) {
575
+ addOperands (operands, operandSegments, privateOperands);
576
+ addOperands (operands, operandSegments, firstprivateOperands);
577
+ }
575
578
576
- Op computeOp = createRegionOp<Op, mlir::acc::YieldOp>(
577
- firOpBuilder, currentLocation, operands, operandSegments);
579
+ Op computeOp;
580
+ if constexpr (std::is_same_v<Op, mlir::acc::KernelsOp>)
581
+ computeOp = createRegionOp<Op, mlir::acc::TerminatorOp>(
582
+ firOpBuilder, currentLocation, operands, operandSegments);
583
+ else
584
+ computeOp = createRegionOp<Op, mlir::acc::YieldOp>(
585
+ firOpBuilder, currentLocation, operands, operandSegments);
578
586
579
587
if (addAsyncAttr)
580
588
computeOp.setAsyncAttrAttr (firOpBuilder.getUnitAttr ());
@@ -697,7 +705,8 @@ genACC(Fortran::lower::AbstractConverter &converter,
697
705
createComputeOp<mlir::acc::SerialOp>(
698
706
converter, currentLocation, semanticsContext, stmtCtx, accClauseList);
699
707
} else if (blockDirective.v == llvm::acc::ACCD_kernels) {
700
- TODO (currentLocation, " kernels construct lowering" );
708
+ createComputeOp<mlir::acc::KernelsOp>(
709
+ converter, currentLocation, semanticsContext, stmtCtx, accClauseList);
701
710
} else if (blockDirective.v == llvm::acc::ACCD_host_data) {
702
711
TODO (currentLocation, " host_data construct lowering" );
703
712
}
@@ -720,7 +729,10 @@ genACC(Fortran::lower::AbstractConverter &converter,
720
729
Fortran::lower::StatementContext stmtCtx;
721
730
722
731
if (combinedDirective.v == llvm::acc::ACCD_kernels_loop) {
723
- TODO (currentLocation, " OpenACC Kernels Loop construct not lowered yet!" );
732
+ createComputeOp<mlir::acc::KernelsOp>(
733
+ converter, currentLocation, semanticsContext, stmtCtx, accClauseList);
734
+ createLoopOp (converter, currentLocation, semanticsContext, stmtCtx,
735
+ accClauseList);
724
736
} else if (combinedDirective.v == llvm::acc::ACCD_parallel_loop) {
725
737
createComputeOp<mlir::acc::ParallelOp>(
726
738
converter, currentLocation, semanticsContext, stmtCtx, accClauseList);
0 commit comments