| //===- LoopAnnotationImporter.h ---------------------------------*- C++ -*-===// | |
| // | |
| // 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file implements the translation between LLVMIR loop metadata and the | |
| // corresponding MLIR representation. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ | |
| #define MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ | |
| #include "mlir/Dialect/LLVMIR/LLVMDialect.h" | |
| #include "mlir/Target/LLVMIR/ModuleImport.h" | |
| namespace mlir { | |
| namespace LLVM { | |
| namespace detail { | |
| /// A helper class that converts llvm.loop metadata nodes into corresponding | |
| /// LoopAnnotationAttrs and llvm.access.group nodes into AccessGroupAttrs. | |
| class LoopAnnotationImporter { | |
| public: | |
| LoopAnnotationImporter(ModuleImport &moduleImport, OpBuilder &builder) | |
| : moduleImport(moduleImport), builder(builder) {} | |
| LoopAnnotationAttr translateLoopAnnotation(const llvm::MDNode *node, | |
| Location loc); | |
| /// Converts all LLVM access groups starting from node to MLIR access group | |
| /// attributes. It stores a mapping from every nested access group node to the | |
| /// translated attribute. Returns success if all conversions succeed and | |
| /// failure otherwise. | |
| LogicalResult translateAccessGroup(const llvm::MDNode *node, Location loc); | |
| /// Returns the access group attribute that map to the access group nodes | |
| /// starting from the access group metadata node. Returns failure, if any of | |
| /// the attributes cannot be found. | |
| FailureOr<SmallVector<AccessGroupAttr>> | |
| lookupAccessGroupAttrs(const llvm::MDNode *node) const; | |
| /// The ModuleImport owning this instance. | |
| ModuleImport &moduleImport; | |
| private: | |
| /// Returns the LLVM metadata corresponding to a llvm loop metadata attribute. | |
| LoopAnnotationAttr lookupLoopMetadata(const llvm::MDNode *node) const { | |
| return loopMetadataMapping.lookup(node); | |
| } | |
| void mapLoopMetadata(const llvm::MDNode *metadata, LoopAnnotationAttr attr) { | |
| auto result = loopMetadataMapping.try_emplace(metadata, attr); | |
| (void)result; | |
| assert(result.second && | |
| "attempting to map loop options that was already mapped"); | |
| } | |
| OpBuilder &builder; | |
| DenseMap<const llvm::MDNode *, LoopAnnotationAttr> loopMetadataMapping; | |
| /// Mapping between original LLVM access group metadata nodes and the imported | |
| /// MLIR access group attributes. | |
| DenseMap<const llvm::MDNode *, AccessGroupAttr> accessGroupMapping; | |
| }; | |
| } // namespace detail | |
| } // namespace LLVM | |
| } // namespace mlir | |
| #endif // MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ |