[Mlir-commits] [mlir] [mlir][emitc] Fix the emitc::ExpressionOp (PR #143894)
Vlad Lazar
llvmlistbot at llvm.org
Mon Jun 16 02:32:42 PDT 2025
https://github.com/Vladislave0-0 updated https://github.com/llvm/llvm-project/pull/143894
>From 604fff1c81cfcd49d8ebbb73f02e34dcc156a2d2 Mon Sep 17 00:00:00 2001
From: Vlad Lazar <lazar_2004 at list.ru>
Date: Thu, 12 Jun 2025 16:36:37 +0300
Subject: [PATCH] [mlir][emitc] Fix the emitc::ExpressionOp
Fix the lack of verification that the definingOp of the return value
belongs to emitc::ExpressionOp
---
mlir/lib/Dialect/EmitC/IR/EmitC.cpp | 12 +++++++++---
mlir/test/Dialect/EmitC/invalid_ops.mlir | 22 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
index 1709654b90138..95ecdceea34ee 100644
--- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
+++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
@@ -386,9 +386,7 @@ OpFoldResult emitc::ConstantOp::fold(FoldAdaptor adaptor) { return getValue(); }
Operation *ExpressionOp::getRootOp() {
auto yieldOp = cast<YieldOp>(getBody()->getTerminator());
Value yieldedValue = yieldOp.getResult();
- Operation *rootOp = yieldedValue.getDefiningOp();
- assert(rootOp && "Yielded value not defined within expression");
- return rootOp;
+ return yieldedValue.getDefiningOp();
}
LogicalResult ExpressionOp::verify() {
@@ -406,6 +404,14 @@ LogicalResult ExpressionOp::verify() {
if (!yieldResult)
return emitOpError("must yield a value at termination");
+ Operation *rootOp = yieldResult.getDefiningOp();
+
+ if (!rootOp)
+ return emitOpError("yielded value has no defining op");
+
+ if (!isa<emitc::ExpressionOp>(rootOp->getParentOp()))
+ return emitOpError("yielded value not defined within expression");
+
Type yieldType = yieldResult.getType();
if (resultType != yieldType)
diff --git a/mlir/test/Dialect/EmitC/invalid_ops.mlir b/mlir/test/Dialect/EmitC/invalid_ops.mlir
index 3793dfe3f173b..3946a36a83c6f 100644
--- a/mlir/test/Dialect/EmitC/invalid_ops.mlir
+++ b/mlir/test/Dialect/EmitC/invalid_ops.mlir
@@ -346,6 +346,28 @@ func.func @test_expression_multiple_results(%arg0: i32) -> i32 {
// -----
+emitc.func @test_expression_no_defining_op(%a : i32) {
+ // expected-error @+1 {{'emitc.expression' op yielded value has no defining op}}
+ %res = emitc.expression : i32 {
+ emitc.yield %a : i32
+ }
+
+ return
+}
+
+// -----
+
+emitc.func @test_expression_op_outside_expression() {
+ %cond = literal "true" : i1
+ // expected-error @+1 {{'emitc.expression' op yielded value not defined within expression}}
+ %res = emitc.expression : i1 {
+ emitc.yield %cond : i1
+ }
+ return
+}
+
+// -----
+
// expected-error @+1 {{'emitc.func' op requires zero or exactly one result, but has 2}}
emitc.func @multiple_results(%0: i32) -> (i32, i32) {
emitc.return %0 : i32
More information about the Mlir-commits
mailing list