From 5383f48565d72df2ce008d110a46b226e5a46b0a Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 27 Nov 2025 20:06:23 +0100 Subject: [PATCH] Add PtrAddOp to the cxx dialect and require MLIR 21 --- .github/workflows/ci.yml | 6 +- scripts/build-mlir.js | 13 +- src/frontend/cxx/frontend.cc | 8 +- src/mlir/CMakeLists.txt | 4 +- src/mlir/cxx/mlir/CxxOps.td | 6 + src/mlir/cxx/mlir/codegen_expressions.cc | 8 + src/mlir/cxx/mlir/codegen_units.cc | 4 +- src/mlir/cxx/mlir/cxx_dialect_conversions.cc | 174 +++++++++++-------- 8 files changed, 142 insertions(+), 81 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c90c0a2..45599e5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,10 +72,10 @@ jobs: run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 20 + sudo ./llvm.sh 21 rm llvm.sh - sudo apt-get install -y libmlir-20-dev mlir-20-tools + sudo apt-get install -y libmlir-21-dev mlir-21-tools - name: Install unit tests requirements run: | @@ -86,7 +86,7 @@ jobs: run: | . .venv/bin/activate - PATH=/usr/lib/llvm-20/bin:$PATH + PATH=/usr/lib/llvm-21/bin:$PATH cmake --preset default-mlir diff --git a/scripts/build-mlir.js b/scripts/build-mlir.js index 2a5b346b..b9494f9e 100644 --- a/scripts/build-mlir.js +++ b/scripts/build-mlir.js @@ -73,6 +73,7 @@ async function main() { "-DCMAKE_CXX_FLAGS=-DLLVM_BUILD_STATIC", "-DCMAKE_EXE_LINKER_FLAGS=-sNODERAWFS -sEXIT_RUNTIME -sALLOW_MEMORY_GROWTH", "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON", + "-DCMAKE_CXX_FLAGS=-Wno-c2y-extensions", "-DLLVM_BUILD_EXTERNAL_COMPILER_RT=OFF", "-DLLVM_BUILD_TOOLS=OFF", "-DLLVM_ENABLE_EH=OFF", @@ -81,11 +82,12 @@ async function main() { "-DLLVM_ENABLE_RTTI=OFF", "-DLLVM_ENABLE_RUNTIMES=", "-DLLVM_ENABLE_Z3_SOLVER=OFF", + "-DLLVM_ENABLE_WERROR=OFF", "-DLLVM_INCLUDE_DOCS=OFF", "-DLLVM_INCLUDE_TESTS=OFF", "-DLLVM_INSTALL_UTILS=OFF", "-DLLVM_LINK_LLVM_DYLIB=OFF", - "-DLLVM_OPTIMIZED_TABLEGEN=OFF", + "-DLLVM_OPTIMIZED_TABLEGEN=ON", "-DLLVM_TARGETS_TO_BUILD=WebAssembly", ]; @@ -164,4 +166,11 @@ require("./${app}.js");` } } -await await main(); +main().catch((err) => { + if (err instanceof Error) { + console.error(err.message); + } else { + console.error(err); + } + process.exit(1); +}); diff --git a/src/frontend/cxx/frontend.cc b/src/frontend/cxx/frontend.cc index 4d0d6294..36481a87 100644 --- a/src/frontend/cxx/frontend.cc +++ b/src/frontend/cxx/frontend.cc @@ -549,14 +549,14 @@ void Frontend::Private::emitCode() { #ifdef CXX_WITH_MLIR llvm::InitializeAllAsmPrinters(); - auto triple = toolchain_->memoryLayout()->triple(); + auto triple = llvm::Triple{toolchain_->memoryLayout()->triple()}; std::string error; auto target = llvm::TargetRegistry::lookupTarget(triple, error); if (!target) { std::cerr << std::format("cxx: cannot find target for triple '{}': {}\n", - triple, error); + triple.getTriple(), error); shouldExit_ = true; exitStatus_ = EXIT_FAILURE; return; @@ -567,11 +567,11 @@ void Frontend::Private::emitCode() { auto RM = std::optional(); auto targetMachine = - target->createTargetMachine(triple, "generic", "", opt, RM); + target->createTargetMachine(llvm::Triple{triple}, "generic", "", opt, RM); if (!targetMachine) { std::cerr << std::format("cxx: cannot create target machine for '{}': {}\n", - triple, error); + triple.getTriple(), error); shouldExit_ = true; exitStatus_ = EXIT_FAILURE; return; diff --git a/src/mlir/CMakeLists.txt b/src/mlir/CMakeLists.txt index afe3ace9..c1dab8bb 100644 --- a/src/mlir/CMakeLists.txt +++ b/src/mlir/CMakeLists.txt @@ -5,8 +5,8 @@ endif() find_package(MLIR REQUIRED CONFIG) -if (MLIR_VERSION VERSION_LESS "20.0") - message(FATAL_ERROR "MLIR >= 20.0 is required") +if (MLIR_VERSION VERSION_LESS "21.0") + message(FATAL_ERROR "MLIR >= 21.0 is required") endif() LIST(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}" "${LLVM_CMAKE_DIR}") diff --git a/src/mlir/cxx/mlir/CxxOps.td b/src/mlir/cxx/mlir/CxxOps.td index fe5addfb..f94344e3 100644 --- a/src/mlir/cxx/mlir/CxxOps.td +++ b/src/mlir/cxx/mlir/CxxOps.td @@ -186,6 +186,12 @@ def Cxx_MemberOp : Cxx_Op<"member"> { let results = (outs Cxx_PointerType:$result); } +def Cxx_PtrAddOp : Cxx_Op<"ptr_add"> { + let arguments = (ins Cxx_PointerType:$base, Cxx_IntegerType:$offset); + + let results = (outs Cxx_PointerType:$result); +} + def Cxx_AddressOfOp : Cxx_Op<"addressof"> { let arguments = (ins FlatSymbolRefAttr:$sym_name); diff --git a/src/mlir/cxx/mlir/codegen_expressions.cc b/src/mlir/cxx/mlir/codegen_expressions.cc index e2c728bc..1a488618 100644 --- a/src/mlir/cxx/mlir/codegen_expressions.cc +++ b/src/mlir/cxx/mlir/codegen_expressions.cc @@ -482,6 +482,14 @@ auto Codegen::ExpressionVisitor::operator()(SubscriptExpressionAST* ast) auto resultType = gen.convertType(control()->add_pointer(ast->type)); + if (control()->is_pointer(ast->baseExpression->type)) { + auto op = gen.builder_.create( + loc, resultType, baseExpressionResult.value, + indexExpressionResult.value); + + return {op}; + } + auto op = gen.builder_.create( loc, resultType, baseExpressionResult.value, indexExpressionResult.value); diff --git a/src/mlir/cxx/mlir/codegen_units.cc b/src/mlir/cxx/mlir/codegen_units.cc index d9a35523..0819d711 100644 --- a/src/mlir/cxx/mlir/codegen_units.cc +++ b/src/mlir/cxx/mlir/codegen_units.cc @@ -115,14 +115,14 @@ auto Codegen::UnitVisitor::operator()(TranslationUnitAST* ast) -> UnitResult { auto memoryLayout = gen.control()->memoryLayout(); - auto triple = gen.control()->memoryLayout()->triple(); + auto triple = llvm::Triple{gen.control()->memoryLayout()->triple()}; std::string error; auto target = llvm::TargetRegistry::lookupTarget(triple, error); if (!target) { cxx_runtime_error(std::format("failed to find target for triple '{}': {}", - triple, error)); + triple.getTriple(), error)); } llvm::TargetOptions opt; diff --git a/src/mlir/cxx/mlir/cxx_dialect_conversions.cc b/src/mlir/cxx/mlir/cxx_dialect_conversions.cc index e08f15c3..f260b4ed 100644 --- a/src/mlir/cxx/mlir/cxx_dialect_conversions.cc +++ b/src/mlir/cxx/mlir/cxx_dialect_conversions.cc @@ -49,7 +49,7 @@ class FuncOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::FuncOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); @@ -75,10 +75,10 @@ class FuncOpLowering : public OpConversionPattern { } auto convertFunctionTyype(cxx::FuncOp funcOp, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult { auto type = funcOp.getFunctionType(); - const auto &typeConverter = *getTypeConverter(); + const auto& typeConverter = *getTypeConverter(); TypeConverter::SignatureConversion result(type.getInputs().size()); SmallVector newResults; @@ -103,7 +103,7 @@ class GlobalOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::GlobalOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); @@ -122,7 +122,7 @@ class ReturnOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::ReturnOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { rewriter.replaceOpWithNewOp(op, adaptor.getOperands()); return success(); @@ -134,7 +134,7 @@ class CallOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::CallOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); @@ -173,7 +173,7 @@ class AddressOfOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::AddressOfOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); @@ -192,14 +192,14 @@ class AddressOfOpLowering : public OpConversionPattern { class AllocaOpLowering : public OpConversionPattern { public: - AllocaOpLowering(const TypeConverter &typeConverter, - const DataLayout &dataLayout, MLIRContext *context, + AllocaOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), dataLayout_(dataLayout) {} auto matchAndRewrite(cxx::AllocaOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -228,19 +228,19 @@ class AllocaOpLowering : public OpConversionPattern { } private: - const DataLayout &dataLayout_; + const DataLayout& dataLayout_; }; class LoadOpLowering : public OpConversionPattern { public: - LoadOpLowering(const TypeConverter &typeConverter, - const DataLayout &dataLayout, MLIRContext *context, + LoadOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), dataLayout_(dataLayout) {} auto matchAndRewrite(cxx::LoadOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -254,19 +254,19 @@ class LoadOpLowering : public OpConversionPattern { } private: - const DataLayout &dataLayout_; + const DataLayout& dataLayout_; }; class StoreOpLowering : public OpConversionPattern { public: - StoreOpLowering(const TypeConverter &typeConverter, - const DataLayout &dataLayout, MLIRContext *context, + StoreOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), dataLayout_(dataLayout) {} auto matchAndRewrite(cxx::StoreOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -284,19 +284,19 @@ class StoreOpLowering : public OpConversionPattern { } private: - const DataLayout &dataLayout_; + const DataLayout& dataLayout_; }; class SubscriptOpLowering : public OpConversionPattern { public: - SubscriptOpLowering(const TypeConverter &typeConverter, - const DataLayout &dataLayout, MLIRContext *context, + SubscriptOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), dataLayout_(dataLayout) {} auto matchAndRewrite(cxx::SubscriptOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -308,14 +308,12 @@ class SubscriptOpLowering : public OpConversionPattern { op, "failed to convert subscript operation type"); } - auto arrayType = dyn_cast(ptrType.getElementType()); - if (!arrayType) { + if (!llvm::isa(ptrType.getElementType())) { return rewriter.notifyMatchFailure( op, "expected base type of subscript to be an array type"); } SmallVector indices; - indices.push_back(0); indices.push_back(adaptor.getIndex()); @@ -329,19 +327,55 @@ class SubscriptOpLowering : public OpConversionPattern { } private: - const DataLayout &dataLayout_; + const DataLayout& dataLayout_; +}; + +class PtrAddOpLowering : public OpConversionPattern { + public: + PtrAddOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, + PatternBenefit benefit = 1) + : OpConversionPattern(typeConverter, context, benefit), + dataLayout_(dataLayout) {} + + auto matchAndRewrite(cxx::PtrAddOp op, OpAdaptor adaptor, + ConversionPatternRewriter& rewriter) const + -> LogicalResult override { + auto typeConverter = getTypeConverter(); + auto context = getContext(); + + auto resultType = typeConverter->convertType(op.getType()); + if (!resultType) { + return rewriter.notifyMatchFailure( + op, "failed to convert pointer addition result type"); + } + + auto elementType = typeConverter->convertType( + dyn_cast(op.getBase().getType()).getElementType()); + + SmallVector indices; + indices.push_back(adaptor.getOffset()); + + rewriter.replaceOpWithNewOp(op, resultType, elementType, + adaptor.getBase(), indices); + + return success(); + } + + private: + const DataLayout& dataLayout_; }; class MemberOpLowering : public OpConversionPattern { public: - MemberOpLowering(const TypeConverter &typeConverter, - const DataLayout &dataLayout, MLIRContext *context, + MemberOpLowering(const TypeConverter& typeConverter, + const DataLayout& dataLayout, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), dataLayout_(dataLayout) {} auto matchAndRewrite(cxx::MemberOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -368,7 +402,7 @@ class MemberOpLowering : public OpConversionPattern { } private: - const DataLayout &dataLayout_; + const DataLayout& dataLayout_; }; class BoolConstantOpLowering : public OpConversionPattern { @@ -376,7 +410,7 @@ class BoolConstantOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::BoolConstantOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -399,7 +433,7 @@ class IntConstantOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::IntConstantOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -423,7 +457,7 @@ class FloatConstantOpLowering using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::FloatConstantOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -446,7 +480,7 @@ class IntegralCastOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::IntegralCastOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -498,7 +532,7 @@ class IntToBoolOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::IntToBoolOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -525,7 +559,7 @@ class ArrayToPointerOpLowering using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::ArrayToPointerOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -545,6 +579,7 @@ class ArrayToPointerOpLowering SmallVector indices; + indices.push_back(0); indices.push_back(0); auto resultType = LLVM::LLVMPointerType::get(context); @@ -562,7 +597,7 @@ class BoolToIntOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::BoolToIntOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -585,7 +620,7 @@ class NotOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::NotOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -610,7 +645,7 @@ class AddIOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::AddIOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -633,7 +668,7 @@ class SubIOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::SubIOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -656,7 +691,7 @@ class MulIOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::MulIOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -679,7 +714,7 @@ class DivIOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::DivIOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -713,7 +748,7 @@ class ModIOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::ModIOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -747,7 +782,7 @@ class ShiftLeftOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::ShiftLeftOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -770,7 +805,7 @@ class ShiftRightOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::ShiftRightOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -804,7 +839,7 @@ class EqualOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::EqualOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -828,7 +863,7 @@ class NotEquaOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::NotEqualOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -852,7 +887,7 @@ class LessThanOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::LessThanOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -885,7 +920,7 @@ class LessEqualOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::LessEqualOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -918,7 +953,7 @@ class GreaterThanOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::GreaterThanOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -951,7 +986,7 @@ class GreaterEqualOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::GreaterEqualOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -988,7 +1023,7 @@ class AddFOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::AddFOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1011,7 +1046,7 @@ class SubFOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::SubFOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1034,7 +1069,7 @@ class MulFOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::MulFOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1057,7 +1092,7 @@ class DivFOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::DivFOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1081,7 +1116,7 @@ class FloatingPointCastOpLowering using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::FloatingPointCastOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1121,7 +1156,7 @@ class IntToFloatOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::IntToFloatOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1144,7 +1179,7 @@ class FloatToIntOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::FloatToIntOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1171,7 +1206,7 @@ class CondBranchOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::CondBranchOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto typeConverter = getTypeConverter(); auto context = getContext(); @@ -1186,19 +1221,19 @@ class CondBranchOpLowering : public OpConversionPattern { }; struct LabelConverter { - DenseMap labels; + DenseMap labels; }; class GotoOpLowering : public OpConversionPattern { public: - GotoOpLowering(const TypeConverter &typeConverter, - const LabelConverter &labelConverter, MLIRContext *context, + GotoOpLowering(const TypeConverter& typeConverter, + const LabelConverter& labelConverter, MLIRContext* context, PatternBenefit benefit = 1) : OpConversionPattern(typeConverter, context, benefit), labelConverter_(labelConverter) {} auto matchAndRewrite(cxx::GotoOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto context = getContext(); @@ -1214,7 +1249,7 @@ class GotoOpLowering : public OpConversionPattern { } private: - const LabelConverter &labelConverter_; + const LabelConverter& labelConverter_; }; class LabelOpLowering : public OpConversionPattern { @@ -1222,7 +1257,7 @@ class LabelOpLowering : public OpConversionPattern { using OpConversionPattern::OpConversionPattern; auto matchAndRewrite(cxx::LabelOp op, OpAdaptor adaptor, - ConversionPatternRewriter &rewriter) const + ConversionPatternRewriter& rewriter) const -> LogicalResult override { auto context = getContext(); @@ -1239,7 +1274,7 @@ class CxxToLLVMLoweringPass auto getArgument() const -> StringRef override { return "cxx-to-llvm"; } - void getDependentDialects(DialectRegistry ®istry) const override { + void getDependentDialects(DialectRegistry& registry) const override { registry.insert(); registry.insert(); } @@ -1347,7 +1382,7 @@ void CxxToLLVMLoweringPass::runOnOperation() { LabelConverter labelConverter; - module.walk([&](Operation *op) { + module.walk([&](Operation* op) { if (auto labelOp = dyn_cast(op)) { labelConverter.labels[labelOp.getName()] = labelOp->getBlock(); } @@ -1387,6 +1422,9 @@ void CxxToLLVMLoweringPass::runOnOperation() { ModIOpLowering, ShiftLeftOpLowering, ShiftRightOpLowering>( typeConverter, context); + // pointer arithmetic operations + patterns.insert(typeConverter, dataLayout, context); + // comparison operations patterns.insert mlir::LogicalResult { return mlir::success(); } -auto cxx::exportToLLVMIR(mlir::ModuleOp module, llvm::LLVMContext &context) +auto cxx::exportToLLVMIR(mlir::ModuleOp module, llvm::LLVMContext& context) -> std::unique_ptr { mlir::registerBuiltinDialectTranslation(*module->getContext()); mlir::registerLLVMDialectTranslation(*module->getContext());