[flang-commits] [flang] [WIP] Using getSource instead of getOriginalDef (PR #128984)
Renaud Kauffmann via flang-commits
flang-commits at lists.llvm.org
Thu Feb 27 09:26:58 PST 2025
https://github.com/Renaud-K updated https://github.com/llvm/llvm-project/pull/128984
>From ce4bf7766cd576c00603c6cf1c99591137948005 Mon Sep 17 00:00:00 2001
From: Renaud-K <rkauffmann at nvidia.com>
Date: Thu, 27 Feb 2025 09:26:28 -0800
Subject: [PATCH] Using getSource instead of getOriginalDef
---
.../lib/Optimizer/Analysis/AliasAnalysis.cpp | 82 +++++--------------
1 file changed, 22 insertions(+), 60 deletions(-)
diff --git a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
index 2bc79100b03b6..2ff8ec05782c1 100644
--- a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
+++ b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp
@@ -51,40 +51,6 @@ static bool hasGlobalOpTargetAttr(mlir::Value v, fir::AddrOfOp op) {
v, fir::GlobalOp::getTargetAttrName(globalOpName));
}
-static mlir::Value
-getOriginalDef(mlir::Value v,
- fir::AliasAnalysis::Source::Attributes &attributes,
- bool &isCapturedInInternalProcedure, bool &approximateSource) {
- mlir::Operation *defOp;
- bool breakFromLoop = false;
- while (!breakFromLoop && (defOp = v.getDefiningOp())) {
- mlir::Type ty = defOp->getResultTypes()[0];
- llvm::TypeSwitch<Operation *>(defOp)
- .Case<fir::ConvertOp>([&](fir::ConvertOp op) { v = op.getValue(); })
- .Case<fir::DeclareOp, hlfir::DeclareOp>([&](auto op) {
- v = op.getMemref();
- auto varIf = llvm::cast<fir::FortranVariableOpInterface>(defOp);
- attributes |= getAttrsFromVariable(varIf);
- isCapturedInInternalProcedure |=
- varIf.isCapturedInInternalProcedure();
- })
- .Case<fir::CoordinateOp>([&](auto op) {
- if (fir::AliasAnalysis::isPointerReference(ty))
- attributes.set(fir::AliasAnalysis::Attribute::Pointer);
- v = op->getOperand(0);
- approximateSource = true;
- })
- .Case<hlfir::DesignateOp>([&](hlfir::DesignateOp op) {
- auto varIf = llvm::cast<fir::FortranVariableOpInterface>(defOp);
- attributes |= getAttrsFromVariable(varIf);
- v = op.getMemref();
- approximateSource = true;
- })
- .Default([&](auto op) { breakFromLoop = true; });
- }
- return v;
-}
-
static bool isEvaluateInMemoryBlockArg(mlir::Value v) {
if (auto evalInMem = llvm::dyn_cast_or_null<hlfir::EvaluateInMemoryOp>(
v.getParentRegion()->getParentOp()))
@@ -621,38 +587,34 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v,
if (mlir::isa<fir::PointerType>(boxTy.getEleTy()))
attributes.set(Attribute::Pointer);
- auto def = getOriginalDef(op.getMemref(), attributes,
- isCapturedInInternalProcedure,
- approximateSource);
- if (auto addrOfOp = def.template getDefiningOp<fir::AddrOfOp>()) {
- global = addrOfOp.getSymbol();
-
- if (hasGlobalOpTargetAttr(def, addrOfOp))
- attributes.set(Attribute::Target);
+ auto boxSrc = getSource(op.getMemref());
+ attributes |= boxSrc.attributes;
+ approximateSource |= boxSrc.approximateSource;
+ isCapturedInInternalProcedure |=
+ boxSrc.isCapturedInInternalProcedure;
+ global = llvm::dyn_cast<mlir::SymbolRefAttr>(boxSrc.origin.u);
+ if (global) {
type = SourceKind::Global;
- }
- // TODO: Add support to fir.allocmem
- else if (auto allocOp =
- def.template getDefiningOp<fir::AllocaOp>()) {
- v = def;
- defOp = v.getDefiningOp();
- type = SourceKind::Allocate;
- } else if (isDummyArgument(def)) {
- defOp = nullptr;
- v = def;
} else {
- type = SourceKind::Indirect;
+ auto def = llvm::cast<mlir::Value>(boxSrc.origin.u);
+ // TODO: Add support to fir.allocmem
+ if (auto allocOp = def.template getDefiningOp<fir::AllocaOp>()) {
+ v = def;
+ defOp = v.getDefiningOp();
+ type = SourceKind::Allocate;
+ } else if (isDummyArgument(def)) {
+ defOp = nullptr;
+ v = def;
+ } else {
+ type = SourceKind::Indirect;
+ }
}
- // TODO: This assignment is redundant but somehow works around an
- // apparent MSVC bug reporting "undeclared identifier" at the next
- // "breakFromLoop = true;". See
- // <https://github.com/llvm/llvm-project/pull/127845#issuecomment-2669829610>.
breakFromLoop = true;
- } else {
- // No further tracking for addresses loaded from memory for now.
- type = SourceKind::Indirect;
+ return;
}
+ // No further tracking for addresses loaded from memory for now.
+ type = SourceKind::Indirect;
breakFromLoop = true;
})
.Case<fir::AddrOfOp>([&](auto op) {
More information about the flang-commits
mailing list