MeteoSwiss-APN / dawn

Compiler toolchain to enable generation of high-level DSLs for geophysical fluid dynamics models
MIT License
28 stars 30 forks source link

First (write) access to temporary inside conditional bug #1142

Open Stagno opened 3 years ago

Stagno commented 3 years ago

The following Dusk code

from dusk.script import *

@stencil
def temp_access_bug(
    a: Field[K],
    b: Field[Edge],
    d: Field[Edge, K],

) -> None:

    z: Field[Edge, K]

    with domain.upward as k:

        if (a):
            z = b
            d = z

fails with the following error:

Assertion failed: `exprStmt' first access of temp field to be demoted (i.e lifetime.Begin) is not an `ExprStmt`
Function: 'void dawn::demoteTemporaryFieldToLocalVariable(dawn::iir::StencilInstantiation*, dawn::iir::Stencil*, int, const dawn::iir::Stencil::Lifetime&)'
Location: /scratch-shared/meteoswiss/scratch/jenkins/spack-stages/admin-tsa/spack-stage-dawn4py-master-exy4bjidi4cwlilrflvsxs4x5rpwjjdi/spack-src/dawn/src/dawn/Optimizer/TemporaryHandling.cpp:157

Dawn is not able to properly look inside the conditional to figure out that the temporary is written before being read. I encountered the problem when translating mo_velocity_advection_stencil_19 using temporaries. This is the simplest reproducible I could write.

mroethlin commented 3 years ago

The work around to this is to first initialize the field like so:

@stencil
def temp_access_bug(
    a: Field[K],
    b: Field[Edge],
    d: Field[Edge, K],

) -> None:

    z: Field[Edge, K]

    with domain.upward as k:
        z = 0
        if (a):
            z = b
            d = z