Interpreted Pattern Match Execution
Jeff Niu
Agenda
Background
Match and Rewrite
Runtime Extensibility
mlir-opt -opt-patterns=MyOptPatterns.pat
-legalize-patterns=MyLegalizePatterns.pat
Duplicate Work
def MyPatternA : Pattern<
(OpA $arg, $attr),
(OpB $arg),
[(CheckD $arg)]>;
def MyPatternB : Pattern<
(OpA $arg, $attr),
(OpC $arg, $attr),
[(CheckE $arg)]>;
Duplicate Work
def MyPatternA : Pattern<
(OpA $arg, $attr),
(OpB $arg),
[(CheckD $arg)]>;
def MyPatternB : Pattern<
(OpA $arg, $attr),
(OpC $arg, $attr),
[(CheckE $arg)]>;
op0.getAttr(“myAttr”)
Pattern Pipeline
Python
JSON
Swift
...
TableGen
PDL
Predicate List
FSM
Bytecode
MLIR emitter
Merge
Lowering MLIR
-O0
Pattern Descriptor Language
Building MLIR with MLIR
def FusedMAdd : Pattern<(AddOp $x, (MulOp $y, $z)), (MAddOp $x, $y, $z)>;
def : Pattern<(MAddOp $x, $y, $z), (MAddIOp $x, $y, $z), [(isInt $x)]>;
def : Pattern<(MAddOp $x, $y, $z), (MAddFOp $x, $y, $z), [(isFlt $x)]>;
Building MLIR with MLIR
def FusedMAdd : Pattern<(AddOp $x, (MulOp $y, $z)), (MAddOp $x, $y, $z)>;
def : Pattern<(MAddOp $x, $y, $z), (MAddIOp $x, $y, $z), [(isInt $x)]>;
def : Pattern<(MAddOp $x, $y, $z), (MAddFOp $x, $y, $z), [(isFlt $x)]>;
pdl.pattern @FusedMAdd {
%x, %y, %z = pdl.ins 3
%mul_op, %mul_ret = pdl.node “u.mul”(%y, %z)
%add_op, %add_ret = pdl.node “u.add”(%x, %mul_ret)
pdl.output(%add_op) {
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.replace -> (%madd_ret)
}
}
pdl.pattern {
%x, %y, %z = pdl.ins 3
pdl.constraint “isInt”(%x : value)
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.output(%madd_op) {
%maddi_op, %maddi_ret = pdl.node “u.maddi”(%x, %y, %z)
pdl.replace -> (%maddi_ret)
}
}
pdl.pattern {
%x, %y, %z = pdl.ins 3
pdl.constraint “isFlt”(%x : value)
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.output(%madd_op) {
%maddf_op, %maddf_ret = pdl.node “u.maddf”(%x, %y, %z)
pdl.replace -> (%maddf_ret)
}
}
Building MLIR with MLIR
def FusedMAdd : Pattern<(AddOp $x, (MulOp $y, $z)), (MAddOp $x, $y, $z)>;
def : Pattern<(MAddOp $x, $y, $z), (MAddIOp $x, $y, $z), [(isInt $x)]>;
def : Pattern<(MAddOp $x, $y, $z), (MAddFOp $x, $y, $z), [(isFlt $x)]>;
pdl.pattern @FusedMAdd {
%x, %y, %z = pdl.ins 3
%mul_op, %mul_ret = pdl.node “u.mul”(%y, %z)
%add_op, %add_ret = pdl.node “u.add”(%x, %mul_ret)
pdl.output(%add_op) {
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.replace -> (%madd_ret)
}
}
pdl.pattern {
%x, %y, %z = pdl.ins 3
pdl.constraint “isInt”(%x : value)
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.output(%madd_op) {
%maddi_op, %maddi_ret = pdl.node “u.maddi”(%x, %y, %z)
pdl.replace -> (%maddi_ret)
}
}
pdl.pattern {
%x, %y, %z = pdl.ins 3
pdl.constraint “isFlt”(%x : value)
%madd_op, %madd_ret = pdl.node “u.madd”(%x, %y, %z)
pdl.output(%madd_op) {
%maddf_op, %maddf_ret = pdl.node “u.maddf”(%x, %y, %z)
pdl.replace -> (%maddf_ret)
}
}
Building MLIR with MLIR
def FusedMAdd : Pattern<(AddOp $x, (MulOp $y, $z)), (MAddOp $x, $y, $z)>;
from mlir import pdl
from dialects import U
ins = pdl.Ins(3)
mul = pdl.Node(U.Mul, ins[1], ins[2])
add = pdl.Node(U.Add, ins[0], mul[0])
pdl.Replace(add, pdl.Node(U.MAdd, ins[0], ins[1], ins[2]))
// Verify patterns
mlir::verify(myPdlPatterns);
PDL Extensibility
%optional = pdl.attr ?
/* ... */
pdl.output(%root) {
%defAttr = pdl.render attr “useDefault”<42 : i16>(%optional : attr)
/* ... */
}
PDL Extensibility
%optional = pdl.attr ?
/* ... */
pdl.output(%root) {
%defAttr = pdl.render attr “useDefault”<42 : i16>(%optional : attr)
/* ... */
}
GenericValue useDefault(GenericValue arg,
Attribute defVal) {
return arg ? arg : defVal;
}
PDL Extensibility
pdl.constraint “atLeastOneIsOneOf”<1, 2, 4, i16, “abc”, ...>(
%attr0, %attr1, %attr2, ..., %attrN
)
bool atLeastOneIsOneOf(ArrayRef<GenericValue> args,
ArrayAttr params) {
for (auto &arg : args)
if (llvm::find(params, arg.get<Attribute>()) != params.end())
return true;
return false;
}
Pattern Optimization
The Literature
Become as One
Strings are Patterns
[“racecar”,
“racetrack”,
“rancid”]
Strings are Patterns
[“running”,
“raining”,
“craving”]
Strings are Patterns
[“running”,
“raining”,
“craving”]
Strings are Patterns
[“ABC”,
“AAC”,
“CBA”]
Patterns are Strings
Patterns are Strings
Patterns are Strings
Patterns are Strings
{[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} |
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
"add"
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
false
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
[0,1]
OpName
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
[0,1]
OpName
"mul"
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
[0,1]
OpName
"mul"
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
[0,1]
OpName
"mul"
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
[0]
ArgCount
2
[0]
OpName
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
[0] → 0
EqualTo<[0] → 1>
true
[0,1]
ArgCount
false
2
[0,1]
OpName
"mul"
return
else
Pattern Matching FSM
{[0], ArgCount}
{[0], OpName}
{[0] → 0, EqualTo<[0] → 1>}
{[0,1], ArgCount}
{[0,1], OpName}
[0]
ArgCount
[0]
OpName
2
return
else
[0] → 0
EqualTo<[0] → 1>
[0] → 0
EqualTo<[0] → 1>
"mul"
"add"
true
true
[0,1]
ArgCount
false
[0,1]
OpName
2
"mul"
else
false
else
else
{[0], ArgCount, 2} {[0], OpName, “add”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “mul”} {[0] → 0, EqualTo<[0] → 1>, true} | {[0], ArgCount, 2} {[0], OpName, “add”} {[0,1], ArgCount, 2} {[0,1], OpName, “mul”} |
Interpreter Dialect
CFG → MLIR
func @matcher(%0 : !Operation) {
^bb0:
CheckArgCount(%0) [^ex0, ^bb1] {count = 2}
^bb1:
SwitchOpName(%0) [^ex0, ^bb2, ^bb3]
{names = ["mul", "add"]}
^bb2:
%1 = GetOperand(%0) {index = 0}
%2 = GetOperand(%0) {index = 1}
EqualTo(%1, %2) [^ex0, ^rr3]
^rr0:
RegisterResult() [^ex0] {id = 0}
^bb3:
%3 = GetOperand(%0) {index = 0}
%4 = GetOperand(%0) {index = 1}
EqualTo(%3, %4) [^bb4, ^rr1]
^rr1:
RegisterResult() [^bb4] {id = 1}
^bb4:
%5 = GetDefiningOp(%4)
CheckArgCount(%5) [^ex0, ^bb5] {count = 2}
^bb5:
CheckOpName(%5) [^ex0, ^rr2] {name = "mul"}
^rr2:
RegisterResult() [^ex0] {id = 2}
^ex0:
return
}
Lowering to Byte-Code
func @matcher(%0 : !Operation) {
^bb0:
CheckArgCount(%0) [^ex0, ^bb1] {count = 2}
^bb1:
SwitchOpName(%0) [^ex0, ^bb2, ^bb3]
{names = ["mul", "add"]}
^bb2:
%1 = GetOperand(%0) {index = 0}
%2 = GetOperand(%0) {index = 1}
EqualTo(%1, %2) [^ex0, ^rr0]
^rr0:
RegisterResult() [^ex0] {id = 0}
^bb3:
%3 = GetOperand(%0) {index = 0}
%4 = GetOperand(%0) {index = 1}
EqualTo(%3, %4) [^bb4, ^rr1]
^rr1:
RegisterResult() [^bb4] {id = 1}
^bb4:
%5 = GetDefiningOp(%4)
CheckArgCount(%5) [^ex0, ^bb5] {count = 2}
^bb5:
CheckOpName(%5) [^ex0, ^rr2] {name = "mul"}
^rr2:
RegisterResult() [^ex0] {id = 2}
^ex0:
return
}
FuncOp matcher = …
matcher.walk(convertToByteCode);
[2, 2, 0, 63, 5, 17, 0, 0, 1, 63, 10, 25, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 63, 21, 1, 0, 63, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 40, 37, 1, 1, 42, 8, 4, 3, 2, 2, 5, 63, 55, 3, 3, 0, 63, 60, 21, 2, 63, 0]
names = [“mul”, “add”]
Static Info
func @matcher(%0 : !Operation) {
^bb0:
CheckArgCount(%0) [^ex0, ^bb1] {count = 2}
^bb1:
SwitchOpName(%0) [^ex0, ^bb2, ^bb3]
{names = ["mul", "add"]}
^bb2:
%1 = GetOperand(%0) {index = 0}
%2 = GetOperand(%0) {index = 1}
EqualTo(%1, %2) [^ex0, ^rr0]
^rr0:
RegisterResult() [^ex0] {id = 0}
^bb3:
%3 = GetOperand(%0) {index = 0}
%4 = GetOperand(%0) {index = 1}
EqualTo(%3, %4) [^bb4, ^rr1]
^rr1:
RegisterResult() [^bb4] {id = 1}
^bb4:
%5 = GetDefiningOp(%4)
CheckArgCount(%5) [^ex0, ^bb5] {count = 2}
^bb5:
CheckOpName(%5) [^ex0, ^rr2] {name = "mul"}
^rr2:
RegisterResult() [^ex0] {id = 2}
^ex0:
return
}
[2, 2, 0, 63, 5, 17, 0, 0, 1, 63, 10, 25, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 63, 21, 1, 0, 63, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 40, 37, 1, 1, 42, 8, 4, 3, 2, 2, 5, 63, 55, 3, 3, 0, 63, 60, 21, 2, 63, 0]
names = [“mul”, “add”]
Memory Allocation
func @matcher(%0 : !Operation) {
^bb0:
CheckArgCount(%0) [^ex0, ^bb1] {count = 2}
^bb1:
SwitchOpName(%0) [^ex0, ^bb2, ^bb3]
{names = ["mul", "add"]}
^bb2:
%1 = GetOperand(%0) {index = 0}
%2 = GetOperand(%0) {index = 1}
EqualTo(%1, %2) [^ex0, ^rr0]
^rr0:
RegisterResult() [^ex0] {id = 0}
^bb3:
%3 = GetOperand(%0) {index = 0}
%4 = GetOperand(%0) {index = 1}
EqualTo(%3, %4) [^bb4, ^rr1]
^rr1:
RegisterResult() [^bb4] {id = 1}
^bb4:
%5 = GetDefiningOp(%4)
CheckArgCount(%5) [^ex0, ^bb5] {count = 2}
^bb5:
CheckOpName(%5) [^ex0, ^rr2] {name = "mul"}
^rr2:
RegisterResult() [^ex0] {id = 2}
^ex0:
return
}
[2, 2, 0, 63, 5, 17, 0, 0, 1, 63, 10, 25, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 63, 21, 1, 0, 63, 6, 0, 0, 1, 6, 0, 1, 2, 16, 1, 2, 40, 37, 1, 1, 42, 8, 4, 3, 2, 2, 5, 63, 55, 3, 3, 0, 63, 60, 21, 2, 63, 0]
names = [“mul”, “add”]
Comparison to LLVM
SelectionDagISel
GlobalISel
MLIR
Merge Barriers
D
C
B
A
C
B
A
B
A
A
10
9
3
1
A
B
C
D
1
3
9
10
true
true
true
true
false
false
false
Merge Barriers
D
C
B
A
C
B
A
B
A
A
10
9
3
1
Y
X
5
X
Y
A
B
C
D
1
3
9
10
true
true
true
true
false
false
false
false
5
true
true
A
B
true
true
false
false
false
Metrics
Estimates*
Pattern Match Runtime
50
Pattern Match Runtime
Current Status
Next Steps
That’s all folks
Questions?