diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2024-03-21 17:35:00 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-21 14:35:00 +0100 |
commit | 5344a370fe85d9119729d9036540bbd91956da38 (patch) | |
tree | 0483bef7ee8b788e48094a5cf8c44b39807635ba /mlir | |
parent | 276283d8641f13b6ecde736ab1a8720f742d9d02 (diff) | |
download | llvm-5344a370fe85d9119729d9036540bbd91956da38.zip llvm-5344a370fe85d9119729d9036540bbd91956da38.tar.gz llvm-5344a370fe85d9119729d9036540bbd91956da38.tar.bz2 |
[mlir][emitc] Fix form-expressions inside expression (#86081)
Make form-expressions not create `emitc.expression`s for operations
inside the `emitc.expression`s, since they are invalid.
Diffstat (limited to 'mlir')
-rw-r--r-- | mlir/lib/Dialect/EmitC/Transforms/FormExpressions.cpp | 3 | ||||
-rw-r--r-- | mlir/test/Dialect/EmitC/transforms.mlir | 17 |
2 files changed, 19 insertions, 1 deletions
diff --git a/mlir/lib/Dialect/EmitC/Transforms/FormExpressions.cpp b/mlir/lib/Dialect/EmitC/Transforms/FormExpressions.cpp index 5b03f81..e7c431f 100644 --- a/mlir/lib/Dialect/EmitC/Transforms/FormExpressions.cpp +++ b/mlir/lib/Dialect/EmitC/Transforms/FormExpressions.cpp @@ -36,7 +36,8 @@ struct FormExpressionsPass // Wrap each C operator op with an expression op. OpBuilder builder(context); auto matchFun = [&](Operation *op) { - if (op->hasTrait<OpTrait::emitc::CExpression>()) + if (op->hasTrait<OpTrait::emitc::CExpression>() && + !op->getParentOfType<emitc::ExpressionOp>()) createExpression(op, builder); }; rootOp->walk(matchFun); diff --git a/mlir/test/Dialect/EmitC/transforms.mlir b/mlir/test/Dialect/EmitC/transforms.mlir index ad167fa..8ac606a 100644 --- a/mlir/test/Dialect/EmitC/transforms.mlir +++ b/mlir/test/Dialect/EmitC/transforms.mlir @@ -107,3 +107,20 @@ func.func @expression_with_address_taken(%arg0: i32, %arg1: i32, %arg2: !emitc.p %d = emitc.cmp lt, %c, %arg2 :(!emitc.ptr<i32>, !emitc.ptr<i32>) -> i1 return %d : i1 } + +// CHECK-LABEL: func.func @no_nested_expression( +// CHECK-SAME: %[[VAL_0:.*]]: i32, %[[VAL_1:.*]]: i32) -> i1 { +// CHECK: %[[VAL_2:.*]] = emitc.expression : i1 { +// CHECK: %[[VAL_3:.*]] = emitc.cmp lt, %[[VAL_0]], %[[VAL_1]] : (i32, i32) -> i1 +// CHECK: emitc.yield %[[VAL_3]] : i1 +// CHECK: } +// CHECK: return %[[VAL_2]] : i1 +// CHECK: } + +func.func @no_nested_expression(%arg0: i32, %arg1: i32) -> i1 { + %a = emitc.expression : i1 { + %b = emitc.cmp lt, %arg0, %arg1 :(i32, i32) -> i1 + emitc.yield %b : i1 + } + return %a : i1 +} |