Include bound typevars in the instruction predicate.
We already do this for the encoding tables, but the instruction predicates computed by Apply.inst_predicate() did not include them. Make sure we don't duplicate the type check in the Encoding constructor when passed an Apply AST node.
This commit is contained in:
@@ -7,7 +7,7 @@ for patern matching an rewriting of cretonne instructions.
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
from . import instructions
|
from . import instructions
|
||||||
from .typevar import TypeVar
|
from .typevar import TypeVar
|
||||||
from .predicates import IsEqual, And
|
from .predicates import IsEqual, And, TypePredicate
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from typing import Union, Tuple, Sequence, TYPE_CHECKING, Dict, List # noqa
|
from typing import Union, Tuple, Sequence, TYPE_CHECKING, Dict, List # noqa
|
||||||
@@ -367,6 +367,13 @@ class Apply(Expr):
|
|||||||
|
|
||||||
pred = And.combine(pred, IsEqual(ffield, arg))
|
pred = And.combine(pred, IsEqual(ffield, arg))
|
||||||
|
|
||||||
|
# Add checks for any bound type variables.
|
||||||
|
for bound_ty, tv in zip(self.typevars, self.inst.all_typevars()):
|
||||||
|
if bound_ty is None:
|
||||||
|
continue
|
||||||
|
type_chk = TypePredicate.typevar_check(self.inst, tv, bound_ty)
|
||||||
|
pred = And.combine(pred, type_chk)
|
||||||
|
|
||||||
return pred
|
return pred
|
||||||
|
|
||||||
def copy(self, m):
|
def copy(self, m):
|
||||||
|
|||||||
@@ -420,6 +420,16 @@ class Encoding(object):
|
|||||||
else:
|
else:
|
||||||
self.inst, self.typevars = inst.fully_bound()
|
self.inst, self.typevars = inst.fully_bound()
|
||||||
|
|
||||||
|
# Add secondary type variables to the instruction predicate.
|
||||||
|
# This is already included by Apply.inst_predicate() above.
|
||||||
|
if len(self.typevars) > 1:
|
||||||
|
for tv, vt in zip(self.inst.other_typevars, self.typevars[1:]):
|
||||||
|
# A None tv is an 'any' wild card: `ishl.i32.any`.
|
||||||
|
if vt is None:
|
||||||
|
continue
|
||||||
|
typred = TypePredicate.typevar_check(self.inst, tv, vt)
|
||||||
|
instp = And.combine(instp, typred)
|
||||||
|
|
||||||
self.cpumode = cpumode
|
self.cpumode = cpumode
|
||||||
assert self.inst.format == recipe.format, (
|
assert self.inst.format == recipe.format, (
|
||||||
"Format {} must match recipe: {}".format(
|
"Format {} must match recipe: {}".format(
|
||||||
@@ -433,15 +443,6 @@ class Encoding(object):
|
|||||||
self.recipe = recipe
|
self.recipe = recipe
|
||||||
self.encbits = encbits
|
self.encbits = encbits
|
||||||
|
|
||||||
# Add secondary type variables to the instruction predicate.
|
|
||||||
if len(self.typevars) > 1:
|
|
||||||
for tv, vt in zip(self.inst.other_typevars, self.typevars[1:]):
|
|
||||||
# A None tv is an 'any' wild card: `ishl.i32.any`.
|
|
||||||
if vt is None:
|
|
||||||
continue
|
|
||||||
typred = TypePredicate.typevar_check(self.inst, tv, vt)
|
|
||||||
instp = And.combine(instp, typred)
|
|
||||||
|
|
||||||
# Record specific predicates. Note that the recipe also has predicates.
|
# Record specific predicates. Note that the recipe also has predicates.
|
||||||
self.instp = self.cpumode.isa.unique_pred(instp)
|
self.instp = self.cpumode.isa.unique_pred(instp)
|
||||||
self.isap = self.cpumode.isa.unique_pred(isap)
|
self.isap = self.cpumode.isa.unique_pred(isap)
|
||||||
|
|||||||
Reference in New Issue
Block a user