Jlm
Loading...
Searching...
No Matches
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
27namespace jlm::mlir
28{
29
31{
32public:
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
85private:
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
129 ::mlir::arith::CmpIOp & CompOp,
130 const ::llvm::SmallVector<rvsdg::Output *> & inputs,
131 size_t nbits);
132
142 ::mlir::LLVM::ICmpOp & operation,
143 rvsdg::Region & rvsdgRegion,
144 const ::llvm::SmallVector<rvsdg::Output *> & inputs);
145
154 const ::mlir::Operation & mlirOperation,
155 const ::llvm::SmallVector<rvsdg::Output *> & inputs);
156
163 TryConvertFPCMP(const ::mlir::arith::CmpFPredicate & op);
164
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
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
MlirToJlmConverter & operator=(MlirToJlmConverter &&)=delete
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)
static std::unique_ptr< llvm::LlvmRvsdgModule > CreateAndConvert(std::unique_ptr<::mlir::Block > &block)
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=(const MlirToJlmConverter &)=delete
::llvm::SmallVector< jlm::rvsdg::Output * > ConvertBlock(::mlir::Block &block, rvsdg::Region &rvsdgRegion)
std::unique_ptr< llvm::LlvmRvsdgModule > ConvertOmega(::mlir::rvsdg::OmegaNode &omegaNode)
::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)
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213