diff --git a/loopy/check.py b/loopy/check.py index 2556bee7b74bb1edcd88ca42fb2bc01567b472c2..8e1709b71ae9e849fae4726b84407f504a082f4d 100644 --- a/loopy/check.py +++ b/loopy/check.py @@ -502,6 +502,29 @@ def check_that_atomic_ops_are_used_exactly_on_atomic_arrays(kernel): # }}} +# {{{ check that temporaries are defined in subkernels where used + +def check_that_temporaries_are_defined_in_subkernels_where_used(kernel): + from loopy.schedule.tools import InstructionQuery + from loopy.kernel.data import temp_var_scope + + insn_query = InstructionQuery(kernel) + + for subkernel in insn_query.subkernels(): + for temporary in ( + insn_query.temporaries_read_in_subkernel(subkernel) - + insn_query.temporaries_written_in_subkernel(subkernel)): + + if kernel.temporary_variables[temporary].scope in ( + temp_var_scope.PRIVATE, temp_var_scope.LOCAL): + from loopy.diagnostic import MissingDefinitionError + raise MissingDefinitionError("temporary variable '%s' gets used in " + "subkernel '%s' without a definition (maybe you forgot to call " + "loopy.save_and_reload_temporaries?)" % (temporary, subkernel)) + +# }}} + + # {{{ check that shapes and strides are arguments def check_that_shapes_and_strides_are_arguments(kernel): @@ -552,6 +575,7 @@ def pre_codegen_checks(kernel): check_for_unused_hw_axes_in_insns(kernel) check_that_atomic_ops_are_used_exactly_on_atomic_arrays(kernel) + check_that_temporaries_are_defined_in_subkernels_where_used(kernel) kernel.target.pre_codegen_check(kernel) check_that_shapes_and_strides_are_arguments(kernel) diff --git a/loopy/diagnostic.py b/loopy/diagnostic.py index 29996d6c78b6fd99e52a750968291d0dd3d7c941..e76279c27e5fab5d01b3039d0e5dcc08c2fa749e 100644 --- a/loopy/diagnostic.py +++ b/loopy/diagnostic.py @@ -95,6 +95,10 @@ class DependencyTypeInferenceFailure(TypeInferenceFailure): class MissingBarrierError(LoopyError): pass + +class MissingDefinitionError(LoopyError): + pass + # }}} diff --git a/test/test_loopy.py b/test/test_loopy.py index af4269047539b800a5fd389f9293f11551c9a291..81fe49cb42ad2dcc3c7dd69e54b758f3278a4517 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1316,6 +1316,22 @@ def test_save_local_multidim_array(ctx_factory, debug=False): save_and_reload_temporaries_test(queue, knl, 1, debug) +def test_missing_temporary_definition_detection(): + knl = lp.make_kernel( + "{ [i]: 0<=i<10 }", + """ + for i + <> t = 1 + ... gbarrier + out[i] = t + end + """, seq_dependencies=True) + + from loopy.diagnostic import MissingDefinitionError + with pytest.raises(MissingDefinitionError): + lp.generate_code_v2(knl) + + def test_global_temporary(ctx_factory): ctx = ctx_factory()