[flang-commits] [flang] [Flang][OpenMP] Lowering nontemporal clause to MLIR for SIMD directive (PR #108339)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 12 00:32:51 PDT 2024
https://github.com/harishch4 created https://github.com/llvm/llvm-project/pull/108339
None
>From 693591945324f510a7f4f3a0847d9b61f38c9677 Mon Sep 17 00:00:00 2001
From: Harish Chambeti <harishcse44 at gmail.com>
Date: Thu, 12 Sep 2024 12:54:11 +0530
Subject: [PATCH] [Flang][OpenMP] Lowering nontemporal clause to MLIR for SIMD
directive
---
flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 12 ++++++++++++
flang/lib/Lower/OpenMP/ClauseProcessor.h | 1 +
flang/lib/Lower/OpenMP/OpenMP.cpp | 4 ++--
flang/test/Lower/OpenMP/simd.f90 | 18 ++++++++++++++++++
4 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index f336d213cc8620..fa8a4309700f45 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -1009,6 +1009,18 @@ bool ClauseProcessor::processMap(
return clauseFound;
}
+bool ClauseProcessor::processNontemporal(
+ mlir::omp::NontemporalClauseOps &result) const {
+ return findRepeatableClause<omp::clause::Nontemporal>(
+ [&](const omp::clause::Nontemporal &clause, const parser::CharBlock &) {
+ for (const Object &object : clause.v) {
+ semantics::Symbol *sym = object.sym();
+ mlir::Value symVal = converter.getSymbolAddress(*sym);
+ result.nontemporalVars.push_back(symVal);
+ }
+ });
+}
+
bool ClauseProcessor::processReduction(
mlir::Location currentLocation, mlir::omp::ReductionClauseOps &result,
llvm::SmallVectorImpl<mlir::Type> *outReductionTypes,
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h
index 8d02d368f4ee04..be1d8a66ddfccd 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.h
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h
@@ -121,6 +121,7 @@ class ClauseProcessor {
llvm::SmallVectorImpl<const semantics::Symbol *> *mapSyms = nullptr,
llvm::SmallVectorImpl<mlir::Location> *mapSymLocs = nullptr,
llvm::SmallVectorImpl<mlir::Type> *mapSymTypes = nullptr) const;
+ bool processNontemporal(mlir::omp::NontemporalClauseOps &result) const;
bool processReduction(
mlir::Location currentLocation, mlir::omp::ReductionClauseOps &result,
llvm::SmallVectorImpl<mlir::Type> *reductionTypes = nullptr,
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 233aacb40354d4..99114dc38a249c 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1123,13 +1123,13 @@ static void genSimdClauses(lower::AbstractConverter &converter,
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processAligned(clauseOps);
cp.processIf(llvm::omp::Directive::OMPD_simd, clauseOps);
+ cp.processNontemporal(clauseOps);
cp.processOrder(clauseOps);
cp.processReduction(loc, clauseOps);
cp.processSafelen(clauseOps);
cp.processSimdlen(clauseOps);
- cp.processTODO<clause::Linear, clause::Nontemporal>(
- loc, llvm::omp::Directive::OMPD_simd);
+ cp.processTODO<clause::Linear>(loc, llvm::omp::Directive::OMPD_simd);
}
static void genSingleClauses(lower::AbstractConverter &converter,
diff --git a/flang/test/Lower/OpenMP/simd.f90 b/flang/test/Lower/OpenMP/simd.f90
index 2127451878849b..bdc6a1eef01565 100644
--- a/flang/test/Lower/OpenMP/simd.f90
+++ b/flang/test/Lower/OpenMP/simd.f90
@@ -223,3 +223,21 @@ subroutine simdloop_aligned_allocatable()
A(i) = i
end do
end subroutine
+
+!CHECK-LABEL: func @_QPsimd_with_nontemporal_clause
+subroutine simd_with_nontemporal_clause(n)
+ !CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsimd_with_nontemporal_clauseEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ !CHECK: %[[C_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsimd_with_nontemporal_clauseEc"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ integer :: i, n
+ integer :: A, B, C
+ !CHECK: %[[LB:.*]] = arith.constant 1 : i32
+ !CHECK: %[[UB:.*]] = fir.load %{{.*}}#0 : !fir.ref<i32>
+ !CHECK: %[[STEP:.*]] = arith.constant 1 : i32
+ !CHECK: omp.simd nontemporal(%[[A_DECL]]#1, %[[C_DECL]]#1 : !fir.ref<i32>, !fir.ref<i32>) {
+ !CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) {
+ !$OMP SIMD NONTEMPORAL(A, C)
+ do i = 1, n
+ C = A + B
+ end do
+ !$OMP END SIMD
+end subroutine
More information about the flang-commits
mailing list