From a2eca8fe1f83ddfc2043f6136331668bfb039aa5 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 30 Jul 2025 22:32:49 +0200 Subject: [PATCH] Generate MLIR code for the simple assignments --- src/mlir/cxx/mlir/codegen.h | 9 +++++++- src/mlir/cxx/mlir/codegen_expressions.cc | 27 +++++++++++++++++++++--- src/mlir/cxx/mlir/codegen_statements.cc | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/mlir/cxx/mlir/codegen.h b/src/mlir/cxx/mlir/codegen.h index 7f8fead8..ef0feafb 100644 --- a/src/mlir/cxx/mlir/codegen.h +++ b/src/mlir/cxx/mlir/codegen.h @@ -112,7 +112,14 @@ class Codegen { void statement(StatementAST* ast); - [[nodiscard]] auto expression(ExpressionAST* ast) -> ExpressionResult; + enum struct ExpressionFormat { + kValue, + kSideEffect, + }; + + [[nodiscard]] auto expression( + ExpressionAST* ast, ExpressionFormat format = ExpressionFormat::kValue) + -> ExpressionResult; [[nodiscard]] auto templateParameter(TemplateParameterAST* ast) -> TemplateParameterResult; diff --git a/src/mlir/cxx/mlir/codegen_expressions.cc b/src/mlir/cxx/mlir/codegen_expressions.cc index a741c24c..4b49b1da 100644 --- a/src/mlir/cxx/mlir/codegen_expressions.cc +++ b/src/mlir/cxx/mlir/codegen_expressions.cc @@ -31,6 +31,7 @@ namespace cxx { struct Codegen::ExpressionVisitor { Codegen& gen; + ExpressionFormat format = ExpressionFormat::kValue; auto operator()(GeneratedLiteralExpressionAST* ast) -> ExpressionResult; auto operator()(CharLiteralExpressionAST* ast) -> ExpressionResult; @@ -104,8 +105,9 @@ struct Codegen::NewInitializerVisitor { auto operator()(NewBracedInitializerAST* ast) -> NewInitializerResult; }; -auto Codegen::expression(ExpressionAST* ast) -> ExpressionResult { - if (ast) return visit(ExpressionVisitor{*this}, ast); +auto Codegen::expression(ExpressionAST* ast, ExpressionFormat format) + -> ExpressionResult { + if (ast) return visit(ExpressionVisitor{*this, format}, ast); return {}; } @@ -252,7 +254,7 @@ auto Codegen::ExpressionVisitor::operator()(NestedStatementExpressionAST* ast) auto Codegen::ExpressionVisitor::operator()(NestedExpressionAST* ast) -> ExpressionResult { - return gen.expression(ast->expression); + return gen.expression(ast->expression, format); } auto Codegen::ExpressionVisitor::operator()(IdExpressionAST* ast) @@ -865,6 +867,25 @@ auto Codegen::ExpressionVisitor::operator()(ThrowExpressionAST* ast) auto Codegen::ExpressionVisitor::operator()(AssignmentExpressionAST* ast) -> ExpressionResult { + if (ast->op == TokenKind::T_EQUAL) { + auto leftExpressionResult = gen.expression(ast->leftExpression); + auto rightExpressionResult = gen.expression(ast->rightExpression); + + // Generate a store operation + auto loc = gen.getLocation(ast->opLoc); + + auto resultType = gen.convertType(ast->leftExpression->type); + + gen.builder_.create(loc, rightExpressionResult.value, + leftExpressionResult.value); + + if (format == ExpressionFormat::kSideEffect) { + return {}; + } + + return leftExpressionResult; + } + auto op = gen.emitTodoExpr(ast->firstSourceLocation(), to_string(ast->kind())); diff --git a/src/mlir/cxx/mlir/codegen_statements.cc b/src/mlir/cxx/mlir/codegen_statements.cc index 7d8600b4..0f192390 100644 --- a/src/mlir/cxx/mlir/codegen_statements.cc +++ b/src/mlir/cxx/mlir/codegen_statements.cc @@ -107,7 +107,7 @@ void Codegen::StatementVisitor::operator()(DefaultStatementAST* ast) { } void Codegen::StatementVisitor::operator()(ExpressionStatementAST* ast) { - auto expressionResult = gen.expression(ast->expression); + (void)gen.expression(ast->expression, ExpressionFormat::kSideEffect); } void Codegen::StatementVisitor::operator()(CompoundStatementAST* ast) {