[flang-commits] [flang] [flang] Use fir.declare/fir.dummy_scope for TBAA tags attachments. (PR #92472)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Thu May 23 02:27:53 PDT 2024
================
@@ -54,24 +56,85 @@ namespace {
/// Shared state per-module
class PassState {
public:
+ PassState(mlir::DominanceInfo &domInfo) : domInfo(domInfo) {}
/// memoised call to fir::AliasAnalysis::getSource
inline const fir::AliasAnalysis::Source &getSource(mlir::Value value) {
if (!analysisCache.contains(value))
- analysisCache.insert({value, analysis.getSource(value)});
+ analysisCache.insert(
+ {value, analysis.getSource(value, /*getInstantiationPoint=*/true)});
return analysisCache[value];
}
/// get the per-function TBAATree for this function
inline const fir::TBAATree &getFuncTree(mlir::func::FuncOp func) {
return forrest[func];
}
+ inline const fir::TBAATree &getFuncTreeWithScope(mlir::func::FuncOp func,
+ fir::DummyScopeOp scope) {
+ auto &scopeMap = scopeNames.at(func);
+ return forrest.getFuncTreeWithScope(func, scopeMap.lookup(scope));
+ }
+
+ void processFunctionScopes(mlir::func::FuncOp func);
+ fir::DummyScopeOp getDeclarationScope(fir::DeclareOp declareOp);
private:
+ mlir::DominanceInfo &domInfo;
fir::AliasAnalysis analysis;
llvm::DenseMap<mlir::Value, fir::AliasAnalysis::Source> analysisCache;
fir::TBAAForrest forrest;
+ // Unique names for fir.dummy_scope operations within
+ // the given function.
+ llvm::DenseMap<mlir::func::FuncOp,
+ llvm::DenseMap<fir::DummyScopeOp, std::string>>
+ scopeNames;
+ // A map providing a vector of fir.dummy_scope operations
+ // for the given function. The vectors are sorted according
+ // to the dominance information.
+ llvm::DenseMap<mlir::func::FuncOp, llvm::SmallVector<fir::DummyScopeOp, 16>>
+ sortedScopeOperations;
};
+// Process fir.dummy_scope operations in the given func:
+// sort them according to the dominance information, and
+// associate a unique (within the current function) scope name
+// with each of them.
+void PassState::processFunctionScopes(mlir::func::FuncOp func) {
+ if (scopeNames.contains(func))
+ return;
+
+ auto &scopeMap = scopeNames.getOrInsertDefault(func);
+ auto &scopeOps = sortedScopeOperations.getOrInsertDefault(func);
+ func.walk([&](fir::DummyScopeOp op) { scopeOps.push_back(op); });
+ llvm::stable_sort(scopeOps, [&](const fir::DummyScopeOp &op1,
+ const fir::DummyScopeOp &op2) {
+ return domInfo.properlyDominates(&*op1, &*op2);
+ });
+ unsigned scopeId = 0;
+ for (auto scope : scopeOps) {
+ if (scopeId != 0) {
+ std::string name = (llvm::Twine("Scope ") + llvm::Twine(scopeId)).str();
+ LLVM_DEBUG(llvm::dbgs() << "Creating scope '" << name << "':\n"
+ << scope << "\n");
+ scopeMap.insert({scope, std::move(name)});
+ }
+ ++scopeId;
+ }
+}
+
+// For the given fir.declare returns the dominating fir.dummy_scope
+// operation.
+fir::DummyScopeOp PassState::getDeclarationScope(fir::DeclareOp declareOp) {
+ auto func = declareOp->getParentOfType<mlir::func::FuncOp>();
+ assert(func && "fir.declare does not have parent func.func");
----------------
tblah wrote:
That will be changed by https://github.com/llvm/llvm-project/pull/92379
https://github.com/llvm/llvm-project/pull/92472
More information about the flang-commits
mailing list