Skip to content

Commit

Permalink
interpreter: (pdl) add an initial version of EqSat PDLMatcher (#3574)
Browse files Browse the repository at this point in the history
This is an initial attempt of adding a PDL matcher for EqSat e-class
ops.

---------

Co-authored-by: Jianyi Cheng <[email protected]>
  • Loading branch information
jianyicheng and Jianyi Cheng authored Dec 5, 2024
1 parent ce85340 commit dd58ef0
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 0 deletions.
51 changes: 51 additions & 0 deletions tests/interpreters/test_eqsat_pdl_interpreter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from xdsl.dialects import eqsat, pdl
from xdsl.dialects.builtin import (
IntegerType,
StringAttr,
)
from xdsl.interpreters.eqsat_pdl import EqsatPDLMatcher


def test_match_type():
matcher = EqsatPDLMatcher()

pdl_op = pdl.TypeOp()
ssa_value = pdl_op.result
ssa_value = eqsat.EClassOp(ssa_value).result
xdsl_value = StringAttr("a")

# New value
assert matcher.match_type(ssa_value, pdl_op, xdsl_value)
assert matcher.matching_context == {ssa_value: xdsl_value}

# Same value
assert matcher.match_type(ssa_value, pdl_op, xdsl_value)
assert matcher.matching_context == {ssa_value: xdsl_value}

# Other value
assert not matcher.match_type(ssa_value, pdl_op, StringAttr("b"))
assert matcher.matching_context == {ssa_value: xdsl_value}


def test_match_fixed_type():
matcher = EqsatPDLMatcher()

pdl_op = pdl.TypeOp(IntegerType(32))
xdsl_value = IntegerType(32)
ssa_value = pdl_op.result
ssa_value = eqsat.EClassOp(ssa_value).result

assert matcher.match_type(ssa_value, pdl_op, xdsl_value)
assert matcher.matching_context == {ssa_value: xdsl_value}


def test_not_match_fixed_type():
matcher = EqsatPDLMatcher()

pdl_op = pdl.TypeOp(IntegerType(64))
xdsl_value = IntegerType(32)
ssa_value = pdl_op.result
ssa_value = eqsat.EClassOp(ssa_value).result

assert not matcher.match_type(ssa_value, pdl_op, xdsl_value)
assert matcher.matching_context == {}
22 changes: 22 additions & 0 deletions xdsl/interpreters/eqsat_pdl.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from __future__ import annotations

from dataclasses import dataclass

from xdsl.dialects import eqsat, pdl
from xdsl.interpreters.pdl import PDLMatcher
from xdsl.ir import SSAValue


@dataclass
class EqsatPDLMatcher(PDLMatcher):
def match_operand(
self, ssa_val: SSAValue, pdl_op: pdl.OperandOp, xdsl_val: SSAValue
):
owner = xdsl_val.owner
assert isinstance(owner, eqsat.EClassOp)
assert (
len(owner.operands) == 1
), "newly converted eqsat always has 1 element in eclass"
arg = owner.operands[0]
res = super().match_operand(ssa_val, pdl_op, arg)
return res

0 comments on commit dd58ef0

Please sign in to comment.