From: Ray (I-Jui) Sung Date: Tue, 1 Dec 2020 00:22:36 +0000 (+0000) Subject: Don't count attributes when addressing operands. X-Git-Tag: llvmorg-13-init~4796 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff2e22853f8d8145cc7c27bb11e44155a124ecec;p=platform%2Fupstream%2Fllvm.git Don't count attributes when addressing operands. Fixes out-of-bound access in generated nested DAG rewriter matching code. Reviewed By: tpopp Differential Revision: https://reviews.llvm.org/D92075 --- diff --git a/mlir/test/mlir-tblgen/rewriter-indexing.td b/mlir/test/mlir-tblgen/rewriter-indexing.td new file mode 100644 index 0000000..ed493d0 --- /dev/null +++ b/mlir/test/mlir-tblgen/rewriter-indexing.td @@ -0,0 +1,49 @@ +// RUN: mlir-tblgen -gen-rewriters -I %S/../../include %s | FileCheck %s + +include "mlir/IR/OpBase.td" + +def Test_Dialect : Dialect { + let name = "test"; +} +class NS_Op traits> : + Op; + +def AOp : NS_Op<"a_op", []> { + let arguments = (ins + AnyInteger:$any_integer + ); + + let results = (outs AnyInteger); +} + +def BOp : NS_Op<"b_op", []> { + let arguments = (ins + AnyAttr: $any_attr, + AnyInteger + ); +} + +// Tests dag operand indexing for ops with mixed attr and operand. +// --- + +def COp : NS_Op<"c_op", []> { + let arguments = (ins + AnyAttr: $any_attr1, + AnyInteger, + AnyAttr: $any_attr2, + AnyInteger + ); +} + +// Only operand 0 should be addressed during matching. +// CHECK: struct test1 : public ::mlir::RewritePattern { +// CHECK: castedOp0.getODSOperands(0).begin()).getDefiningOp() +def test1 : Pat<(BOp $attr, (AOp $input)), + (BOp $attr, $input)>; + +// Only operand 0 and 1 should be addressed during matching. +// CHECK: struct test2 : public ::mlir::RewritePattern { +// CHECK: castedOp0.getODSOperands(0); +// CHECK: castedOp0.getODSOperands(1).begin()).getDefiningOp() +def test2 : Pat<(COp $attr1, $op1, $attr2, (AOp $op2)), + (BOp $attr1, $op2)>; diff --git a/mlir/tools/mlir-tblgen/RewriterGen.cpp b/mlir/tools/mlir-tblgen/RewriterGen.cpp index 2e0e9ab..da189c6 100644 --- a/mlir/tools/mlir-tblgen/RewriterGen.cpp +++ b/mlir/tools/mlir-tblgen/RewriterGen.cpp @@ -349,7 +349,7 @@ void PatternEmitter::emitOpMatch(DagNode tree, StringRef opName, int depth) { if (!name.empty()) os << formatv("{0} = {1};\n", name, castedName); - for (int i = 0, e = tree.getNumArgs(); i != e; ++i) { + for (int i = 0, e = tree.getNumArgs(), nextOperand = 0; i != e; ++i) { auto opArg = op.getArg(i); std::string argName = formatv("op{0}", depth + 1); @@ -365,10 +365,11 @@ void PatternEmitter::emitOpMatch(DagNode tree, StringRef opName, int depth) { } os << "{\n"; + // Attributes don't count for getODSOperands. os.indent() << formatv( "auto *{0} = " "(*{1}.getODSOperands({2}).begin()).getDefiningOp();\n", - argName, castedName, i); + argName, castedName, nextOperand++); emitMatch(argTree, argName, depth + 1); os << formatv("tblgen_ops[{0}] = {1};\n", ++opCounter, argName); os.unindent() << "}\n"; @@ -377,7 +378,9 @@ void PatternEmitter::emitOpMatch(DagNode tree, StringRef opName, int depth) { // Next handle DAG leaf: operand or attribute if (opArg.is()) { + // emitOperandMatch's argument indexing counts attributes. emitOperandMatch(tree, castedName, i, depth); + ++nextOperand; } else if (opArg.is()) { emitAttributeMatch(tree, opName, i, depth); } else {