Skip to content

Commit 582784e

Browse files
committed
compiler: Avoid CSE across Reserved keywords
1 parent 5863361 commit 582784e

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

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
@@ -20,10 +20,10 @@
2020
__all__ = ['CondEq', 'CondNe', 'BitwiseNot', 'BitwiseXor', 'IntDiv', # noqa
2121
'CallFromPointer', 'CallFromComposite', 'FieldFromPointer',
2222
'FieldFromComposite', 'ListInitializer', 'Byref', 'IndexedPointer',
23-
'Cast', 'DefFunction', 'MathFunction', 'InlineIf', 'ReservedWord',
24-
'Keyword', 'String', 'Macro', 'Class', 'MacroArgument', 'Deref',
25-
'Namespace', 'Rvalue', 'Null', 'SizeOf', 'rfunc', 'BasicWrapperMixin',
26-
'ValueLimit', 'VectorAccess']
23+
'Cast', 'DefFunction', 'MathFunction', 'InlineIf', 'Reserved',
24+
'ReservedWord', 'Keyword', 'String', 'Macro', 'Class', 'MacroArgument',
25+
'Deref', 'Namespace', 'Rvalue', 'Null', 'SizeOf', 'rfunc',
26+
'BasicWrapperMixin', 'ValueLimit', 'VectorAccess']
2727

2828

2929
class CondEq(sympy.Eq):
@@ -519,7 +519,21 @@ def __str__(self):
519519
__reduce_ex__ = Pickable.__reduce_ex__
520520

521521

522-
class ReservedWord(sympy.Atom, Pickable):
522+
class Reserved(Pickable):
523+
524+
"""
525+
A base class for all reserved words used throughout the lowering process,
526+
including the final stage of code generation itself.
527+
528+
Reserved objects have the following properties:
529+
530+
* `estimate_cost(o) = 0`, where `o` is an instance of Reserved
531+
"""
532+
533+
pass
534+
535+
536+
class ReservedWord(sympy.Atom, Reserved):
523537

524538
"""
525539
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
@@ -9,8 +9,9 @@
99
from devito.finite_differences.differentiable import IndexDerivative
1010
from devito.logger import warning
1111
from devito.symbolics.extended_dtypes import INT
12-
from devito.symbolics.extended_sympy import (CallFromPointer, Cast,
13-
DefFunction, ReservedWord)
12+
from devito.symbolics.extended_sympy import (
13+
CallFromPointer, Cast, DefFunction, Reserved
14+
)
1415
from devito.symbolics.queries import q_routine
1516
from devito.tools import as_tuple, prod
1617
from devito.tools.dtypes_lowering import infer_dtype
@@ -174,7 +175,7 @@ def _(expr, estimate, seen):
174175

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

0 commit comments

Comments
 (0)