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 @@ -790,7 +790,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( @@ -801,6 +800,11 @@ gangStatic = builder.createIntegerConstant( clauseLocation, builder.getIndexType(), starCst); } + } else if (const auto *dim = + std::get_if( + &gangArg.u)) { + gangDim = fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(dim->v), stmtCtx)); } } } 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 @@ -14,6 +14,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 @@ -283,4 +284,25 @@ ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} + !$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: }{{$}} + + !$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