[flang-commits] [flang] [flang][OpenMP] Enable lastprivate on simd (PR #93786)
via flang-commits
flang-commits at lists.llvm.org
Thu Oct 3 03:32:01 PDT 2024
https://github.com/NimishMishra updated https://github.com/llvm/llvm-project/pull/93786
>From 4c6ce928ec3a95ea95d3ed86cb35c11125497281 Mon Sep 17 00:00:00 2001
From: Nimish Mishra <neelam.nimish at gmail.com>
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 d3e892be74fd83..eec14fc1b570d0 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<mlir::omp::WsloopOp>(op)) {
+ if (mlir::isa<mlir::omp::WsloopOp>(op) ||
+ mlir::isa<mlir::omp::SimdOp>(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 bdc6a1eef01565..3b2aeceb4c3f9f 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<f32>
+!CHECK: %[[SELECT_RESULT:.*]] = arith.select {{.*}}, {{.*}}, {{.*}} : i1
+!CHECK: fir.if %[[SELECT_RESULT]] {
+!CHECK: %[[LOADED_SUM:.*]] = fir.load %[[VAR_SUM_PINNED_DECLARE]]#0 : !fir.ref<f32>
+!CHECK: hlfir.assign %[[LOADED_SUM]] to %[[VAR_SUM_DECLARE]]#0 : f32, !fir.ref<f32>
+!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 <neelam.nimish at gmail.com>
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 eec14fc1b570d0..343eb1b732b698 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<mlir::omp::WsloopOp>(op) ||
mlir::isa<mlir::omp::SimdOp>(op)) {
// Update the original variable just before exiting the worksharing
More information about the flang-commits
mailing list