[flang-commits] [flang] [flang][NFC] move loadIfRef to FIRBuilder (PR #84306)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Thu Mar 7 03:04:22 PST 2024
https://github.com/tblah created https://github.com/llvm/llvm-project/pull/84306
This will be useful for OpenMP too.
I changed the definition slightly to use `fir::isa_ref_type` (which also includes llvm pointers) because I think it reads better using the common type helpers. There shouldn't be any llvm pointers in lowering so this isn't a functional change.
Commit series for by-ref openmp reductions: 1/3
>From 958ea36de41ce928a0ecf5cee076293d2ae50474 Mon Sep 17 00:00:00 2001
From: Tom Eccles <tom.eccles at arm.com>
Date: Fri, 9 Feb 2024 16:51:49 +0000
Subject: [PATCH] [flang][NFC] move loadIfRef to FIRBuilder
This will be useful for OpenMP too.
I changed the definition slightly to use `fir::isa_ref_type` (which also
includes llvm pointers) because I think it reads better using the common
type helpers. There shouldn't be any llvm pointers in lowering so this
isn't a functional change.
Commit series for by-ref openmp reductions: 1/3
---
flang/include/flang/Optimizer/Builder/FIRBuilder.h | 4 ++++
flang/lib/Lower/OpenACC.cpp | 12 ++----------
flang/lib/Optimizer/Builder/FIRBuilder.cpp | 7 +++++++
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
index bd9b67b14b966c..d61bf681be6194 100644
--- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
@@ -309,6 +309,10 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
void createStoreWithConvert(mlir::Location loc, mlir::Value val,
mlir::Value addr);
+ /// Create a fir.load if \p val is a reference or pointer type. Return the
+ /// result of the load if it was created, otherwise return \p val
+ mlir::Value loadIfRef(mlir::Location loc, mlir::Value val);
+
/// Create a new FuncOp. If the function may have already been created, use
/// `addNamedFunction` instead.
mlir::func::FuncOp createFunction(mlir::Location loc, llvm::StringRef name,
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 151077d81ba14a..d2c6006ecf914a 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1041,14 +1041,6 @@ static mlir::Value genLogicalCombiner(fir::FirOpBuilder &builder,
return builder.create<fir::ConvertOp>(loc, value1.getType(), combined);
}
-static mlir::Value loadIfRef(fir::FirOpBuilder &builder, mlir::Location loc,
- mlir::Value value) {
- if (mlir::isa<fir::ReferenceType, fir::PointerType, fir::HeapType>(
- value.getType()))
- return builder.create<fir::LoadOp>(loc, value);
- return value;
-}
-
static mlir::Value genComparisonCombiner(fir::FirOpBuilder &builder,
mlir::Location loc,
mlir::arith::CmpIPredicate pred,
@@ -1066,8 +1058,8 @@ static mlir::Value genScalarCombiner(fir::FirOpBuilder &builder,
mlir::acc::ReductionOperator op,
mlir::Type ty, mlir::Value value1,
mlir::Value value2) {
- value1 = loadIfRef(builder, loc, value1);
- value2 = loadIfRef(builder, loc, value2);
+ value1 = builder.loadIfRef(loc, value1);
+ value2 = builder.loadIfRef(loc, value2);
if (op == mlir::acc::ReductionOperator::AccAdd) {
if (ty.isIntOrIndex())
return builder.create<mlir::arith::AddIOp>(loc, value1, value2);
diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
index 788c99e40105a2..12da7412888a3b 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -16,6 +16,7 @@
#include "flang/Optimizer/Builder/Todo.h"
#include "flang/Optimizer/Dialect/FIRAttr.h"
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
+#include "flang/Optimizer/Dialect/FIRType.h"
#include "flang/Optimizer/Support/FatalError.h"
#include "flang/Optimizer/Support/InternalNames.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
@@ -404,6 +405,12 @@ void fir::FirOpBuilder::createStoreWithConvert(mlir::Location loc,
create<fir::StoreOp>(loc, cast, addr);
}
+mlir::Value fir::FirOpBuilder::loadIfRef(mlir::Location loc, mlir::Value val) {
+ if (fir::isa_ref_type(val.getType()))
+ return create<fir::LoadOp>(loc, val);
+ return val;
+}
+
fir::StringLitOp fir::FirOpBuilder::createStringLitOp(mlir::Location loc,
llvm::StringRef data) {
auto type = fir::CharacterType::get(getContext(), 1, data.size());
More information about the flang-commits
mailing list