@@ -361,13 +361,27 @@ def postproc_if_missing_async_support():
361361 support_async = major >= 8
362362
363363 func_name = "tvm_callback_cuda_postproc"
364- prev_postproc = None
365-
366- if not support_async :
367- prev_postproc = tvm .get_global_func (func_name , allow_missing = True )
368-
369- @tvm .register_func (func_name , override = True )
370- def tvm_callback_cuda_postproc (code , _ ):
364+ prev_postproc = tvm .get_global_func (func_name , allow_missing = True )
365+
366+ # Store the generated code prior to the post-processing. This
367+ # way, even though the generated code doesn't compile on platforms
368+ # that do not support async, the comparison against an expected
369+ # output can still be performed. We cannot use
370+ # `mod.get_source()`, as that contains the source after all
371+ # post-processing.
372+ original_code = None
373+
374+ def get_original_code ():
375+ nonlocal original_code
376+ return original_code
377+
378+ @tvm .register_func (func_name , override = True )
379+ def tvm_callback_cuda_postproc (code , _ ):
380+ nonlocal original_code
381+ original_code = code
382+ if support_async :
383+ return code
384+ else :
371385 ret = []
372386 for line in code .split ("\n " ):
373387 ret .append (line )
@@ -377,10 +391,12 @@ def tvm_callback_cuda_postproc(code, _):
377391 ret .append ("}" )
378392 return "" .join (ret )
379393
380- yield
394+ yield get_original_code
381395
382396 # Restore previous postproc func to avoid impacting other tests
383- if prev_postproc is not None :
397+ if prev_postproc is None :
398+ tvm ._ffi .registry .remove_global_func (func_name )
399+ else :
384400 tvm .register_func (func_name , prev_postproc , override = True )
385401
386402
@@ -426,8 +442,8 @@ def simple_compute(
426442
427443 mod = tvm .IRModule .from_expr (simple_compute )
428444 with tvm .transform .PassContext (config = {"tir.use_async_copy" : 1 }):
429- built = tvm .build (mod , target = "cuda" )
430- generated_code = built . imported_modules [ 0 ]. get_source ()
445+ tvm .build (mod , target = "cuda" )
446+ generated_code = postproc_if_missing_async_support ()
431447 assert generated_code == expected_cuda_script
432448
433449
@@ -881,8 +897,8 @@ def complex_compute(
881897
882898 mod = tvm .IRModule .from_expr (complex_compute )
883899 with tvm .transform .PassContext (config = {"tir.use_async_copy" : 1 }):
884- built = tvm .build (mod , target = "cuda" )
885- generated_code = built . imported_modules [ 0 ]. get_source ()
900+ tvm .build (mod , target = "cuda" )
901+ generated_code = postproc_if_missing_async_support ()
886902 # generated_code must contain " setp.ne.b32 p, %0, 0;"
887903 assert "setp.ne.b32" in generated_code
888904
0 commit comments