Jlm
MlirToJlmConverter.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Magnus Sjalander <work@sjalander.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_MLIR_FRONTEND_MLIRTOJLMCONVERTER_HPP
7 #define JLM_MLIR_FRONTEND_MLIRTOJLMCONVERTER_HPP
8 
15 #include <jlm/rvsdg/gamma.hpp>
16 #include <jlm/rvsdg/theta.hpp>
18 
19 #include <JLM/JLMDialect.h>
20 #include <JLM/JLMOps.h>
21 #include <RVSDG/RVSDGDialect.h>
22 #include <RVSDG/RVSDGPasses.h>
23 
24 #include <mlir/Dialect/Arith/IR/Arith.h>
25 #include <mlir/Dialect/LLVMIR/LLVMDialect.h>
26 
27 namespace jlm::mlir
28 {
29 
30 class MlirToJlmConverter final
31 {
32 public:
34  : Context_(std::make_unique<::mlir::MLIRContext>())
35  {
36  // Load the RVSDG dialect
37  Context_->getOrLoadDialect<::mlir::rvsdg::RVSDGDialect>();
38  // Load the JLM dialect
39  Context_->getOrLoadDialect<::mlir::jlm::JLMDialect>();
40  // Load the Arith dialect
41  Context_->getOrLoadDialect<::mlir::arith::ArithDialect>();
42  // Load the LLVM dialect
43  Context_->getOrLoadDialect<::mlir::LLVM::LLVMDialect>();
44  }
45 
47 
49 
51  operator=(const MlirToJlmConverter &) = delete;
52 
55 
61  std::unique_ptr<llvm::LlvmRvsdgModule>
62  ReadAndConvertMlir(const util::FilePath & filePath);
63 
69  std::unique_ptr<llvm::LlvmRvsdgModule>
70  ConvertMlir(std::unique_ptr<::mlir::Block> & block);
71 
78  static std::unique_ptr<llvm::LlvmRvsdgModule>
79  CreateAndConvert(std::unique_ptr<::mlir::Block> & block)
80  {
82  return converter.ConvertMlir(block);
83  }
84 
85 private:
95  ::llvm::SmallVector<jlm::rvsdg::Output *>
96  ConvertRegion(::mlir::Region & region, rvsdg::Region & rvsdgRegion);
97 
105  ::llvm::SmallVector<jlm::rvsdg::Output *>
106  ConvertBlock(::mlir::Block & block, rvsdg::Region & rvsdgRegion);
107 
115  static ::llvm::SmallVector<jlm::rvsdg::Output *>
117  ::mlir::Operation & mlirOp,
118  const std::unordered_map<void *, rvsdg::Output *> & outputMap);
119 
127  rvsdg::Node *
129  ::mlir::arith::CmpIOp & CompOp,
130  const ::llvm::SmallVector<rvsdg::Output *> & inputs,
131  size_t nbits);
132 
140  rvsdg::Node *
142  ::mlir::LLVM::ICmpOp & operation,
143  rvsdg::Region & rvsdgRegion,
144  const ::llvm::SmallVector<rvsdg::Output *> & inputs);
145 
152  rvsdg::Node *
154  const ::mlir::Operation & mlirOperation,
155  const ::llvm::SmallVector<rvsdg::Output *> & inputs);
156 
163  TryConvertFPCMP(const ::mlir::arith::CmpFPredicate & op);
164 
171  rvsdg::Node *
173  ::mlir::Operation & mlirOperation,
174  const ::llvm::SmallVector<rvsdg::Output *> & inputs);
175 
183  std::vector<jlm::rvsdg::Output *>
185  ::mlir::Operation & mlirOperation,
186  rvsdg::Region & rvsdgRegion,
187  const ::llvm::SmallVector<rvsdg::Output *> & inputs);
188 
195  ConvertFPSize(unsigned int size);
196 
203  ConvertLinkage(std::string stringValue);
204 
210  std::unique_ptr<llvm::LlvmRvsdgModule>
211  ConvertOmega(::mlir::rvsdg::OmegaNode & omegaNode);
212 
220  rvsdg::Node *
222  ::mlir::Operation & mlirLambda,
223  rvsdg::Region & rvsdgRegion,
224  const ::llvm::SmallVector<rvsdg::Output *> & inputs);
225 
231  std::shared_ptr<const rvsdg::Type>
232  ConvertType(const ::mlir::Type & type);
233 
240  static size_t
242  {
243  // TODO
244  // This should return an architeture dependent size
245  // 32-bits are used for x86.
246 
247  return 32;
248  }
249 
250  std::unique_ptr<::mlir::MLIRContext> Context_;
253 };
254 
255 } // namespace jlm::mlir
256 
257 #endif // JLM_MLIR_FRONTEND_MLIRTOJLMCONVERTER_HPP
static ::llvm::SmallVector< jlm::rvsdg::Output * > GetConvertedInputs(::mlir::Operation &mlirOp, const std::unordered_map< void *, rvsdg::Output * > &outputMap)
std::unique_ptr<::mlir::MLIRContext > Context_
std::vector< jlm::rvsdg::Output * > ConvertOperation(::mlir::Operation &mlirOperation, rvsdg::Region &rvsdgRegion, const ::llvm::SmallVector< rvsdg::Output * > &inputs)
MlirToJlmConverter(const MlirToJlmConverter &)=delete
rvsdg::Node * ConvertFPBinaryNode(const ::mlir::Operation &mlirOperation, const ::llvm::SmallVector< rvsdg::Output * > &inputs)
rvsdg::Node * ConvertICmpOp(::mlir::LLVM::ICmpOp &operation, rvsdg::Region &rvsdgRegion, const ::llvm::SmallVector< rvsdg::Output * > &inputs)
rvsdg::Node * ConvertLambda(::mlir::Operation &mlirLambda, rvsdg::Region &rvsdgRegion, const ::llvm::SmallVector< rvsdg::Output * > &inputs)
MlirToJlmConverter(MlirToJlmConverter &&)=delete
llvm::fpsize ConvertFPSize(unsigned int size)
llvm::Linkage ConvertLinkage(std::string stringValue)
util::BijectiveMap<::mlir::LLVM::LLVMStructType *, std::shared_ptr< const llvm::StructType > > StructTypeMap_
std::unique_ptr< llvm::LlvmRvsdgModule > ReadAndConvertMlir(const util::FilePath &filePath)
jlm::llvm::fpcmp TryConvertFPCMP(const ::mlir::arith::CmpFPredicate &op)
rvsdg::Node * ConvertCmpIOp(::mlir::arith::CmpIOp &CompOp, const ::llvm::SmallVector< rvsdg::Output * > &inputs, size_t nbits)
MlirToJlmConverter & operator=(MlirToJlmConverter &&)=delete
::llvm::SmallVector< jlm::rvsdg::Output * > ConvertBlock(::mlir::Block &block, rvsdg::Region &rvsdgRegion)
std::unique_ptr< llvm::LlvmRvsdgModule > ConvertOmega(::mlir::rvsdg::OmegaNode &omegaNode)
MlirToJlmConverter & operator=(const MlirToJlmConverter &)=delete
::llvm::SmallVector< jlm::rvsdg::Output * > ConvertRegion(::mlir::Region &region, rvsdg::Region &rvsdgRegion)
std::shared_ptr< const rvsdg::Type > ConvertType(const ::mlir::Type &type)
std::unique_ptr< llvm::LlvmRvsdgModule > ConvertMlir(std::unique_ptr<::mlir::Block > &block)
rvsdg::Node * ConvertBitBinaryNode(::mlir::Operation &mlirOperation, const ::llvm::SmallVector< rvsdg::Output * > &inputs)
static std::unique_ptr< llvm::LlvmRvsdgModule > CreateAndConvert(std::unique_ptr<::mlir::Block > &block)
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
static std::string type(const Node *n)
Definition: view.cpp:255