diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -638,6 +638,7 @@ mlir::Value workerNum; mlir::Value vectorNum; mlir::Value gangNum; + mlir::Value gangDim; mlir::Value gangStatic; llvm::SmallVector tileOperands, privateOperands, reductionOperands; @@ -657,7 +658,6 @@ } else if (const auto *staticArg = std::get_if( &gangArg.u)) { - const Fortran::parser::AccSizeExpr &sizeExpr = staticArg->v; if (sizeExpr.v) { gangStatic = fir::getBase(converter.genExprValue( @@ -668,6 +668,11 @@ gangStatic = firOpBuilder.createIntegerConstant( clauseLocation, firOpBuilder.getIndexType(), starCst); } + } else if (const auto *dim = + std::get_if( + &gangArg.u)) { + gangDim = fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(dim->v), stmtCtx)); } } } @@ -721,6 +726,7 @@ llvm::SmallVector operands; llvm::SmallVector operandSegments; addOperand(operands, operandSegments, gangNum); + addOperand(operands, operandSegments, gangDim); addOperand(operands, operandSegments, gangStatic); addOperand(operands, operandSegments, workerNum); addOperand(operands, operandSegments, vectorNum); diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90 --- a/flang/test/Lower/OpenACC/acc-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-loop.f90 @@ -9,6 +9,7 @@ real, dimension(n) :: a, b real, dimension(n, n) :: c, d integer :: gangNum = 8 + integer :: gangDim = 1 integer :: gangStatic = 8 integer :: vectorLength = 128 integer, parameter :: tileSize = 2 @@ -263,6 +264,27 @@ !CHECK: acc.yield !CHECK-NEXT: }{{$}} !CHECK: acc.yield +!CHECK-NEXT: }{{$}} + + !$acc loop gang(num: gangNum, dim: gangDim, static: gangStatic) + DO i = 1, n + a(i) = b(i) + END DO + +!CHECK: acc.loop gang(num=%{{.*}} : i32, dim=%{{.*}}, static=%{{.*}} : i32) { +!CHECK: fir.do_loop +!CHECK: acc.yield +!CHECK-NEXT: }{{$}} + + !$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: }{{$}} end program