From b5889765ba7a25b08b0fad1c2cfb674ff783f641 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Tue, 10 Dec 2024 09:38:00 -0800 Subject: [PATCH] [flang][cuda] Fix lowering when step is a variable --- flang/lib/Lower/Bridge.cpp | 6 ++++-- .../Lower/CUDA/cuda-kernel-loop-directive.cuf | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index ce8e18bea26db..de2b941b688be 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -3037,8 +3037,10 @@ class FirConverter : public Fortran::lower::AbstractConverter { fir::getBase(genExprValue(*Fortran::semantics::GetExpr(bounds->upper), stmtCtx)))); if (bounds->step) - steps.push_back(fir::getBase( - genExprValue(*Fortran::semantics::GetExpr(bounds->step), stmtCtx))); + steps.push_back(builder->createConvert( + crtLoc, idxTy, + fir::getBase(genExprValue( + *Fortran::semantics::GetExpr(bounds->step), stmtCtx)))); else // If `step` is not present, assume it is `1`. steps.push_back(builder->createIntegerConstant(loc, idxTy, 1)); diff --git a/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf b/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf index aac569b6eb35b..09aefc055e6fa 100644 --- a/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf +++ b/flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf @@ -98,3 +98,18 @@ end subroutine ! CHECK-LABEL: func.func @_QPsub2 ! CHECK: cuf.kernel + +subroutine sub3() + integer, device :: a(10), b(10) + integer :: lb = 1 + integer :: n = 10 + integer :: s = 1 + + !$cuf kernel do <<< *, * >>> + do i = lb, n, s + a(i) = a(i) * b(i) + end do +end + +! CHECK-LABEL: func.func @_QPsub3 +! CHECK: cuf.kernel