Skip to content

Commit ca1a963

Browse files
authored
[mlir][drr] Fix variadic destination emission (#95855)
Its possible for handleResultPattern to emit helpers, these helpers cannot be interleaved with pushing into the array. Emit into a separate string to enable helpers to be emitted before the population of vector. Signed-off-by: Jacques Pienaar <[email protected]>
1 parent ca22469 commit ca1a963

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

mlir/test/mlir-tblgen/rewriter-static-matcher.td

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ def COp : NS_Op<"c_op", []> {
3535
let results = (outs AnyInteger);
3636
}
3737

38+
def DOp : NS_Op<"d_op", []> {
39+
let arguments = (ins
40+
Variadic<AnyInteger>:$any_integer
41+
);
42+
43+
let results = (outs AnyInteger);
44+
}
45+
46+
def Foo : NativeCodeCall<"foo($_builder, $0)">;
47+
3848
// Test static matcher for duplicate DagNode
3949
// ---
4050

@@ -53,3 +63,8 @@ def : Pat<(AOp (BOp I32Attr:$attr, I32:$int)),
5363
// CHECK: if(::mlir::failed([[$DAG_MATCHER]](rewriter, op1, tblgen_ops
5464
def : Pat<(COp $_, (BOp I32Attr:$attr, I32:$int)),
5565
(COp $attr, $int)>;
66+
67+
// CHECK: auto [[$VAR:.*]] = foo(
68+
// CHECK: ::llvm::SmallVector<::mlir::Value, 4> [[$ARR:tblgen_variadic_values_.*]];
69+
// CHECK: [[$ARR]].push_back([[$VAR]]);
70+
def : Pat<(AOp $x), (DOp (variadic (Foo $x)))>;

mlir/tools/mlir-tblgen/RewriterGen.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,20 +1261,23 @@ std::string PatternEmitter::handleResultPattern(DagNode resultTree,
12611261
std::string PatternEmitter::handleVariadic(DagNode tree, int depth) {
12621262
assert(tree.isVariadic());
12631263

1264+
std::string output;
1265+
llvm::raw_string_ostream oss(output);
12641266
auto name = std::string(formatv("tblgen_variadic_values_{0}", nextValueId++));
12651267
symbolInfoMap.bindValue(name);
1266-
os << "::llvm::SmallVector<::mlir::Value, 4> " << name << ";\n";
1268+
oss << "::llvm::SmallVector<::mlir::Value, 4> " << name << ";\n";
12671269
for (int i = 0, e = tree.getNumArgs(); i != e; ++i) {
12681270
if (auto child = tree.getArgAsNestedDag(i)) {
1269-
os << name << ".push_back(" << handleResultPattern(child, i, depth + 1)
1270-
<< ");\n";
1271+
oss << name << ".push_back(" << handleResultPattern(child, i, depth + 1)
1272+
<< ");\n";
12711273
} else {
1272-
os << name << ".push_back("
1273-
<< handleOpArgument(tree.getArgAsLeaf(i), tree.getArgName(i))
1274-
<< ");\n";
1274+
oss << name << ".push_back("
1275+
<< handleOpArgument(tree.getArgAsLeaf(i), tree.getArgName(i))
1276+
<< ");\n";
12751277
}
12761278
}
12771279

1280+
os << oss.str();
12781281
return name;
12791282
}
12801283

0 commit comments

Comments
 (0)