xref: /llvm-project/mlir/lib/Target/LLVMIR/LoopAnnotationImporter.h (revision 0fc8d9e41a81a52866e50a499af093e45f802a28)
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