[flang-commits] [flang] flang] Moving alias analysis utilities into anonymous namespaces. (PR #125925)
Renaud Kauffmann via flang-commits
flang-commits at lists.llvm.org
Thu Feb 6 08:50:27 PST 2025
https://github.com/Renaud-K updated https://github.com/llvm/llvm-project/pull/125925
>From f9df7e1f89979b2ba825b94d3b8177cef68fa026 Mon Sep 17 00:00:00 2001
From: Renaud-K <rkauffmann at nvidia.com>
Date: Wed, 5 Feb 2025 11:55:17 -0800
Subject: [PATCH 1/2] Moving utilities into anonymous namespaces
---
.../lib/Optimizer/Analysis/AliasAnalysis.cpp | 98 ++++++++++---------
1 file changed, 54 insertions(+), 44 deletions(-)
diff --git a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
index e33d8fa333e7a59..63f4881f13c522b 100644
--- a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
+++ b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
@@ -31,9 +31,29 @@ using namespace mlir;
// AliasAnalysis: alias
//===----------------------------------------------------------------------===//
-/// Temporary function to skip through all the no op operations
-/// TODO: Generalize support of fir.load
-static mlir::Value getOriginalDef(mlir::Value v) {
+namespace {
+
+fir::AliasAnalysis::Source::Attributes
+getAttrsFromVariable(fir::FortranVariableOpInterface var) {
+ fir::AliasAnalysis::Source::Attributes attrs;
+ if (var.isTarget())
+ attrs.set(fir::AliasAnalysis::Attribute::Target);
+ if (var.isPointer())
+ attrs.set(fir::AliasAnalysis::Attribute::Pointer);
+ if (var.isIntentIn())
+ attrs.set(fir::AliasAnalysis::Attribute::IntentIn);
+
+ return attrs;
+}
+
+bool hasGlobalOpTargetAttr(mlir::Value v, fir::AddrOfOp op) {
+ auto globalOpName =
+ mlir::OperationName(fir::GlobalOp::getOperationName(), op->getContext());
+ return fir::valueHasFirAttribute(
+ v, fir::GlobalOp::getTargetAttrName(globalOpName));
+}
+
+mlir::Value getOriginalDef(mlir::Value v) {
mlir::Operation *defOp;
bool breakFromLoop = false;
while (!breakFromLoop && (defOp = v.getDefiningOp())) {
@@ -46,6 +66,29 @@ static mlir::Value getOriginalDef(mlir::Value v) {
return v;
}
+bool isEvaluateInMemoryBlockArg(mlir::Value v) {
+ if (auto evalInMem = llvm::dyn_cast_or_null<hlfir::EvaluateInMemoryOp>(
+ v.getParentRegion()->getParentOp()))
+ return evalInMem.getMemory() == v;
+ return false;
+}
+
+template <typename OMPTypeOp, typename DeclTypeOp>
+bool isPrivateArg(omp::BlockArgOpenMPOpInterface &argIface, OMPTypeOp &op,
+ DeclTypeOp &declOp) {
+ if (!op.getPrivateSyms().has_value())
+ return false;
+ for (auto [opSym, blockArg] :
+ llvm::zip_equal(*op.getPrivateSyms(), argIface.getPrivateBlockArgs())) {
+ if (blockArg == declOp.getMemref()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
namespace fir {
void AliasAnalysis::Source::print(llvm::raw_ostream &os) const {
@@ -91,13 +134,6 @@ bool AliasAnalysis::Source::isDummyArgument() const {
return false;
}
-static bool isEvaluateInMemoryBlockArg(mlir::Value v) {
- if (auto evalInMem = llvm::dyn_cast_or_null<hlfir::EvaluateInMemoryOp>(
- v.getParentRegion()->getParentOp()))
- return evalInMem.getMemory() == v;
- return false;
-}
-
bool AliasAnalysis::Source::isData() const { return origin.isData; }
bool AliasAnalysis::Source::isBoxData() const {
return mlir::isa<fir::BaseBoxType>(fir::unwrapRefType(valueType)) &&
@@ -348,7 +384,9 @@ AliasResult AliasAnalysis::alias(Source lhsSrc, Source rhsSrc, mlir::Value lhs,
// AliasAnalysis: getModRef
//===----------------------------------------------------------------------===//
-static bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
+namespace {
+
+bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
if (auto symRef = llvm::dyn_cast<mlir::SymbolRefAttr>(src.origin.u)) {
auto [nameKind, deconstruct] =
fir::NameUniquer::deconstruct(symRef.getLeafReference().getValue());
@@ -358,7 +396,7 @@ static bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
return false;
}
-static bool isCallToFortranUserProcedure(fir::CallOp call) {
+bool isCallToFortranUserProcedure(fir::CallOp call) {
// TODO: indirect calls are excluded by these checks. Maybe some attribute is
// needed to flag user calls in this case.
if (fir::hasBindcAttr(call))
@@ -369,7 +407,7 @@ static bool isCallToFortranUserProcedure(fir::CallOp call) {
return false;
}
-static ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
+ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
// TODO: limit to Fortran functions??
// 1. Detect variables that can be accessed indirectly.
fir::AliasAnalysis aliasAnalysis;
@@ -423,6 +461,8 @@ static ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
return ModRefResult::getNoModRef();
}
+} // namespace
+
/// This is mostly inspired by MLIR::LocalAliasAnalysis with 2 notable
/// differences 1) Regions are not handled here but will be handled by a data
/// flow analysis to come 2) Allocate and Free effects are considered
@@ -491,33 +531,6 @@ ModRefResult AliasAnalysis::getModRef(mlir::Region ®ion,
return result;
}
-AliasAnalysis::Source::Attributes
-getAttrsFromVariable(fir::FortranVariableOpInterface var) {
- AliasAnalysis::Source::Attributes attrs;
- if (var.isTarget())
- attrs.set(AliasAnalysis::Attribute::Target);
- if (var.isPointer())
- attrs.set(AliasAnalysis::Attribute::Pointer);
- if (var.isIntentIn())
- attrs.set(AliasAnalysis::Attribute::IntentIn);
-
- return attrs;
-}
-
-template <typename OMPTypeOp, typename DeclTypeOp>
-static bool isPrivateArg(omp::BlockArgOpenMPOpInterface &argIface,
- OMPTypeOp &op, DeclTypeOp &declOp) {
- if (!op.getPrivateSyms().has_value())
- return false;
- for (auto [opSym, blockArg] :
- llvm::zip_equal(*op.getPrivateSyms(), argIface.getPrivateBlockArgs())) {
- if (blockArg == declOp.getMemref()) {
- return true;
- }
- }
- return false;
-}
-
AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v,
bool getLastInstantiationPoint) {
auto *defOp = v.getDefiningOp();
@@ -604,10 +617,7 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v,
ty = v.getType();
type = SourceKind::Global;
- auto globalOpName = mlir::OperationName(
- fir::GlobalOp::getOperationName(), defOp->getContext());
- if (fir::valueHasFirAttribute(
- v, fir::GlobalOp::getTargetAttrName(globalOpName)))
+ if (hasGlobalOpTargetAttr(v, op))
attributes.set(Attribute::Target);
// TODO: Take followBoxData into account when setting the pointer
>From 31c3df02893425e5b156469727a7034fb73819fa Mon Sep 17 00:00:00 2001
From: Renaud-K <rkauffmann at nvidia.com>
Date: Thu, 6 Feb 2025 08:49:48 -0800
Subject: [PATCH 2/2] Removing anonymous workspace and making functions static
---
.../lib/Optimizer/Analysis/AliasAnalysis.cpp | 24 +++++++------------
1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
index 63f4881f13c522b..01f3a0326db216e 100644
--- a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
+++ b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
@@ -31,9 +31,7 @@ using namespace mlir;
// AliasAnalysis: alias
//===----------------------------------------------------------------------===//
-namespace {
-
-fir::AliasAnalysis::Source::Attributes
+static fir::AliasAnalysis::Source::Attributes
getAttrsFromVariable(fir::FortranVariableOpInterface var) {
fir::AliasAnalysis::Source::Attributes attrs;
if (var.isTarget())
@@ -46,7 +44,7 @@ getAttrsFromVariable(fir::FortranVariableOpInterface var) {
return attrs;
}
-bool hasGlobalOpTargetAttr(mlir::Value v, fir::AddrOfOp op) {
+static bool hasGlobalOpTargetAttr(mlir::Value v, fir::AddrOfOp op) {
auto globalOpName =
mlir::OperationName(fir::GlobalOp::getOperationName(), op->getContext());
return fir::valueHasFirAttribute(
@@ -66,7 +64,7 @@ mlir::Value getOriginalDef(mlir::Value v) {
return v;
}
-bool isEvaluateInMemoryBlockArg(mlir::Value v) {
+static bool isEvaluateInMemoryBlockArg(mlir::Value v) {
if (auto evalInMem = llvm::dyn_cast_or_null<hlfir::EvaluateInMemoryOp>(
v.getParentRegion()->getParentOp()))
return evalInMem.getMemory() == v;
@@ -74,8 +72,8 @@ bool isEvaluateInMemoryBlockArg(mlir::Value v) {
}
template <typename OMPTypeOp, typename DeclTypeOp>
-bool isPrivateArg(omp::BlockArgOpenMPOpInterface &argIface, OMPTypeOp &op,
- DeclTypeOp &declOp) {
+static bool isPrivateArg(omp::BlockArgOpenMPOpInterface &argIface,
+ OMPTypeOp &op, DeclTypeOp &declOp) {
if (!op.getPrivateSyms().has_value())
return false;
for (auto [opSym, blockArg] :
@@ -87,8 +85,6 @@ bool isPrivateArg(omp::BlockArgOpenMPOpInterface &argIface, OMPTypeOp &op,
return false;
}
-} // namespace
-
namespace fir {
void AliasAnalysis::Source::print(llvm::raw_ostream &os) const {
@@ -384,9 +380,7 @@ AliasResult AliasAnalysis::alias(Source lhsSrc, Source rhsSrc, mlir::Value lhs,
// AliasAnalysis: getModRef
//===----------------------------------------------------------------------===//
-namespace {
-
-bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
+static bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
if (auto symRef = llvm::dyn_cast<mlir::SymbolRefAttr>(src.origin.u)) {
auto [nameKind, deconstruct] =
fir::NameUniquer::deconstruct(symRef.getLeafReference().getValue());
@@ -396,7 +390,7 @@ bool isSavedLocal(const fir::AliasAnalysis::Source &src) {
return false;
}
-bool isCallToFortranUserProcedure(fir::CallOp call) {
+static bool isCallToFortranUserProcedure(fir::CallOp call) {
// TODO: indirect calls are excluded by these checks. Maybe some attribute is
// needed to flag user calls in this case.
if (fir::hasBindcAttr(call))
@@ -407,7 +401,7 @@ bool isCallToFortranUserProcedure(fir::CallOp call) {
return false;
}
-ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
+static ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
// TODO: limit to Fortran functions??
// 1. Detect variables that can be accessed indirectly.
fir::AliasAnalysis aliasAnalysis;
@@ -461,8 +455,6 @@ ModRefResult getCallModRef(fir::CallOp call, mlir::Value var) {
return ModRefResult::getNoModRef();
}
-} // namespace
-
/// This is mostly inspired by MLIR::LocalAliasAnalysis with 2 notable
/// differences 1) Regions are not handled here but will be handled by a data
/// flow analysis to come 2) Allocate and Free effects are considered
More information about the flang-commits
mailing list