From 4c6ce928ec3a95ea95d3ed86cb35c11125497281 Mon Sep 17 00:00:00 2001 From: Nimish Mishra Date: Thu, 3 Oct 2024 15:59:10 +0530 Subject: [PATCH 1/2] [flang][OpenMP] Enable lastprivate on simd --- .../lib/Lower/OpenMP/DataSharingProcessor.cpp | 5 +-- flang/test/Lower/OpenMP/simd.f90 | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index d3e892be74fd8..eec14fc1b570d 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -191,11 +191,12 @@ void DataSharingProcessor::insertLastPrivateCompare(mlir::Operation *op) { if (clause.id != llvm::omp::OMPC_lastprivate) continue; // TODO: Add lastprivate support for simd construct - if (mlir::isa(op)) { + if (mlir::isa(op) || + mlir::isa(op)) { // Update the original variable just before exiting the worksharing // loop. Conversion as follows: // - // omp.wsloop { omp.wsloop { + // omp.wsloop / omp.simd { omp.wsloop / omp.simd { // omp.loop_nest { omp.loop_nest { // ... ... // store ===> store diff --git a/flang/test/Lower/OpenMP/simd.f90 b/flang/test/Lower/OpenMP/simd.f90 index bdc6a1eef0156..3b2aeceb4c3f9 100644 --- a/flang/test/Lower/OpenMP/simd.f90 +++ b/flang/test/Lower/OpenMP/simd.f90 @@ -241,3 +241,36 @@ subroutine simd_with_nontemporal_clause(n) end do !$OMP END SIMD end subroutine + +!CHECK-LABEL: func.func @_QPlastprivate_with_simd() { +subroutine lastprivate_with_simd + +!CHECK: %[[VAR_SUM:.*]] = fir.alloca f32 {bindc_name = "sum", uniq_name = "_QFlastprivate_with_simdEsum"} +!CHECK: %[[VAR_SUM_DECLARE:.*]]:2 = hlfir.declare %[[VAR_SUM]] {{.*}} +!CHECK: %[[VAR_SUM_PINNED:.*]] = fir.alloca f32 {bindc_name = "sum", pinned, uniq_name = "_QFlastprivate_with_simdEsum"} +!CHECK: %[[VAR_SUM_PINNED_DECLARE:.*]]:2 = hlfir.declare %[[VAR_SUM_PINNED]] {{.*}} + + implicit none + integer :: i + real :: sum + + +!CHECK: omp.simd { +!CHECK: omp.loop_nest (%[[ARG:.*]]) : i32 = ({{.*}} to ({{.*}}) inclusive step ({{.*}}) { +!CHECK: %[[ADD_RESULT:.*]] = arith.addi {{.*}} +!CHECK: %[[ADD_RESULT_CONVERT:.*]] = fir.convert %[[ADD_RESULT]] : (i32) -> f32 +!CHECK: hlfir.assign %[[ADD_RESULT_CONVERT]] to %[[VAR_SUM_PINNED_DECLARE]]#0 : f32, !fir.ref +!CHECK: %[[SELECT_RESULT:.*]] = arith.select {{.*}}, {{.*}}, {{.*}} : i1 +!CHECK: fir.if %[[SELECT_RESULT]] { +!CHECK: %[[LOADED_SUM:.*]] = fir.load %[[VAR_SUM_PINNED_DECLARE]]#0 : !fir.ref +!CHECK: hlfir.assign %[[LOADED_SUM]] to %[[VAR_SUM_DECLARE]]#0 : f32, !fir.ref +!CHECK: } +!CHECK: omp.yield +!CHECK: } +!CHECK: omp.terminator +!CHECK: } + !$omp simd lastprivate(sum) + do i = 1, 100 + sum = i + 1 + end do +end subroutine From 1044beaa8e78a06328483b0be8ab690753ccd76c Mon Sep 17 00:00:00 2001 From: Nimish Mishra Date: Thu, 3 Oct 2024 16:01:47 +0530 Subject: [PATCH 2/2] Remove TODO --- flang/lib/Lower/OpenMP/DataSharingProcessor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index eec14fc1b570d..343eb1b732b69 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -190,7 +190,6 @@ void DataSharingProcessor::insertLastPrivateCompare(mlir::Operation *op) { for (const omp::Clause &clause : clauses) { if (clause.id != llvm::omp::OMPC_lastprivate) continue; - // TODO: Add lastprivate support for simd construct if (mlir::isa(op) || mlir::isa(op)) { // Update the original variable just before exiting the worksharing