//===- 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> 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 loopMetadataMapping; /// Mapping between original LLVM access group metadata nodes and the imported /// MLIR access group attributes. DenseMap accessGroupMapping; }; } // namespace detail } // namespace LLVM } // namespace mlir #endif // MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_