Skip to content

Commit 4e3ac51

Browse files
committed
compiler: Avoid CSE across Reserved keywords
1 parent db47bfc commit 4e3ac51

3 files changed

Lines changed: 25 additions & 9 deletions

File tree

devito/passes/clusters/cse.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from devito.finite_differences.differentiable import IndexDerivative
1414
from devito.ir import Cluster, Scope, cluster_pass
15-
from devito.symbolics import estimate_cost, q_leaf, q_terminal
15+
from devito.symbolics import Reserved, estimate_cost, q_leaf, q_terminal
1616
from devito.symbolics.search import search
1717
from devito.symbolics.manipulation import _uxreplace
1818
from devito.tools import DAG, as_list, as_tuple, frozendict, extract_dtype
@@ -401,6 +401,7 @@ def _(expr):
401401

402402
@_catch.register(Indexed)
403403
@_catch.register(Symbol)
404+
@_catch.register(Reserved)
404405
def _(expr):
405406
"""
406407
Handler for objects preventing CSE to propagate through their arguments.

devito/symbolics/extended_sympy.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
from devito.types.basic import Basic
1919

2020
__all__ = ['CondEq', 'CondNe', 'BitwiseNot', 'BitwiseXor', 'BitwiseAnd', # noqa
21-
'LeftShift', 'RightShift', 'IntDiv', 'CallFromPointer',
21+
'LeftShift', 'RightShift', 'IntDiv', 'CallFromPointer',
2222
'CallFromComposite', 'FieldFromPointer', 'FieldFromComposite',
2323
'ListInitializer', 'Byref', 'IndexedPointer', 'Cast', 'DefFunction',
24-
'MathFunction', 'InlineIf', 'ReservedWord', 'Keyword', 'String',
25-
'Macro', 'Class', 'MacroArgument', 'Deref', 'Namespace', 'Rvalue',
26-
'Null', 'SizeOf', 'rfunc', 'BasicWrapperMixin', 'ValueLimit',
24+
'MathFunction', 'InlineIf', 'Reserved', 'ReservedWord', 'Keyword',
25+
'String', 'Macro', 'Class', 'MacroArgument', 'Deref', 'Namespace',
26+
'Rvalue', 'Null', 'SizeOf', 'rfunc', 'BasicWrapperMixin', 'ValueLimit',
2727
'VectorAccess']
2828

2929

@@ -537,7 +537,21 @@ def __str__(self):
537537
__reduce_ex__ = Pickable.__reduce_ex__
538538

539539

540-
class ReservedWord(sympy.Atom, Pickable):
540+
class Reserved(Pickable):
541+
542+
"""
543+
A base class for all reserved words used throughout the lowering process,
544+
including the final stage of code generation itself.
545+
546+
Reserved objects have the following properties:
547+
548+
* `estimate_cost(o) = 0`, where `o` is an instance of Reserved
549+
"""
550+
551+
pass
552+
553+
554+
class ReservedWord(sympy.Atom, Reserved):
541555

542556
"""
543557
A `ReservedWord` carries a value that has special meaning in the

devito/symbolics/inspection.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
from devito.finite_differences.differentiable import IndexDerivative
1111
from devito.logger import warning
1212
from devito.symbolics.extended_dtypes import INT
13-
from devito.symbolics.extended_sympy import (CallFromPointer, Cast,
14-
DefFunction, ReservedWord)
13+
from devito.symbolics.extended_sympy import (
14+
CallFromPointer, Cast, DefFunction, Reserved
15+
)
1516
from devito.symbolics.queries import q_routine
1617
from devito.tools import as_tuple, prod, is_integer
1718
from devito.tools.dtypes_lowering import infer_dtype
@@ -175,7 +176,7 @@ def _(expr, estimate, seen):
175176

176177
@_estimate_cost.register(ImaginaryUnit)
177178
@_estimate_cost.register(Number)
178-
@_estimate_cost.register(ReservedWord)
179+
@_estimate_cost.register(Reserved)
179180
def _(expr, estimate, seen):
180181
return 0, False
181182

0 commit comments

Comments
 (0)