1b83caa32SChristian Ulmann //===- LoopAnnotationImporter.h ---------------------------------*- C++ -*-===// 2b83caa32SChristian Ulmann // 3b83caa32SChristian Ulmann // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4b83caa32SChristian Ulmann // See https://llvm.org/LICENSE.txt for license information. 5b83caa32SChristian Ulmann // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b83caa32SChristian Ulmann // 7b83caa32SChristian Ulmann //===----------------------------------------------------------------------===// 8b83caa32SChristian Ulmann // 9b83caa32SChristian Ulmann // This file implements the translation between LLVMIR loop metadata and the 10b83caa32SChristian Ulmann // corresponding MLIR representation. 11b83caa32SChristian Ulmann // 12b83caa32SChristian Ulmann //===----------------------------------------------------------------------===// 13b83caa32SChristian Ulmann 14b83caa32SChristian Ulmann #ifndef MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ 15b83caa32SChristian Ulmann #define MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ 16b83caa32SChristian Ulmann 17b83caa32SChristian Ulmann #include "mlir/Dialect/LLVMIR/LLVMDialect.h" 18b83caa32SChristian Ulmann #include "mlir/Target/LLVMIR/ModuleImport.h" 19b83caa32SChristian Ulmann 20b83caa32SChristian Ulmann namespace mlir { 21b83caa32SChristian Ulmann namespace LLVM { 22b83caa32SChristian Ulmann namespace detail { 23b83caa32SChristian Ulmann 24e630a502SChristian Ulmann /// A helper class that converts llvm.loop metadata nodes into corresponding 25*0fc8d9e4STobias Gysi /// LoopAnnotationAttrs and llvm.access.group nodes into AccessGroupAttrs. 26b83caa32SChristian Ulmann class LoopAnnotationImporter { 27b83caa32SChristian Ulmann public: LoopAnnotationImporter(ModuleImport & moduleImport,OpBuilder & builder)2862d7d94cSChristian Ulmann LoopAnnotationImporter(ModuleImport &moduleImport, OpBuilder &builder) 2962d7d94cSChristian Ulmann : moduleImport(moduleImport), builder(builder) {} 30e630a502SChristian Ulmann LoopAnnotationAttr translateLoopAnnotation(const llvm::MDNode *node, 31e630a502SChristian Ulmann Location loc); 32e630a502SChristian Ulmann 33e630a502SChristian Ulmann /// Converts all LLVM access groups starting from node to MLIR access group 349170fa58SMarkus Böck /// attributes. It stores a mapping from every nested access group node to the 359170fa58SMarkus Böck /// translated attribute. Returns success if all conversions succeed and 369170fa58SMarkus Böck /// failure otherwise. 379170fa58SMarkus Böck LogicalResult translateAccessGroup(const llvm::MDNode *node, Location loc); 38e630a502SChristian Ulmann 399170fa58SMarkus Böck /// Returns the access group attribute that map to the access group nodes 409170fa58SMarkus Böck /// starting from the access group metadata node. Returns failure, if any of 419170fa58SMarkus Böck /// the attributes cannot be found. 429170fa58SMarkus Böck FailureOr<SmallVector<AccessGroupAttr>> 43e630a502SChristian Ulmann lookupAccessGroupAttrs(const llvm::MDNode *node) const; 44b83caa32SChristian Ulmann 4562d7d94cSChristian Ulmann /// The ModuleImport owning this instance. 4662d7d94cSChristian Ulmann ModuleImport &moduleImport; 4762d7d94cSChristian Ulmann 48b83caa32SChristian Ulmann private: 49b83caa32SChristian Ulmann /// Returns the LLVM metadata corresponding to a llvm loop metadata attribute. lookupLoopMetadata(const llvm::MDNode * node)50b83caa32SChristian Ulmann LoopAnnotationAttr lookupLoopMetadata(const llvm::MDNode *node) const { 51b83caa32SChristian Ulmann return loopMetadataMapping.lookup(node); 52b83caa32SChristian Ulmann } 53b83caa32SChristian Ulmann mapLoopMetadata(const llvm::MDNode * metadata,LoopAnnotationAttr attr)54b83caa32SChristian Ulmann void mapLoopMetadata(const llvm::MDNode *metadata, LoopAnnotationAttr attr) { 55b83caa32SChristian Ulmann auto result = loopMetadataMapping.try_emplace(metadata, attr); 56b83caa32SChristian Ulmann (void)result; 57b83caa32SChristian Ulmann assert(result.second && 58b83caa32SChristian Ulmann "attempting to map loop options that was already mapped"); 59b83caa32SChristian Ulmann } 60b83caa32SChristian Ulmann 61e630a502SChristian Ulmann OpBuilder &builder; 62b83caa32SChristian Ulmann DenseMap<const llvm::MDNode *, LoopAnnotationAttr> loopMetadataMapping; 639170fa58SMarkus Böck /// Mapping between original LLVM access group metadata nodes and the imported 649170fa58SMarkus Böck /// MLIR access group attributes. 659170fa58SMarkus Böck DenseMap<const llvm::MDNode *, AccessGroupAttr> accessGroupMapping; 66b83caa32SChristian Ulmann }; 67b83caa32SChristian Ulmann 68b83caa32SChristian Ulmann } // namespace detail 69b83caa32SChristian Ulmann } // namespace LLVM 70b83caa32SChristian Ulmann } // namespace mlir 71b83caa32SChristian Ulmann 72b83caa32SChristian Ulmann #endif // MLIR_LIB_TARGET_LLVMIR_LOOPANNOTATIONIMPORTER_H_ 73