| //===- TBAAForest.cpp - Per-functon TBAA Trees ----------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "flang/Optimizer/Analysis/TBAAForest.h" | |
| #include <mlir/Dialect/LLVMIR/LLVMAttrs.h> | |
| mlir::LLVM::TBAATagAttr | |
| fir::TBAATree::SubtreeState::getTag(llvm::StringRef uniqueName) const { | |
| std::string id = (parentId + '/' + uniqueName).str(); | |
| mlir::LLVM::TBAATypeDescriptorAttr type = | |
| mlir::LLVM::TBAATypeDescriptorAttr::get( | |
| context, id, mlir::LLVM::TBAAMemberAttr::get(parent, 0)); | |
| return mlir::LLVM::TBAATagAttr::get(type, type, 0); | |
| } | |
| fir::TBAATree::SubtreeState & | |
| fir::TBAATree::SubtreeState::getOrCreateNamedSubtree(mlir::StringAttr name) { | |
| auto it = namedSubtrees.find(name); | |
| if (it != namedSubtrees.end()) | |
| return it->second; | |
| return namedSubtrees | |
| .insert( | |
| {name, SubtreeState(context, parentId + '/' + name.str(), parent)}) | |
| .first->second; | |
| } | |
| mlir::LLVM::TBAATagAttr fir::TBAATree::SubtreeState::getTag() const { | |
| return mlir::LLVM::TBAATagAttr::get(parent, parent, 0); | |
| } | |
| fir::TBAATree fir::TBAATree::buildTree(mlir::StringAttr func) { | |
| llvm::StringRef funcName = func.getValue(); | |
| std::string rootId = ("Flang function root " + funcName).str(); | |
| mlir::MLIRContext *ctx = func.getContext(); | |
| mlir::LLVM::TBAARootAttr funcRoot = | |
| mlir::LLVM::TBAARootAttr::get(ctx, mlir::StringAttr::get(ctx, rootId)); | |
| static constexpr llvm::StringRef anyAccessTypeDescId = "any access"; | |
| mlir::LLVM::TBAATypeDescriptorAttr anyAccess = | |
| mlir::LLVM::TBAATypeDescriptorAttr::get( | |
| ctx, anyAccessTypeDescId, | |
| mlir::LLVM::TBAAMemberAttr::get(funcRoot, 0)); | |
| static constexpr llvm::StringRef anyDataAccessTypeDescId = "any data access"; | |
| mlir::LLVM::TBAATypeDescriptorAttr dataRoot = | |
| mlir::LLVM::TBAATypeDescriptorAttr::get( | |
| ctx, anyDataAccessTypeDescId, | |
| mlir::LLVM::TBAAMemberAttr::get(anyAccess, 0)); | |
| static constexpr llvm::StringRef boxMemberTypeDescId = "descriptor member"; | |
| mlir::LLVM::TBAATypeDescriptorAttr boxMemberTypeDesc = | |
| mlir::LLVM::TBAATypeDescriptorAttr::get( | |
| ctx, boxMemberTypeDescId, | |
| mlir::LLVM::TBAAMemberAttr::get(anyAccess, 0)); | |
| return TBAATree{anyAccess, dataRoot, boxMemberTypeDesc}; | |
| } | |
| fir::TBAATree::TBAATree(mlir::LLVM::TBAATypeDescriptorAttr anyAccess, | |
| mlir::LLVM::TBAATypeDescriptorAttr dataRoot, | |
| mlir::LLVM::TBAATypeDescriptorAttr boxMemberTypeDesc) | |
| : targetDataTree(dataRoot.getContext(), "target data", dataRoot), | |
| globalDataTree(dataRoot.getContext(), "global data", dataRoot), | |
| allocatedDataTree(dataRoot.getContext(), "allocated data", dataRoot), | |
| dummyArgDataTree(dataRoot.getContext(), "dummy arg data", dataRoot), | |
| directDataTree(dataRoot.getContext(), "direct data", dataRoot), | |
| anyAccessDesc(anyAccess), boxMemberTypeDesc(boxMemberTypeDesc), | |
| anyDataTypeDesc(dataRoot) {} |