From 5062a178bf9dd46008b8f7a182facb6152c46889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Mon, 22 Jan 2024 10:31:37 -0800 Subject: [PATCH] [flang][openacc] Lower loop directive to the new acc.loop op design (#65417) acc.loop was redesigned in https://reviews.llvm.org/D159229. This patch updates the lowering to match the new op. DO CONCURRENT construct will be added in a follow up patch. Note that the pre-commit ci will fail until D159229 is merged. Depends on #67355 --- flang/include/flang/Lower/OpenACC.h | 5 + flang/lib/Lower/Bridge.cpp | 36 ++- flang/lib/Lower/OpenACC.cpp | 189 ++++++++++++---- flang/test/Lower/OpenACC/acc-kernels-loop.f90 | 162 +++++-------- flang/test/Lower/OpenACC/acc-loop-exit.f90 | 10 +- flang/test/Lower/OpenACC/acc-loop.f90 | 213 ++++++++---------- .../test/Lower/OpenACC/acc-parallel-loop.f90 | 172 ++++++-------- flang/test/Lower/OpenACC/acc-private.f90 | 14 +- flang/test/Lower/OpenACC/acc-reduction.f90 | 42 ++-- flang/test/Lower/OpenACC/acc-serial-loop.f90 | 150 +++++------- flang/test/Lower/OpenACC/locations.f90 | 32 ++- 11 files changed, 511 insertions(+), 514 deletions(-) diff --git a/flang/include/flang/Lower/OpenACC.h b/flang/include/flang/Lower/OpenACC.h index f23e4726f33e0..fbf61e7184ae2 100644 --- a/flang/include/flang/Lower/OpenACC.h +++ b/flang/include/flang/Lower/OpenACC.h @@ -35,6 +35,7 @@ class FirOpBuilder; namespace Fortran { namespace parser { +struct AccClauseList; struct OpenACCConstruct; struct OpenACCDeclarativeConstruct; struct OpenACCRoutineConstruct; @@ -64,6 +65,8 @@ static constexpr llvm::StringRef declarePreDeallocSuffix = static constexpr llvm::StringRef declarePostDeallocSuffix = "_acc_declare_update_desc_post_dealloc"; +static constexpr llvm::StringRef privatizationRecipePrefix = "privatization"; + mlir::Value genOpenACCConstruct(AbstractConverter &, Fortran::semantics::SemanticsContext &, pft::Evaluation &, @@ -113,6 +116,8 @@ void attachDeclarePostDeallocAction(AbstractConverter &, fir::FirOpBuilder &, void genOpenACCTerminator(fir::FirOpBuilder &, mlir::Operation *, mlir::Location); +int64_t getCollapseValue(const Fortran::parser::AccClauseList &); + bool isInOpenACCLoop(fir::FirOpBuilder &); void setInsertionPointAfterOpenACCLoopIfInside(fir::FirOpBuilder &); diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 8006b9b426f4d..b3aeb99fc5d57 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -2391,13 +2391,43 @@ class FirConverter : public Fortran::lower::AbstractConverter { localSymbols.pushScope(); mlir::Value exitCond = genOpenACCConstruct( *this, bridge.getSemanticsContext(), getEval(), acc); - for (Fortran::lower::pft::Evaluation &e : getEval().getNestedEvaluations()) + + const Fortran::parser::OpenACCLoopConstruct *accLoop = + std::get_if(&acc.u); + const Fortran::parser::OpenACCCombinedConstruct *accCombined = + std::get_if(&acc.u); + + Fortran::lower::pft::Evaluation *curEval = &getEval(); + + if (accLoop || accCombined) { + int64_t collapseValue; + if (accLoop) { + const Fortran::parser::AccBeginLoopDirective &beginLoopDir = + std::get(accLoop->t); + const Fortran::parser::AccClauseList &clauseList = + std::get(beginLoopDir.t); + collapseValue = Fortran::lower::getCollapseValue(clauseList); + } else if (accCombined) { + const Fortran::parser::AccBeginCombinedDirective &beginCombinedDir = + std::get( + accCombined->t); + const Fortran::parser::AccClauseList &clauseList = + std::get(beginCombinedDir.t); + collapseValue = Fortran::lower::getCollapseValue(clauseList); + } + + if (curEval->lowerAsStructured()) { + curEval = &curEval->getFirstNestedEvaluation(); + for (int64_t i = 1; i < collapseValue; i++) + curEval = &*std::next(curEval->getNestedEvaluations().begin()); + } + } + + for (Fortran::lower::pft::Evaluation &e : curEval->getNestedEvaluations()) genFIR(e); localSymbols.popScope(); builder->restoreInsertionPoint(insertPt); - const Fortran::parser::OpenACCLoopConstruct *accLoop = - std::get_if(&acc.u); if (accLoop && exitCond) { Fortran::lower::pft::FunctionLikeUnit *funit = getEval().getOwningProcedure(); diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 682ca06cabd6f..474d4e686c135 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -787,7 +787,8 @@ genPrivatizations(const Fortran::parser::AccObjectList &objectList, mlir::Type retTy = getTypeFromBounds(bounds, info.addr.getType()); if constexpr (std::is_same_v) { std::string recipeName = - fir::getTypeAsString(retTy, converter.getKindMap(), "privatization"); + fir::getTypeAsString(retTy, converter.getKindMap(), + Fortran::lower::privatizationRecipePrefix); recipe = Fortran::lower::createOrGetPrivateRecipe(builder, recipeName, operandLocation, retTy); auto op = createDataEntryOp( @@ -1412,15 +1413,17 @@ static void addOperand(llvm::SmallVectorImpl &operands, } template -static Op createRegionOp(fir::FirOpBuilder &builder, mlir::Location loc, - Fortran::lower::pft::Evaluation &eval, - const llvm::SmallVectorImpl &operands, - const llvm::SmallVectorImpl &operandSegments, - bool outerCombined = false, - llvm::SmallVector retTy = {}, - mlir::Value yieldValue = {}) { +static Op +createRegionOp(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Location returnLoc, Fortran::lower::pft::Evaluation &eval, + const llvm::SmallVectorImpl &operands, + const llvm::SmallVectorImpl &operandSegments, + bool outerCombined = false, + llvm::SmallVector retTy = {}, + mlir::Value yieldValue = {}, mlir::TypeRange argsTy = {}, + llvm::SmallVector locs = {}) { Op op = builder.create(loc, retTy, operands); - builder.createBlock(&op.getRegion()); + builder.createBlock(&op.getRegion(), op.getRegion().end(), argsTy, locs); mlir::Block &block = op.getRegion().back(); builder.setInsertionPointToStart(&block); @@ -1439,13 +1442,13 @@ static Op createRegionOp(fir::FirOpBuilder &builder, mlir::Location loc, if (yieldValue) { if constexpr (std::is_same_v) { - Terminator yieldOp = builder.create(loc, yieldValue); + Terminator yieldOp = builder.create(returnLoc, yieldValue); yieldValue.getDefiningOp()->moveBefore(yieldOp); } else { - builder.create(loc); + builder.create(returnLoc); } } else { - builder.create(loc); + builder.create(returnLoc); } builder.setInsertionPointToStart(&block); return op; @@ -1595,18 +1598,28 @@ genWaitClause(Fortran::lower::AbstractConverter &converter, } } +mlir::Type getTypeFromIvTypeSize(fir::FirOpBuilder &builder, + const Fortran::semantics::Symbol &ivSym) { + std::size_t ivTypeSize = ivSym.size(); + if (ivTypeSize == 0) + llvm::report_fatal_error("unexpected induction variable size"); + // ivTypeSize is in bytes and IntegerType needs to be in bits. + return builder.getIntegerType(ivTypeSize * 8); +} + static mlir::acc::LoopOp createLoopOp(Fortran::lower::AbstractConverter &converter, mlir::Location currentLocation, - Fortran::lower::pft::Evaluation &eval, Fortran::semantics::SemanticsContext &semanticsContext, Fortran::lower::StatementContext &stmtCtx, + const Fortran::parser::DoConstruct &outerDoConstruct, + Fortran::lower::pft::Evaluation &eval, const Fortran::parser::AccClauseList &accClauseList, bool needEarlyReturnHandling = false) { fir::FirOpBuilder &builder = converter.getFirOpBuilder(); - llvm::SmallVector tileOperands, privateOperands, + llvm::SmallVector tileOperands, privateOperands, ivPrivate, reductionOperands, cacheOperands, vectorOperands, workerNumOperands, - gangOperands; + gangOperands, lowerbounds, upperbounds, steps; llvm::SmallVector privatizations, reductionRecipes; llvm::SmallVector tileOperandsSegments, gangOperandsSegments; llvm::SmallVector collapseValues; @@ -1623,6 +1636,74 @@ createLoopOp(Fortran::lower::AbstractConverter &converter, crtDeviceTypes.push_back(mlir::acc::DeviceTypeAttr::get( builder.getContext(), mlir::acc::DeviceType::None)); + llvm::SmallVector ivTypes; + llvm::SmallVector ivLocs; + llvm::SmallVector inclusiveBounds; + + if (outerDoConstruct.IsDoConcurrent()) + TODO(currentLocation, "OpenACC loop with DO CONCURRENT"); + + llvm::SmallVector locs; + locs.push_back(currentLocation); // Location of the directive + + int64_t collapseValue = Fortran::lower::getCollapseValue(accClauseList); + Fortran::lower::pft::Evaluation *crtEval = &eval.getFirstNestedEvaluation(); + for (unsigned i = 0; i < collapseValue; ++i) { + const Fortran::parser::LoopControl *loopControl; + if (i == 0) { + loopControl = &*outerDoConstruct.GetLoopControl(); + locs.push_back(converter.genLocation( + Fortran::parser::FindSourceLocation(outerDoConstruct))); + } else { + auto *doCons = crtEval->getIf(); + assert(doCons && "expect do construct"); + loopControl = &*doCons->GetLoopControl(); + locs.push_back( + converter.genLocation(Fortran::parser::FindSourceLocation(*doCons))); + } + + const Fortran::parser::LoopControl::Bounds *bounds = + std::get_if(&loopControl->u); + assert(bounds && "Expected bounds on the loop construct"); + lowerbounds.push_back(fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(bounds->lower), stmtCtx))); + upperbounds.push_back(fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(bounds->upper), stmtCtx))); + if (bounds->step) + steps.push_back(fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(bounds->step), stmtCtx))); + else // If `step` is not present, assume it as `1`. + steps.push_back(builder.createIntegerConstant( + currentLocation, upperbounds[upperbounds.size() - 1].getType(), 1)); + + Fortran::semantics::Symbol &ivSym = + bounds->name.thing.symbol->GetUltimate(); + + mlir::Type ivTy = getTypeFromIvTypeSize(builder, ivSym); + mlir::Value ivValue = converter.getSymbolAddress(ivSym); + ivTypes.push_back(ivTy); + ivLocs.push_back(currentLocation); + std::string recipeName = + fir::getTypeAsString(ivValue.getType(), converter.getKindMap(), + Fortran::lower::privatizationRecipePrefix); + auto recipe = Fortran::lower::createOrGetPrivateRecipe( + builder, recipeName, currentLocation, ivValue.getType()); + std::stringstream asFortran; + auto op = createDataEntryOp( + builder, currentLocation, ivValue, asFortran, {}, true, + /*implicit=*/true, mlir::acc::DataClause::acc_private, + ivValue.getType()); + + privateOperands.push_back(op.getAccPtr()); + ivPrivate.push_back(op.getAccPtr()); + privatizations.push_back(mlir::SymbolRefAttr::get( + builder.getContext(), recipe.getSymName().str())); + inclusiveBounds.push_back(true); + converter.bindSymbol(ivSym, op.getAccPtr()); + if (i < collapseValue - 1) + crtEval = &*std::next(crtEval->getNestedEvaluations().begin()); + } + for (const Fortran::parser::AccClause &clause : accClauseList.v) { mlir::Location clauseLocation = converter.genLocation(clause.source); if (const auto *gangClause = @@ -1776,6 +1857,9 @@ createLoopOp(Fortran::lower::AbstractConverter &converter, // Prepare the operand segment size attribute and the operands value range. llvm::SmallVector operands; llvm::SmallVector operandSegments; + addOperands(operands, operandSegments, lowerbounds); + addOperands(operands, operandSegments, upperbounds); + addOperands(operands, operandSegments, steps); addOperands(operands, operandSegments, gangOperands); addOperands(operands, operandSegments, workerNumOperands); addOperands(operands, operandSegments, vectorOperands); @@ -1793,8 +1877,15 @@ createLoopOp(Fortran::lower::AbstractConverter &converter, } auto loopOp = createRegionOp( - builder, currentLocation, eval, operands, operandSegments, - /*outerCombined=*/false, retTy, yieldValue); + builder, builder.getFusedLoc(locs), currentLocation, eval, operands, + operandSegments, /*outerCombined=*/false, retTy, yieldValue, ivTypes, + ivLocs); + + for (auto [arg, value] : llvm::zip( + loopOp.getLoopRegions().front()->front().getArguments(), ivPrivate)) + builder.create(currentLocation, arg, value); + + loopOp.setInclusiveUpperbound(inclusiveBounds); if (!gangDeviceTypes.empty()) loopOp.setGangAttr(builder.getArrayAttr(gangDeviceTypes)); @@ -1881,15 +1972,19 @@ genACC(Fortran::lower::AbstractConverter &converter, converter.genLocation(beginLoopDirective.source); Fortran::lower::StatementContext stmtCtx; - if (loopDirective.v == llvm::acc::ACCD_loop) { - const auto &accClauseList = - std::get(beginLoopDirective.t); - auto loopOp = - createLoopOp(converter, currentLocation, eval, semanticsContext, - stmtCtx, accClauseList, needEarlyExitHandling); - if (needEarlyExitHandling) - return loopOp.getResult(0); - } + assert(loopDirective.v == llvm::acc::ACCD_loop && + "Unsupported OpenACC loop construct"); + + const auto &accClauseList = + std::get(beginLoopDirective.t); + const auto &outerDoConstruct = + std::get>(loopConstruct.t); + auto loopOp = createLoopOp(converter, currentLocation, semanticsContext, + stmtCtx, *outerDoConstruct, eval, accClauseList, + needEarlyExitHandling); + if (needEarlyExitHandling) + return loopOp.getResult(0); + return mlir::Value{}; } @@ -2186,12 +2281,12 @@ createComputeOp(Fortran::lower::AbstractConverter &converter, Op computeOp; if constexpr (std::is_same_v) computeOp = createRegionOp( - builder, currentLocation, eval, operands, operandSegments, - outerCombined); + builder, currentLocation, currentLocation, eval, operands, + operandSegments, outerCombined); else computeOp = createRegionOp( - builder, currentLocation, eval, operands, operandSegments, - outerCombined); + builder, currentLocation, currentLocation, eval, operands, + operandSegments, outerCombined); if (addSelfAttr) computeOp.setSelfAttrAttr(builder.getUnitAttr()); @@ -2397,7 +2492,8 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter, return; auto dataOp = createRegionOp( - builder, currentLocation, eval, operands, operandSegments); + builder, currentLocation, currentLocation, eval, operands, + operandSegments); if (!asyncDeviceTypes.empty()) dataOp.setAsyncDeviceTypeAttr(builder.getArrayAttr(asyncDeviceTypes)); @@ -2486,7 +2582,8 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter, auto hostDataOp = createRegionOp( - builder, currentLocation, eval, operands, operandSegments); + builder, currentLocation, currentLocation, eval, operands, + operandSegments); if (addIfPresentAttr) hostDataOp.setIfPresentAttr(builder.getUnitAttr()); @@ -2539,6 +2636,9 @@ genACC(Fortran::lower::AbstractConverter &converter, std::get(beginCombinedDirective.t); const auto &accClauseList = std::get(beginCombinedDirective.t); + const auto &outerDoConstruct = + std::get>( + combinedConstruct.t); mlir::Location currentLocation = converter.genLocation(beginCombinedDirective.source); @@ -2548,20 +2648,20 @@ genACC(Fortran::lower::AbstractConverter &converter, createComputeOp( converter, currentLocation, eval, semanticsContext, stmtCtx, accClauseList, /*outerCombined=*/true); - createLoopOp(converter, currentLocation, eval, semanticsContext, stmtCtx, - accClauseList); + createLoopOp(converter, currentLocation, semanticsContext, stmtCtx, + *outerDoConstruct, eval, accClauseList); } else if (combinedDirective.v == llvm::acc::ACCD_parallel_loop) { createComputeOp( converter, currentLocation, eval, semanticsContext, stmtCtx, accClauseList, /*outerCombined=*/true); - createLoopOp(converter, currentLocation, eval, semanticsContext, stmtCtx, - accClauseList); + createLoopOp(converter, currentLocation, semanticsContext, stmtCtx, + *outerDoConstruct, eval, accClauseList); } else if (combinedDirective.v == llvm::acc::ACCD_serial_loop) { createComputeOp(converter, currentLocation, eval, semanticsContext, stmtCtx, accClauseList, /*outerCombined=*/true); - createLoopOp(converter, currentLocation, eval, semanticsContext, stmtCtx, - accClauseList); + createLoopOp(converter, currentLocation, semanticsContext, stmtCtx, + *outerDoConstruct, eval, accClauseList); } else { llvm::report_fatal_error("Unknown combined construct encountered"); } @@ -3985,3 +4085,16 @@ void Fortran::lower::genEarlyReturnInOpenACCLoop(fir::FirOpBuilder &builder, builder.createIntegerConstant(loc, builder.getI1Type(), 1); builder.create(loc, yieldValue); } + +int64_t Fortran::lower::getCollapseValue( + const Fortran::parser::AccClauseList &clauseList) { + for (const Fortran::parser::AccClause &clause : clauseList.v) { + if (const auto *collapseClause = + std::get_if(&clause.u)) { + const parser::AccCollapseArg &arg = collapseClause->v; + const auto &collapseValue{std::get(arg.t)}; + return *Fortran::semantics::GetIntValue(collapseValue); + } + } + return 1; +} diff --git a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 b/flang/test/Lower/OpenACC/acc-kernels-loop.f90 index 755111a69467b..21660d5c3a131 100644 --- a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-kernels-loop.f90 @@ -43,8 +43,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -57,8 +56,7 @@ subroutine acc_kernels_loop !$acc end kernels loop ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -71,8 +69,7 @@ subroutine acc_kernels_loop ! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.kernels async([[ASYNC1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -85,8 +82,7 @@ subroutine acc_kernels_loop ! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.kernels async([[ASYNC2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -98,8 +94,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -112,8 +107,7 @@ subroutine acc_kernels_loop ! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.kernels wait({[[WAIT1]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -127,8 +121,7 @@ subroutine acc_kernels_loop ! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32 ! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32 ! CHECK: acc.kernels wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -142,8 +135,7 @@ subroutine acc_kernels_loop ! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.kernels wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -156,8 +148,7 @@ subroutine acc_kernels_loop ! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.kernels num_gangs({[[NUMGANGS1]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -170,8 +161,7 @@ subroutine acc_kernels_loop ! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.kernels num_gangs({[[NUMGANGS2]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -184,8 +174,7 @@ subroutine acc_kernels_loop ! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32 ! CHECK: acc.kernels num_workers([[NUMWORKERS1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -198,8 +187,7 @@ subroutine acc_kernels_loop ! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.kernels num_workers([[NUMWORKERS2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -212,8 +200,7 @@ subroutine acc_kernels_loop ! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32 ! CHECK: acc.kernels vector_length([[VECTORLENGTH1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -226,8 +213,7 @@ subroutine acc_kernels_loop ! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.kernels vector_length([[VECTORLENGTH2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -240,8 +226,7 @@ subroutine acc_kernels_loop ! CHECK: [[IF1:%.*]] = arith.constant true ! CHECK: acc.kernels if([[IF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -255,8 +240,7 @@ subroutine acc_kernels_loop ! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref> ! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1 ! CHECK: acc.kernels if([[IF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -269,8 +253,7 @@ subroutine acc_kernels_loop ! CHECK: [[SELF1:%.*]] = arith.constant true ! CHECK: acc.kernels self([[SELF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -282,8 +265,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -297,8 +279,7 @@ subroutine acc_kernels_loop ! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#1 : (!fir.ref>) -> i1 ! CHECK: acc.kernels self(%[[SELF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -313,8 +294,7 @@ subroutine acc_kernels_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -330,8 +310,7 @@ subroutine acc_kernels_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -347,8 +326,7 @@ subroutine acc_kernels_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -362,8 +340,7 @@ subroutine acc_kernels_loop ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.kernels dataOperands(%[[CREATE_A]], %[[CREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -379,8 +356,7 @@ subroutine acc_kernels_loop ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: acc.kernels dataOperands(%[[CREATE_B]], %[[CREATE_A]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -396,8 +372,7 @@ subroutine acc_kernels_loop ! CHECK: %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.kernels dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -411,8 +386,7 @@ subroutine acc_kernels_loop ! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.kernels dataOperands(%[[PRESENT_A]], %[[PRESENT_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -426,8 +400,7 @@ subroutine acc_kernels_loop ! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.kernels dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -445,8 +418,7 @@ subroutine acc_kernels_loop ! CHECK: %[[BOX_ADDR_G:.*]] = fir.box_addr %[[BOX_G]] : (!fir.box>) -> !fir.ptr ! CHECK: %[[ATTACH_G:.*]] = acc.attach varPtr(%[[BOX_ADDR_G]] : !fir.ptr) -> !fir.ptr {name = "g"} ! CHECK: acc.kernels dataOperands(%[[ATTACH_F]], %[[ATTACH_G]] : !fir.ptr, !fir.ptr) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -458,10 +430,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {seq = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, seq = [#acc.device_type]} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -471,10 +442,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {auto_ = [#acc.device_type]} +! CHECK-NEXT: } attributes {auto_ = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -484,10 +454,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {independent = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -497,10 +466,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop gang { -! CHECK: fir.do_loop +! CHECK: acc.loop gang() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -511,8 +479,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -525,8 +492,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -538,8 +504,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -550,10 +515,9 @@ subroutine acc_kernels_loop a(i) = b(i) END DO ! CHECK: acc.kernels { -! CHECK: acc.loop vector { -! CHECK: fir.do_loop +! CHECK: acc.loop vector() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -564,8 +528,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop vector([[CONSTANT128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[CONSTANT128]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -578,8 +541,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -591,10 +553,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop worker { -! CHECK: fir.do_loop +! CHECK: acc.loop worker() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -605,8 +566,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop worker([[WORKER128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop worker([[WORKER128]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -620,11 +580,9 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} @@ -637,10 +595,8 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -655,8 +611,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -669,8 +624,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 -! CHECK: acc.loop tile({[[TILESIZEM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -686,8 +640,7 @@ subroutine acc_kernels_loop ! CHECK: acc.kernels { ! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 ! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -699,8 +652,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop tile({%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -714,8 +666,7 @@ subroutine acc_kernels_loop END DO ! CHECK: acc.kernels { -! CHECK: acc.loop tile({%{{.*}} : i32, %{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator @@ -730,8 +681,7 @@ subroutine acc_kernels_loop ! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_r"} ! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_i"} ! CHECK: acc.kernels dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref, !fir.ref) { -! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.terminator diff --git a/flang/test/Lower/OpenACC/acc-loop-exit.f90 b/flang/test/Lower/OpenACC/acc-loop-exit.f90 index 75f1c30733272..c1ea057af6673 100644 --- a/flang/test/Lower/OpenACC/acc-loop-exit.f90 +++ b/flang/test/Lower/OpenACC/acc-loop-exit.f90 @@ -15,11 +15,15 @@ subroutine sub1(x, a) ! CHECK-LABEL: func.func @_QPsub1 ! CHECK: %[[A:.*]]:2 = hlfir.declare %arg1 {uniq_name = "_QFsub1Ea"} : (!fir.ref) -> (!fir.ref, !fir.ref) -! CHECK: %[[EXIT_COND:.*]] = acc.loop { +! CHECK: %[[I:.*]]:2 = hlfir.declare %2 {uniq_name = "_QFsub1Ei"} : (!fir.ref) -> (!fir.ref, !fir.ref) +! CHECK: %[[I:.*]]:2 = hlfir.declare %6 {uniq_name = "_QFsub1Ei"} : (!fir.ref) -> (!fir.ref, !fir.ref) +! CHECK: %[[EXIT_COND:.*]] = acc.loop ! CHECK: ^bb{{.*}}: ! CHECK: ^bb{{.*}}: -! CHECK: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref -! CHECK: %[[CMP:.*]] = arith.cmpi eq, %15, %[[LOAD_A]] : i32 +! CHECK: %[[LOAD_I:.*]] = fir.load %[[I]]#0 : !fir.ref +! CHECK: %[[LOAD_I:.*]] = fir.load %[[I]]#0 : !fir.ref +! CHECK: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref +! CHECK: %[[CMP:.*]] = arith.cmpi eq, %[[LOAD_I]], %[[LOAD_A]] : i32 ! CHECK: cf.cond_br %[[CMP]], ^[[EARLY_RET:.*]], ^[[NO_RET:.*]] ! CHECK: ^[[EARLY_RET]]: ! CHECK: acc.yield %true : i1 diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90 index 59c2513332a97..334d8767a727a 100644 --- a/flang/test/Lower/OpenACC/acc-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-loop.f90 @@ -27,185 +27,168 @@ program acc_loop a(i) = b(i) END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} !$acc loop seq DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: } attributes {seq = [#acc.device_type]} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, seq = [#acc.device_type]} !$acc loop auto DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: } attributes {auto_ = [#acc.device_type]} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {auto_ = [#acc.device_type], inclusiveUpperbound = array} !$acc loop independent DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: } attributes {independent = [#acc.device_type]} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} !$acc loop gang DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop gang { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop gang() private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop gang(num: 8) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 -!CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop gang(num: gangNum) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref -!CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop gang(num: gangNum, static: gangStatic) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop vector DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop vector { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop vector() private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop vector(128) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 -!CHECK: acc.loop vector([[CONSTANT128]] : i32) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 +! CHECK: acc.loop vector([[CONSTANT128]] : i32) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: }{{$}} !$acc loop vector(vectorLength) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref -!CHECK: acc.loop vector([[VECTORLENGTH]] : i32) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref +! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop worker DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop worker { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop worker() private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop worker(128) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 -!CHECK: acc.loop worker([[WORKER128]] : i32) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 +! CHECK: acc.loop worker([[WORKER128]] : i32) private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop private(c) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop private(c, d) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop private(c) private(d) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref>) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop tile(2) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 -!CHECK: acc.loop tile({[[TILESIZE]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} + +! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 +! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop tile(*) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 -!CHECK: acc.loop tile({[[TILESIZEM1]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 +! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop tile(2, 2) DO i = 1, n @@ -214,22 +197,20 @@ program acc_loop END DO END DO -!CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 -!CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 -!CHECK: acc.loop tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 +! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 +! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop tile(tileSize) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop tile({%{{.*}} : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop tile(tileSize, tileSize) DO i = 1, n @@ -238,10 +219,9 @@ program acc_loop END DO END DO -!CHECK: acc.loop tile({%{{.*}} : i32, %{{.*}} : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop collapse(2) DO i = 1, n @@ -250,11 +230,11 @@ program acc_loop END DO END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK: acc.loop {{.*}} (%arg0 : i32, %arg1 : i32) = (%{{.*}} : i32, i32) to (%{{.*}} : i32, i32) step (%{{.*}} : i32, i32) { +! CHECK: fir.store %arg0 to %{{.*}} : !fir.ref +! CHECK: fir.store %arg1 to %{{.*}} : !fir.ref +! CHECK: acc.yield +! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type], inclusiveUpperbound = array} !$acc loop DO i = 1, n @@ -264,14 +244,12 @@ program acc_loop END DO END DO -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.loop { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop {{.*}} (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.loop {{.*}} (%arg1 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop reduction(+:reduction_r) reduction(*:reduction_i) do i = 1, n @@ -279,31 +257,27 @@ program acc_loop reduction_i = 1 end do -! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) { -! CHECK: fir.do_loop +! CHECK: acc.loop private(@privatization_ref_i32 -> %{{.*}} : !fir.ref) reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop gang(dim: gangDim, static: gangStatic) DO i = 1, n a(i) = b(i) END DO -!CHECK: acc.loop gang({dim=%{{.*}}, static=%{{.*}} : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop gang({dim=%{{.*}}, static=%{{.*}} : i32}) {{.*}} (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop gang(dim: 1) DO i = 1, n a(i) = b(i) END DO -!CHECK: [[GANGDIM1:%.*]] = arith.constant 1 : i32 -!CHECK-NEXT: acc.loop gang({dim=[[GANGDIM1]] : i32}) { -!CHECK: fir.do_loop -!CHECK: acc.yield -!CHECK-NEXT: }{{$}} +! CHECK: acc.loop gang({dim={{.*}} : i32}) {{.*}} (%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) { +! CHECK: acc.yield +! CHECK-NEXT: } attributes {inclusiveUpperbound = array} !$acc loop DO i = 1, n @@ -312,13 +286,12 @@ program acc_loop END DO ! CHECK: %[[CACHE:.*]] = acc.cache varPtr(%{{.*}} : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop cache(%[[CACHE]] : !fir.ref>) +! CHECK: acc.loop {{.*}} cache(%[[CACHE]] : !fir.ref>) !$acc loop do 100 i=0, n 100 continue ! CHECK: acc.loop -! CHECK: fir.do_loop !$acc loop gang device_type(nvidia) gang(8) DO i = 1, n diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90 index faef8517850e0..614d201f98e26 100644 --- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90 @@ -45,8 +45,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -59,8 +58,7 @@ subroutine acc_parallel_loop !$acc end parallel loop ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -73,8 +71,7 @@ subroutine acc_parallel_loop ! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.parallel async([[ASYNC1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -87,8 +84,7 @@ subroutine acc_parallel_loop ! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.parallel async([[ASYNC2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -100,8 +96,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -114,8 +109,7 @@ subroutine acc_parallel_loop ! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.parallel wait({[[WAIT1]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -129,8 +123,7 @@ subroutine acc_parallel_loop ! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32 ! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32 ! CHECK: acc.parallel wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -144,8 +137,7 @@ subroutine acc_parallel_loop ! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.parallel wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -158,8 +150,7 @@ subroutine acc_parallel_loop ! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.parallel num_gangs({[[NUMGANGS1]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -172,8 +163,7 @@ subroutine acc_parallel_loop ! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.parallel num_gangs({[[NUMGANGS2]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -186,8 +176,7 @@ subroutine acc_parallel_loop ! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32 ! CHECK: acc.parallel num_workers([[NUMWORKERS1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -200,8 +189,7 @@ subroutine acc_parallel_loop ! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.parallel num_workers([[NUMWORKERS2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -214,8 +202,7 @@ subroutine acc_parallel_loop ! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32 ! CHECK: acc.parallel vector_length([[VECTORLENGTH1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -228,8 +215,7 @@ subroutine acc_parallel_loop ! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.parallel vector_length([[VECTORLENGTH2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -242,8 +228,7 @@ subroutine acc_parallel_loop ! CHECK: [[IF1:%.*]] = arith.constant true ! CHECK: acc.parallel if([[IF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -257,8 +242,7 @@ subroutine acc_parallel_loop ! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref> ! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1 ! CHECK: acc.parallel if([[IF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -271,8 +255,7 @@ subroutine acc_parallel_loop ! CHECK: [[SELF1:%.*]] = arith.constant true ! CHECK: acc.parallel self([[SELF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -284,8 +267,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -298,8 +280,7 @@ subroutine acc_parallel_loop ! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#1 : (!fir.ref>) -> i1 ! CHECK: acc.parallel self(%[[SELF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -313,8 +294,7 @@ subroutine acc_parallel_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -330,8 +310,7 @@ subroutine acc_parallel_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -347,8 +326,7 @@ subroutine acc_parallel_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -362,8 +340,7 @@ subroutine acc_parallel_loop ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.parallel dataOperands(%[[CREATE_A]], %[[CREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -379,8 +356,7 @@ subroutine acc_parallel_loop ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: acc.parallel dataOperands(%[[CREATE_B]], %[[CREATE_A]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -396,8 +372,7 @@ subroutine acc_parallel_loop ! CHECK: %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.parallel dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -411,8 +386,7 @@ subroutine acc_parallel_loop ! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.parallel dataOperands(%[[PRESENT_A]], %[[PRESENT_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -426,8 +400,7 @@ subroutine acc_parallel_loop ! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.parallel dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -445,8 +418,7 @@ subroutine acc_parallel_loop ! CHECK: %[[BOX_ADDR_G:.*]] = fir.box_addr %[[BOX_G]] : (!fir.box>) -> !fir.ptr ! CHECK: %[[ATTACH_G:.*]] = acc.attach varPtr(%[[BOX_ADDR_G]] : !fir.ptr) -> !fir.ptr {name = "g"} ! CHECK: acc.parallel dataOperands(%[[ATTACH_F]], %[[ATTACH_G]] : !fir.ptr, !fir.ptr) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -460,8 +432,8 @@ subroutine acc_parallel_loop ! CHECK: %[[ACC_PRIVATE_B:.*]] = acc.firstprivate varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.parallel firstprivate(@firstprivatization_section_ext10_ref_10xf32 -> %[[ACC_PRIVATE_B]] : !fir.ref>) { ! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} -! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { -! CHECK: fir.do_loop +! CHECK: acc.loop private({{.*}}@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -473,10 +445,9 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {seq = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, seq = [#acc.device_type]} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -486,10 +457,9 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {auto_ = [#acc.device_type]} +! CHECK-NEXT: } attributes {auto_ = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -499,10 +469,9 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {independent = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -512,10 +481,9 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop gang { -! CHECK: fir.do_loop +! CHECK: acc.loop gang() ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -526,8 +494,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -540,8 +507,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -553,8 +519,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -565,10 +530,9 @@ subroutine acc_parallel_loop a(i) = b(i) END DO ! CHECK: acc.parallel { -! CHECK: acc.loop vector { -! CHECK: fir.do_loop +! CHECK: acc.loop vector() ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -579,8 +543,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop vector([[CONSTANT128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[CONSTANT128]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -593,8 +556,8 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) {{.*}} { +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -606,10 +569,10 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop worker { -! CHECK: fir.do_loop +! CHECK: acc.loop worker() {{.*}} { +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -620,8 +583,8 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop worker([[WORKER128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop worker([[WORKER128]] : i32) {{.*}} { +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -635,11 +598,9 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -652,10 +613,8 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -670,8 +629,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -684,8 +642,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 -! CHECK: acc.loop tile({[[TILESIZEM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -701,8 +658,7 @@ subroutine acc_parallel_loop ! CHECK: acc.parallel { ! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 ! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -714,8 +670,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop tile({%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -729,8 +684,7 @@ subroutine acc_parallel_loop END DO ! CHECK: acc.parallel { -! CHECK: acc.loop tile({%{{.*}} : i32, %{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -745,8 +699,7 @@ subroutine acc_parallel_loop ! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_r"} ! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_i"} ! CHECK: acc.parallel dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref, !fir.ref) { -! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) {{.*}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -754,11 +707,12 @@ subroutine acc_parallel_loop ! CHECK: acc.copyout accPtr(%[[COPYINREDR]] : !fir.ref) to varPtr(%{{.*}} : !fir.ref) {dataClause = #acc, implicit = true, name = "reduction_r"} ! CHECK: acc.copyout accPtr(%[[COPYINREDI]] : !fir.ref) to varPtr(%{{.*}} : !fir.ref) {dataClause = #acc, implicit = true, name = "reduction_i"} + !$acc parallel loop do 10 i=0, n 10 continue ! CHECK: acc.parallel ! CHECK: acc.loop -! CHECK: fir.do_loop +! CHECK-NOT: fir.do_loop end subroutine acc_parallel_loop diff --git a/flang/test/Lower/OpenACC/acc-private.f90 b/flang/test/Lower/OpenACC/acc-private.f90 index 042596568bd77..c0bcb5e2ffd56 100644 --- a/flang/test/Lower/OpenACC/acc-private.f90 +++ b/flang/test/Lower/OpenACC/acc-private.f90 @@ -189,7 +189,7 @@ program acc_private END DO ! CHECK: %[[C_PRIVATE:.*]] = acc.private varPtr(%[[DECLC]]#1 : !fir.ref) -> !fir.ref {name = "c"} -! CHECK: acc.loop private(@privatization_ref_i32 -> %[[C_PRIVATE]] : !fir.ref) +! CHECK: acc.loop private({{.*}}@privatization_ref_i32 -> %[[C_PRIVATE]] : !fir.ref) ! CHECK: acc.yield !$acc loop private(b) @@ -203,7 +203,7 @@ program acc_private ! CHECK: %[[UB:.*]] = arith.subi %{{.*}}, %[[C1]] : index ! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%{{.*}} : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index) ! CHECK: %[[B_PRIVATE:.*]] = acc.private varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%[[BOUND]]) -> !fir.ref> {name = "b"} -! CHECK: acc.loop private(@privatization_ref_100xf32 -> %[[B_PRIVATE]] : !fir.ref>) { +! CHECK: acc.loop private({{.*}}@privatization_ref_100xf32 -> %[[B_PRIVATE]] : !fir.ref>) ! CHECK: acc.yield !$acc loop private(b(1:50)) @@ -217,7 +217,7 @@ program acc_private ! CHECK: %[[UB:.*]] = arith.constant 49 : index ! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%{{.*}} : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index) ! CHECK: %[[B_PRIVATE:.*]] = acc.private varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%[[BOUND]]) -> !fir.ref> {name = "b(1:50)"} -! CHECK: acc.loop private(@privatization_ref_50xf32 -> %[[B_PRIVATE]] : !fir.ref>) +! CHECK: acc.loop private({{.*}}@privatization_ref_50xf32 -> %[[B_PRIVATE]] : !fir.ref>) !$acc parallel loop firstprivate(c) DO i = 1, n @@ -273,7 +273,7 @@ subroutine acc_private_assumed_shape(a, n) ! CHECK: acc.parallel { ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[DECL_A]]#1 : (!fir.box>) -> !fir.ref> ! CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[ADDR]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} -! CHECK: acc.loop private(@privatization_box_Uxi32 -> %[[PRIVATE]] : !fir.ref>) { +! CHECK: acc.loop private({{.*}}@privatization_box_Uxi32 -> %[[PRIVATE]] : !fir.ref>) subroutine acc_private_allocatable_array(a, n) integer, allocatable :: a(:) @@ -296,7 +296,7 @@ subroutine acc_private_allocatable_array(a, n) ! CHECK: %[[BOX:.*]] = fir.load %[[DECLA_A]]#1 : !fir.ref>>> ! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.box>>) -> !fir.heap> ! CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[BOX_ADDR]] : !fir.heap>) bounds(%{{.*}}) -> !fir.heap> {name = "a"} -! CHECK: acc.loop private(@privatization_box_heap_Uxi32 -> %[[PRIVATE]] : !fir.heap>) +! CHECK: acc.loop private({{.*}}@privatization_box_heap_Uxi32 -> %[[PRIVATE]] : !fir.heap>) ! CHECK: acc.serial private(@privatization_box_heap_Uxi32 -> %{{.*}} : !fir.heap>) subroutine acc_private_pointer_array(a, n) @@ -316,7 +316,7 @@ subroutine acc_private_pointer_array(a, n) ! CHECK: %[[BOX:.*]] = fir.load %[[DECLA_A]]#1 : !fir.ref>>> ! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.box>>) -> !fir.ptr> ! CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[BOX_ADDR]] : !fir.ptr>) bounds(%{{.*}}) -> !fir.ptr> {name = "a"} -! CHECK: acc.loop private(@privatization_box_ptr_Uxi32 -> %[[PRIVATE]] : !fir.ptr>) +! CHECK: acc.loop private({{.*}}@privatization_box_ptr_Uxi32 -> %[[PRIVATE]] : !fir.ptr>) subroutine acc_private_dynamic_extent(a, n) integer :: n, i @@ -334,7 +334,7 @@ subroutine acc_private_dynamic_extent(a, n) ! CHECK: %[[DECL_A:.*]]:2 = hlfir.declare %[[ARG0]](%16) {uniq_name = "_QFacc_private_dynamic_extentEa"} : (!fir.ref>, !fir.shape<3>) -> (!fir.box>, !fir.ref>) ! CHECK: acc.parallel { ! CHECK: %[[PRIV:.*]] = acc.private varPtr(%[[DECL_A]]#1 : !fir.ref>) bounds(%{{.*}}, %{{.*}}, %{{.*}}) -> !fir.ref> {name = "a"} -! CHECK: acc.loop private(@privatization_ref_UxUx2xi32 -> %[[PRIV]] : !fir.ref>) +! CHECK: acc.loop private({{.*}}@privatization_ref_UxUx2xi32 -> %[[PRIV]] : !fir.ref>) subroutine acc_firstprivate_assumed_shape(a, n) integer :: a(:), i, n diff --git a/flang/test/Lower/OpenACC/acc-reduction.f90 b/flang/test/Lower/OpenACC/acc-reduction.f90 index fe04c3114b7e6..66a3153191723 100644 --- a/flang/test/Lower/OpenACC/acc-reduction.f90 +++ b/flang/test/Lower/OpenACC/acc-reduction.f90 @@ -704,7 +704,7 @@ subroutine acc_reduction_add_int(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_ref_i32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_add_ref_i32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_add_int_array_1d(a, b) integer :: a(100) @@ -720,7 +720,7 @@ subroutine acc_reduction_add_int_array_1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_section_ext100_ref_100xi32 -> %[[RED_B]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_add_section_ext100_ref_100xi32 -> %[[RED_B]] : !fir.ref>) subroutine acc_reduction_add_int_array_2d(a, b) integer :: a(100, 10), b(100, 10) @@ -738,8 +738,8 @@ subroutine acc_reduction_add_int_array_2d(a, b) ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) { ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_section_ext100xext10_ref_100x10xi32 -> %[[RED_ARG1]] : !fir.ref>) { -! CHECK: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK: acc.loop {{.*}} reduction(@reduction_add_section_ext100xext10_ref_100x10xi32 -> %[[RED_ARG1]] : !fir.ref>) +! CHECK: } attributes {collapse = [2]{{.*}} subroutine acc_reduction_add_int_array_3d(a, b) integer :: a(100, 10, 2), b(100, 10, 2) @@ -759,8 +759,8 @@ subroutine acc_reduction_add_int_array_3d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}, %{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_section_ext100xext10xext2_ref_100x10x2xi32 -> %[[RED_ARG1]] : !fir.ref>) -! CHECK: } attributes {collapse = [3], collapseDeviceType = [#acc.device_type]} +! CHECK: acc.loop {{.*}} reduction(@reduction_add_section_ext100xext10xext2_ref_100x10x2xi32 -> %[[RED_ARG1]] : !fir.ref>) +! CHECK: } attributes {collapse = [3]{{.*}} subroutine acc_reduction_add_float(a, b) real :: a(100), b @@ -776,7 +776,7 @@ subroutine acc_reduction_add_float(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_add_ref_f32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_add_float_array_1d(a, b) real :: a(100), b(100) @@ -792,7 +792,7 @@ subroutine acc_reduction_add_float_array_1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_add_section_ext100_ref_100xf32 -> %[[RED_B]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_add_section_ext100_ref_100xf32 -> %[[RED_B]] : !fir.ref>) subroutine acc_reduction_mul_int(a, b) integer :: a(100) @@ -808,7 +808,7 @@ subroutine acc_reduction_mul_int(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_mul_ref_i32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_mul_ref_i32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_mul_int_array_1d(a, b) integer :: a(100) @@ -824,7 +824,7 @@ subroutine acc_reduction_mul_int_array_1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_mul_section_ext100_ref_100xi32 -> %[[RED_B]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_mul_section_ext100_ref_100xi32 -> %[[RED_B]] : !fir.ref>) subroutine acc_reduction_mul_float(a, b) real :: a(100), b @@ -840,7 +840,7 @@ subroutine acc_reduction_mul_float(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_mul_ref_f32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_mul_ref_f32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_mul_float_array_1d(a, b) real :: a(100), b(100) @@ -856,7 +856,7 @@ subroutine acc_reduction_mul_float_array_1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_mul_section_ext100_ref_100xf32 -> %[[RED_B]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_mul_section_ext100_ref_100xf32 -> %[[RED_B]] : !fir.ref>) subroutine acc_reduction_min_int(a, b) integer :: a(100) @@ -872,7 +872,7 @@ subroutine acc_reduction_min_int(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_min_ref_i32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_min_ref_i32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_min_int_array_1d(a, b) integer :: a(100), b(100) @@ -888,7 +888,7 @@ subroutine acc_reduction_min_int_array_1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_min_section_ext100_ref_100xi32 -> %[[RED_ARG1]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_min_section_ext100_ref_100xi32 -> %[[RED_ARG1]] : !fir.ref>) subroutine acc_reduction_min_float(a, b) real :: a(100), b @@ -904,7 +904,7 @@ subroutine acc_reduction_min_float(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_min_ref_f32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_min_ref_f32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_min_float_array2d(a, b) real :: a(100, 10), b(100, 10) @@ -922,8 +922,8 @@ subroutine acc_reduction_min_float_array2d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_min_section_ext100xext10_ref_100x10xf32 -> %[[RED_ARG1]] : !fir.ref>) -! CHECK: attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK: acc.loop {{.*}} reduction(@reduction_min_section_ext100xext10_ref_100x10xf32 -> %[[RED_ARG1]] : !fir.ref>) +! CHECK: attributes {collapse = [2]{{.*}} subroutine acc_reduction_max_int(a, b) integer :: a(100) @@ -939,7 +939,7 @@ subroutine acc_reduction_max_int(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_max_ref_i32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_max_ref_i32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_max_int_array2d(a, b) integer :: a(100, 10), b(100, 10) @@ -957,7 +957,7 @@ subroutine acc_reduction_max_int_array2d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_max_section_ext100xext10_ref_100x10xi32 -> %[[RED_ARG1]] : !fir.ref>) +! CHECK: acc.loop {{.*}} reduction(@reduction_max_section_ext100xext10_ref_100x10xi32 -> %[[RED_ARG1]] : !fir.ref>) subroutine acc_reduction_max_float(a, b) real :: a(100), b @@ -973,7 +973,7 @@ subroutine acc_reduction_max_float(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref {fir.bindc_name = "b"}) ! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]] ! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#1 : !fir.ref) -> !fir.ref {name = "b"} -! CHECK: acc.loop reduction(@reduction_max_ref_f32 -> %[[RED_B]] : !fir.ref) +! CHECK: acc.loop {{.*}} reduction(@reduction_max_ref_f32 -> %[[RED_B]] : !fir.ref) subroutine acc_reduction_max_float_array1d(a, b) real :: a(100), b(100) @@ -989,7 +989,7 @@ subroutine acc_reduction_max_float_array1d(a, b) ! CHECK-SAME: %{{.*}}: !fir.ref> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref> {fir.bindc_name = "b"}) ! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} -! CHECK: acc.loop reduction(@reduction_max_section_ext100_ref_100xf32 -> %[[RED_ARG1]] : !fir.ref>) { +! CHECK: acc.loop {{.*}} reduction(@reduction_max_section_ext100_ref_100xf32 -> %[[RED_ARG1]] : !fir.ref>) subroutine acc_reduction_iand() integer :: i diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90 index 9333761e4c296..4134f9ff0ccf5 100644 --- a/flang/test/Lower/OpenACC/acc-serial-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90 @@ -64,8 +64,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -78,8 +77,7 @@ subroutine acc_serial_loop !$acc end serial loop ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -92,8 +90,7 @@ subroutine acc_serial_loop ! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.serial async([[ASYNC1]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -106,8 +103,7 @@ subroutine acc_serial_loop ! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.serial async([[ASYNC2]] : i32) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -119,8 +115,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -133,8 +128,7 @@ subroutine acc_serial_loop ! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32 ! CHECK: acc.serial wait({[[WAIT1]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -148,8 +142,7 @@ subroutine acc_serial_loop ! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32 ! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32 ! CHECK: acc.serial wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -163,8 +156,7 @@ subroutine acc_serial_loop ! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref ! CHECK: acc.serial wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -177,8 +169,7 @@ subroutine acc_serial_loop ! CHECK: [[IF1:%.*]] = arith.constant true ! CHECK: acc.serial if([[IF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -192,8 +183,7 @@ subroutine acc_serial_loop ! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref> ! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1 ! CHECK: acc.serial if([[IF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -206,8 +196,7 @@ subroutine acc_serial_loop ! CHECK: [[SELF1:%.*]] = arith.constant true ! CHECK: acc.serial self([[SELF1]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -219,8 +208,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -233,8 +221,7 @@ subroutine acc_serial_loop ! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#1 : (!fir.ref>) -> i1 ! CHECK: acc.serial self(%[[SELF2]]) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -248,8 +235,7 @@ subroutine acc_serial_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.serial dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -265,8 +251,7 @@ subroutine acc_serial_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.serial dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -282,8 +267,7 @@ subroutine acc_serial_loop ! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.serial dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -297,8 +281,7 @@ subroutine acc_serial_loop ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "b"} ! CHECK: acc.serial dataOperands(%[[CREATE_A]], %[[CREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -314,8 +297,7 @@ subroutine acc_serial_loop ! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a"} ! CHECK: acc.serial dataOperands(%[[CREATE_B]], %[[CREATE_A]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -331,8 +313,7 @@ subroutine acc_serial_loop ! CHECK: %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.serial dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -346,8 +327,7 @@ subroutine acc_serial_loop ! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.serial dataOperands(%[[PRESENT_A]], %[[PRESENT_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -361,8 +341,7 @@ subroutine acc_serial_loop ! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} ! CHECK: %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.serial dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]] : !fir.ref>, !fir.ref>) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -380,8 +359,7 @@ subroutine acc_serial_loop ! CHECK: %[[BOX_ADDR_G:.*]] = fir.box_addr %[[BOX_G]] : (!fir.box>) -> !fir.ptr ! CHECK: %[[ATTACH_G:.*]] = acc.attach varPtr(%[[BOX_ADDR_G]] : !fir.ptr) -> !fir.ptr {name = "g"} ! CHECK: acc.serial dataOperands(%[[ATTACH_F]], %[[ATTACH_G]] : !fir.ptr, !fir.ptr) { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -395,8 +373,8 @@ subroutine acc_serial_loop ! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[DECLB]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} ! CHECK: acc.serial firstprivate(@firstprivatization_section_ext10_ref_10xf32 -> %[[ACC_FPRIVATE_B]] : !fir.ref>) { ! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[DECLA]]#1 : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} -! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { -! CHECK: fir.do_loop +! CHECK: acc.loop private({{.*}}@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -408,10 +386,9 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {seq = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, seq = [#acc.device_type]} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -421,10 +398,9 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {auto_ = [#acc.device_type]} +! CHECK-NEXT: } attributes {auto_ = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -434,10 +410,9 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: } attributes {independent = [#acc.device_type]} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array, independent = [#acc.device_type]} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -447,10 +422,9 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop gang { -! CHECK: fir.do_loop +! CHECK: acc.loop gang() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -461,8 +435,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM1]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -475,8 +448,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) { -! CHECK: fir.do_loop +! CHECK-NEXT: acc.loop gang({num=[[GANGNUM2]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -488,8 +460,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -500,10 +471,9 @@ subroutine acc_serial_loop a(i) = b(i) END DO ! CHECK: acc.serial { -! CHECK: acc.loop vector { -! CHECK: fir.do_loop +! CHECK: acc.loop vector() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -514,8 +484,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop vector([[CONSTANT128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[CONSTANT128]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -528,8 +497,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref -! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop vector([[VECTORLENGTH]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -541,10 +509,9 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop worker { -! CHECK: fir.do_loop +! CHECK: acc.loop worker() {{.*}} { ! CHECK: acc.yield -! CHECK-NEXT: }{{$}} +! CHECK-NEXT: } attributes {inclusiveUpperbound = array}{{$}} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -555,8 +522,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 -! CHECK: acc.loop worker([[WORKER128]] : i32) { -! CHECK: fir.do_loop +! CHECK: acc.loop worker([[WORKER128]] : i32) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -570,11 +536,10 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield -! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type]} +! CHECK-NEXT: } attributes {collapse = [2], collapseDeviceType = [#acc.device_type], inclusiveUpperbound = array} ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} @@ -587,10 +552,8 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop { -! CHECK: fir.do_loop -! CHECK: acc.loop { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} { +! CHECK: acc.loop {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -605,8 +568,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -619,8 +581,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 -! CHECK: acc.loop tile({[[TILESIZEM1]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -636,8 +597,7 @@ subroutine acc_serial_loop ! CHECK: acc.serial { ! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 ! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 -! CHECK: acc.loop tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -649,8 +609,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop tile({%{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -664,8 +623,7 @@ subroutine acc_serial_loop END DO ! CHECK: acc.serial { -! CHECK: acc.loop tile({%{{.*}} : i32, %{{.*}} : i32}) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) {{.*}} { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield @@ -680,8 +638,8 @@ subroutine acc_serial_loop ! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_r"} ! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref) -> !fir.ref {dataClause = #acc, implicit = true, name = "reduction_i"} ! CHECK: acc.serial dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref, !fir.ref) { -! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) { -! CHECK: fir.do_loop +! CHECK: acc.loop {{.*}} reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref) +! CHECK-NOT: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} ! CHECK: acc.yield diff --git a/flang/test/Lower/OpenACC/locations.f90 b/flang/test/Lower/OpenACC/locations.f90 index c0114476b57ee..84dd512a5d43f 100644 --- a/flang/test/Lower/OpenACC/locations.f90 +++ b/flang/test/Lower/OpenACC/locations.f90 @@ -53,7 +53,7 @@ subroutine nested_acc_locations(arr1d) !CHECK: acc.loop !CHECK: acc.yield loc("{{.*}}locations.f90":44:11) - !CHECK-NEXT: } loc("{{.*}}locations.f90":44:11) + !CHECK-NEXT: } attributes {{.*}} loc(fused["{{.*}}locations.f90":44:11, "{{.*}}locations.f90":45:5]) !CHECK: acc.yield loc("{{.*}}locations.f90":43:11) !CHECK-NEXT: } loc("{{.*}}locations.f90":43:11) @@ -87,7 +87,7 @@ subroutine combined_directive_locations(arr) !CHECK: acc.parallel !CHECK: acc.loop !CHECK: acc.yield loc("{{.*}}locations.f90":82:11) - !CHECK-NEXT: } loc("{{.*}}locations.f90":82:11) + !CHECK-NEXT: } {{.*}} loc(fused["{{.*}}locations.f90":82:11, "{{.*}}locations.f90":83:5]) !CHECK: acc.yield loc("{{.*}}locations.f90":82:11) !CHECK-NEXT: } loc("{{.*}}locations.f90":82:11) end subroutine @@ -106,7 +106,7 @@ subroutine if_clause_expr_location(arr) !CHECK: acc.parallel !CHECK: acc.loop !CHECK: acc.yield loc("{{.*}}locations.f90":99:11) - !CHECK-NEXT: } loc("{{.*}}locations.f90":99:11) + !CHECK-NEXT: } {{.*}} loc(fused["{{.*}}locations.f90":99:11, "{{.*}}locations.f90":100:5]) !CHECK: acc.yield loc("{{.*}}locations.f90":99:11) !CHECK-NEXT: } loc("{{.*}}locations.f90":99:11) end subroutine @@ -150,16 +150,26 @@ subroutine atomic_update_loc() ! CHECK: } loc("{{.*}}locations.f90":142:3) !$acc atomic update - z = x * z - - ! %3 = fir.load %0 : !fir.ref loc("/local/home/vclement/llvm-project/flang/test/Lower/OpenACC/locations.f90":142:3) - ! acc.atomic.update %2 : !fir.ref { - ! ^bb0(%arg0: i32 loc("/local/home/vclement/llvm-project/flang/test/Lower/OpenACC/locations.f90":142:3)): - ! %4 = arith.muli %3, %arg0 : i32 loc("/local/home/vclement/llvm-project/flang/test/Lower/OpenACC/locations.f90":142:3) - ! acc.yield %4 : i32 loc("/local/home/vclement/llvm-project/flang/test/Lower/OpenACC/locations.f90":142:3) - ! } loc("/local/home/vclement/llvm-project/flang/test/Lower/OpenACC/locations.f90":142:3) + z = x * z + end subroutine + + subroutine acc_loop_fused_locations(arr) + real, dimension(10,10,10) :: arr + integer :: i, j, k + + !$acc loop collapse(3) + do i = 1, 10 + do j = 1, 10 + do k = 1, 10 + arr(i,j,k) = arr(i,j,k) * 2 + end do + end do + end do end subroutine +! CHECK-LABEL: func.func @_QMacc_locationsPacc_loop_fused_locations +! CHECK: acc.loop +! CHECK: } attributes {collapse = [3]{{.*}}} loc(fused["{{.*}}locations.f90":160:11, "{{.*}}locations.f90":161:5, "{{.*}}locations.f90":162:7, "{{.*}}locations.f90":163:9]) end module