From a7f8c2cee2171881aa4cbd2f2d0964fe8399eb09 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Wed, 21 Jan 2026 12:42:43 +0100 Subject: [PATCH 01/11] Enable tasklet fusion in dataflow optimization --- .../runners/dace/transformations/auto_optimize.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 1d04c21fc3..625c57c919 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -15,6 +15,7 @@ import dace from dace import data as dace_data from dace.sdfg import nodes as dace_nodes, propagation as dace_propagation, utils as dace_sdutils +from dace.transformation import dataflow as dace_dataflow from dace.transformation.auto import auto_optimize as dace_aoptimize from dace.transformation.passes import analysis as dace_analysis @@ -629,6 +630,8 @@ def _gt_auto_process_top_level_maps( validate_all=validate_all, ) + sdfg.apply_transformations_repeated(dace_dataflow.TaskletFusion, validate=True) + # TODO(phimuell): Figuring out if this is is the correct location for doing it. if GT4PyAutoOptHook.TopLevelDataFlowStep in optimization_hooks: optimization_hooks[GT4PyAutoOptHook.TopLevelDataFlowStep](sdfg) # type: ignore[call-arg] From d1cee12ded9aa9e38cfee7eec084b01d8108c886 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Wed, 21 Jan 2026 12:45:23 +0100 Subject: [PATCH 02/11] edit --- .../runners/dace/transformations/auto_optimize.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 625c57c919..9f177b8882 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -630,7 +630,9 @@ def _gt_auto_process_top_level_maps( validate_all=validate_all, ) - sdfg.apply_transformations_repeated(dace_dataflow.TaskletFusion, validate=True) + sdfg.apply_transformations_repeated( + dace_dataflow.TaskletFusion, validate=False, validate_all=validate_all + ) # TODO(phimuell): Figuring out if this is is the correct location for doing it. if GT4PyAutoOptHook.TopLevelDataFlowStep in optimization_hooks: From 19172fda0f3a6eff9554d34d38df74ad9a6ecd6c Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Wed, 21 Jan 2026 17:09:54 +0100 Subject: [PATCH 03/11] edit --- .../runners/dace/transformations/auto_optimize.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 9f177b8882..0cc388e11d 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -630,10 +630,6 @@ def _gt_auto_process_top_level_maps( validate_all=validate_all, ) - sdfg.apply_transformations_repeated( - dace_dataflow.TaskletFusion, validate=False, validate_all=validate_all - ) - # TODO(phimuell): Figuring out if this is is the correct location for doing it. if GT4PyAutoOptHook.TopLevelDataFlowStep in optimization_hooks: optimization_hooks[GT4PyAutoOptHook.TopLevelDataFlowStep](sdfg) # type: ignore[call-arg] @@ -679,6 +675,16 @@ def _gt_auto_process_dataflow_inside_maps( time, so the compiler will fully unroll them anyway. """ + # The SDFG might contain tasklets with no input connectors, which simply write + # a constant value into a scalar node. If these tasklets were moved into the map + # scope, they would require an empty memlet edge from MapEntry, for synchronization. + # Empty memlets are not properly handled in code generation, so it is better + # to avoid this pattern. Running `TaskletFusion` at this stage helps to inline + # these constant-write tasklets into compute-tasklets. + sdfg.apply_transformations_repeated( + dace_dataflow.TaskletFusion, validate=False, validate_all=validate_all + ) + # Constants (tasklets are needed to write them into a variable) should not be # arguments to a kernel but be present inside the body. sdfg.apply_transformations_once_everywhere( From f3896783205c624bcce7419e4e2ea0103a2bc983 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 13:01:28 +0100 Subject: [PATCH 04/11] add IR-pass to inline literals into lambda expressions --- .../iterator/transforms/inline_literal.py | 62 +++++++++++++++++++ .../runners/dace/lowering/gtir_to_sdfg.py | 7 ++- .../transforms_tests/test_inline_literal.py | 21 +++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/gt4py/next/iterator/transforms/inline_literal.py create mode 100644 tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py diff --git a/src/gt4py/next/iterator/transforms/inline_literal.py b/src/gt4py/next/iterator/transforms/inline_literal.py new file mode 100644 index 0000000000..c92f2389aa --- /dev/null +++ b/src/gt4py/next/iterator/transforms/inline_literal.py @@ -0,0 +1,62 @@ +# GT4Py - GridTools Framework +# +# Copyright (c) 2014-2024, ETH Zurich +# All rights reserved. +# +# Please, refer to the LICENSE file in the root directory. +# SPDX-License-Identifier: BSD-3-Clause + +from typing import Mapping + +from gt4py import eve +from gt4py.next.iterator import ir +from gt4py.next.iterator.ir_utils import common_pattern_matcher as cpm, ir_makers as im + + +class ReplaceLiterals(eve.PreserveLocationVisitor, eve.NodeTranslator): + PRESERVED_ANNEX_ATTRS = ("type", "domain") + + def visit_FunCall(self, node: ir.FunCall, *, symbol_map: Mapping[str, ir.Literal]): + node = self.generic_visit(node, symbol_map=symbol_map) + + if cpm.is_call_to(node, "deref"): + assert len(node.args) == 1 + if ( + isinstance(node.args[0], ir.SymRef) + and (symbol_name := str(node.args[0].id)) in symbol_map + ): + return symbol_map[symbol_name] + return node + + +class InlineLiteral(eve.NodeTranslator): + """Inline literal values (constants) into lambda expressions.""" + + PRESERVED_ANNEX_ATTRS = ("domain", "type") + + def visit_FunCall(self, node: ir.FunCall) -> ir.Node: + node = self.generic_visit(node) + + if cpm.is_applied_as_fieldop(node): + assert len(node.fun.args) == 1 and isinstance(node.fun.args[0], ir.Lambda) + lambda_node = node.fun.args[0] + symbol_map = {} + fun_args = [] + lambda_params = [] + for lambda_param, fun_arg in zip(lambda_node.params, node.args, strict=True): + if isinstance(fun_arg, ir.Literal): + symbol_name = str(lambda_param.id) + symbol_map[symbol_name] = fun_arg + else: + fun_args.append(fun_arg) + lambda_params.append(lambda_param) + + if symbol_map: + lambda_expr = ReplaceLiterals().visit(lambda_node.expr, symbol_map=symbol_map) + return im.as_fieldop(im.lambda_(*lambda_params)(lambda_expr))(*fun_args) + + return node + + @classmethod + def apply(cls, node: ir.Node) -> ir.Node: + return cls().visit(node) diff --git a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py index 1d0e20cad9..c5ecf1d517 100644 --- a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py +++ b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py @@ -31,7 +31,11 @@ domain_utils, ir_makers as im, ) -from gt4py.next.iterator.transforms import prune_casts as ir_prune_casts, symbol_ref_utils +from gt4py.next.iterator.transforms import ( + inline_literal, + prune_casts as ir_prune_casts, + symbol_ref_utils, +) from gt4py.next.iterator.type_system import inference as gtir_type_inference from gt4py.next.program_processors.runners.dace import sdfg_args as gtx_dace_args from gt4py.next.program_processors.runners.dace.lowering import ( @@ -1340,6 +1344,7 @@ def build_sdfg_from_gtir( ir = gtir_type_inference.infer(ir, offset_provider_type=offset_provider_type) ir = ir_prune_casts.PruneCasts().visit(ir) + ir = inline_literal.InlineLiteral().visit(ir) # DaCe requires C-compatible strings for the names of data containers, # such as arrays and scalars. GT4Py uses a unicode symbols ('ᐞ') as name diff --git a/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py b/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py new file mode 100644 index 0000000000..4b07fbbd2c --- /dev/null +++ b/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py @@ -0,0 +1,21 @@ +# GT4Py - GridTools Framework +# +# Copyright (c) 2014-2024, ETH Zurich +# All rights reserved. +# +# Please, refer to the LICENSE file in the root directory. +# SPDX-License-Identifier: BSD-3-Clause + +from gt4py import next as gtx +from gt4py.next.iterator.ir_utils import ir_makers as im +from gt4py.next.iterator.transforms import inline_literal +from gt4py.next.type_system import type_specifications as ts + + +def test_inline_literal_fieldop(): + IDim = gtx.Dimension("IDim") + x_ref = im.ref("x", ts.FieldType(dims=[IDim], dtype=ts.ScalarType(kind=ts.ScalarKind.FLOAT32))) + testee = im.op_as_fieldop("plus")(x_ref, 1.0) + expected = im.as_fieldop(im.lambda_("__arg0")(im.plus(im.deref("__arg0"), 1.0)))(x_ref) + actual = inline_literal.InlineLiteral.apply(testee) + assert actual == expected From de23942f6cdaaeea077f0257639baf7f676087c2 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 13:06:02 +0100 Subject: [PATCH 05/11] edit --- src/gt4py/next/iterator/transforms/inline_literal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gt4py/next/iterator/transforms/inline_literal.py b/src/gt4py/next/iterator/transforms/inline_literal.py index c92f2389aa..9014a86cb1 100644 --- a/src/gt4py/next/iterator/transforms/inline_literal.py +++ b/src/gt4py/next/iterator/transforms/inline_literal.py @@ -38,7 +38,7 @@ def visit_FunCall(self, node: ir.FunCall) -> ir.Node: node = self.generic_visit(node) if cpm.is_applied_as_fieldop(node): - assert len(node.fun.args) == 1 and isinstance(node.fun.args[0], ir.Lambda) + assert isinstance(node.fun.args[0], ir.Lambda) lambda_node = node.fun.args[0] symbol_map = {} fun_args = [] From c74794ea9e852159b87661a83d816a5d0ced3b34 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 13:25:52 +0100 Subject: [PATCH 06/11] edit --- src/gt4py/next/iterator/transforms/inline_literal.py | 7 +++---- .../runners/dace/lowering/gtir_to_sdfg.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/gt4py/next/iterator/transforms/inline_literal.py b/src/gt4py/next/iterator/transforms/inline_literal.py index 9014a86cb1..7ad27fa6cf 100644 --- a/src/gt4py/next/iterator/transforms/inline_literal.py +++ b/src/gt4py/next/iterator/transforms/inline_literal.py @@ -30,15 +30,14 @@ def visit_FunCall(self, node: ir.FunCall, *, symbol_map: Mapping[str, ir.Literal class InlineLiteral(eve.NodeTranslator): - """Inline literal values (constants) into lambda expressions.""" + """Inline literal values (constants) into the lambda expression of field operators.""" PRESERVED_ANNEX_ATTRS = ("domain", "type") def visit_FunCall(self, node: ir.FunCall) -> ir.Node: node = self.generic_visit(node) - if cpm.is_applied_as_fieldop(node): - assert isinstance(node.fun.args[0], ir.Lambda) + if cpm.is_applied_as_fieldop(node) and isinstance(node.fun.args[0], ir.Lambda): lambda_node = node.fun.args[0] symbol_map = {} fun_args = [] @@ -53,7 +52,7 @@ def visit_FunCall(self, node: ir.FunCall) -> ir.Node: if symbol_map: lambda_expr = ReplaceLiterals().visit(lambda_node.expr, symbol_map=symbol_map) - return im.as_fieldop(im.lambda_(*lambda_params)(lambda_expr))(*fun_args) + return im.as_fieldop(im.lambda_(*lambda_params)(lambda_expr), node.fun.args[1])(*fun_args) return node diff --git a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py index c5ecf1d517..52cc31018f 100644 --- a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py +++ b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg.py @@ -1342,9 +1342,9 @@ def build_sdfg_from_gtir( if ir.declarations: raise NotImplementedError("Temporaries not supported yet by GTIR DaCe backend.") + ir = inline_literal.InlineLiteral().visit(ir) ir = gtir_type_inference.infer(ir, offset_provider_type=offset_provider_type) ir = ir_prune_casts.PruneCasts().visit(ir) - ir = inline_literal.InlineLiteral().visit(ir) # DaCe requires C-compatible strings for the names of data containers, # such as arrays and scalars. GT4Py uses a unicode symbols ('ᐞ') as name From 74728460e920c932313af7c76afeb52e7a0dc2ab Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 15:41:38 +0100 Subject: [PATCH 07/11] edit --- .../iterator/transforms/inline_literal.py | 42 ++++++++++++++----- .../transforms_tests/test_inline_literal.py | 23 ++++++++++ 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/gt4py/next/iterator/transforms/inline_literal.py b/src/gt4py/next/iterator/transforms/inline_literal.py index 7ad27fa6cf..1a30aeba7f 100644 --- a/src/gt4py/next/iterator/transforms/inline_literal.py +++ b/src/gt4py/next/iterator/transforms/inline_literal.py @@ -17,8 +17,6 @@ class ReplaceLiterals(eve.PreserveLocationVisitor, eve.NodeTranslator): PRESERVED_ANNEX_ATTRS = ("type", "domain") def visit_FunCall(self, node: ir.FunCall, *, symbol_map: Mapping[str, ir.Literal]): - node = self.generic_visit(node, symbol_map=symbol_map) - if cpm.is_call_to(node, "deref"): assert len(node.args) == 1 if ( @@ -26,23 +24,38 @@ def visit_FunCall(self, node: ir.FunCall, *, symbol_map: Mapping[str, ir.Literal and (symbol_name := str(node.args[0].id)) in symbol_map ): return symbol_map[symbol_name] - return node + + return self.generic_visit(node, symbol_map=symbol_map) + + def visit_SymRef(self, node: ir.SymRef, *, symbol_map: Mapping[str, ir.Literal]): + return symbol_map.get(str(node.id), node) class InlineLiteral(eve.NodeTranslator): - """Inline literal values (constants) into the lambda expression of field operators.""" + """Inline literal arguments (constants) of field operators into the lambda expression.""" PRESERVED_ANNEX_ATTRS = ("domain", "type") def visit_FunCall(self, node: ir.FunCall) -> ir.Node: node = self.generic_visit(node) - if cpm.is_applied_as_fieldop(node) and isinstance(node.fun.args[0], ir.Lambda): - lambda_node = node.fun.args[0] - symbol_map = {} - fun_args = [] + if cpm.is_applied_as_fieldop(node): + assert len(node.fun.args) in {1, 2} + lambda_params = [] - for lambda_param, fun_arg in zip(lambda_node.params, node.args, strict=True): + if isinstance(node.fun.args[0], ir.Lambda): + lambda_node = node.fun.args[0] + elif cpm.is_call_to(node.fun.args[0], "scan"): + assert isinstance(node.fun.args[0].args[0], ir.Lambda) + lambda_node = node.fun.args[0].args[0] + lambda_params.append(lambda_node.params[0]) + else: + return node + + fun_args = [] + symbol_map = {} + pstart = len(lambda_params) + for lambda_param, fun_arg in zip(lambda_node.params[pstart:], node.args, strict=True): if isinstance(fun_arg, ir.Literal): symbol_name = str(lambda_param.id) symbol_map[symbol_name] = fun_arg @@ -51,9 +64,16 @@ def visit_FunCall(self, node: ir.FunCall) -> ir.Node: lambda_params.append(lambda_param) if symbol_map: + domain = node.fun.args[1] if len(node.fun.args) == 2 else None lambda_expr = ReplaceLiterals().visit(lambda_node.expr, symbol_map=symbol_map) - return im.as_fieldop(im.lambda_(*lambda_params)(lambda_expr), node.fun.args[1])(*fun_args) - + lambda_node = im.lambda_(*lambda_params)(lambda_expr) + if isinstance(node.fun.args[0], ir.Lambda): + return im.as_fieldop(lambda_node, domain)(*fun_args) + else: + scan_expr = im.scan( + lambda_node, node.fun.args[0].args[1], node.fun.args[0].args[2] + ) + return im.as_fieldop(scan_expr, domain)(*fun_args) return node @classmethod diff --git a/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py b/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py index 4b07fbbd2c..b0da1598e4 100644 --- a/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py +++ b/tests/next_tests/unit_tests/iterator_tests/transforms_tests/test_inline_literal.py @@ -19,3 +19,26 @@ def test_inline_literal_fieldop(): expected = im.as_fieldop(im.lambda_("__arg0")(im.plus(im.deref("__arg0"), 1.0)))(x_ref) actual = inline_literal.InlineLiteral.apply(testee) assert actual == expected + + +def test_inline_literal_scan(): + IDim = gtx.Dimension("IDim") + x_ref = im.ref("x", ts.FieldType(dims=[IDim], dtype=ts.ScalarType(kind=ts.ScalarKind.FLOAT32))) + testee = im.as_fieldop( + im.scan( + im.lambda_("state", "inp", "val")( + im.plus("state", im.multiplies_(im.deref("inp"), "val")) + ), + True, + 0.0, + ) + )(x_ref, 2.0) + expected = im.as_fieldop( + im.scan( + im.lambda_("state", "inp")(im.plus("state", im.multiplies_(im.deref("inp"), 2.0))), + True, + 0.0, + ) + )(x_ref) + actual = inline_literal.InlineLiteral.apply(testee) + assert actual == expected From cfd261a6b5b0441f66be420df589c5edcdf6f6a1 Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 17:16:54 +0100 Subject: [PATCH 08/11] fix lowering of scan --- .../runners/dace/lowering/gtir_to_sdfg_scan.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg_scan.py b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg_scan.py index b8f958f6ab..9fc17d47ac 100644 --- a/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg_scan.py +++ b/src/gt4py/next/program_processors/runners/dace/lowering/gtir_to_sdfg_scan.py @@ -685,6 +685,10 @@ def translate_scan( # for output connections, we create temporary arrays that contain the computation # results of a column slice for each point in the horizontal domain + if isinstance(lambda_output, tuple) and not isinstance(node.annex.domain, tuple): + domain_tree = gtx_utils.tree_map(lambda x: node.annex.domain)(lambda_output) + else: + domain_tree = node.annex.domain output_tree = gtx_utils.tree_map( lambda output_data, output_domain: _handle_dataflow_result_of_nested_sdfg( sdfg_builder=sdfg_builder, @@ -694,9 +698,9 @@ def translate_scan( inner_data=output_data, field_domain=output_domain, ) - )(lambda_output, node.annex.domain) + )(lambda_output, domain_tree) # we call a helper method to create a map scope that will compute the entire field return _create_scan_field_operator( - ctx, field_domain, node.type, sdfg_builder, input_edges, output_tree, node.annex.domain + ctx, field_domain, node.type, sdfg_builder, input_edges, output_tree, domain_tree ) From b455455b78da95842ebb87717358d1d0b705296e Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 17:17:05 +0100 Subject: [PATCH 09/11] edit --- .../runners/dace/transformations/auto_optimize.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 0cc388e11d..899b2ab87c 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -675,12 +675,6 @@ def _gt_auto_process_dataflow_inside_maps( time, so the compiler will fully unroll them anyway. """ - # The SDFG might contain tasklets with no input connectors, which simply write - # a constant value into a scalar node. If these tasklets were moved into the map - # scope, they would require an empty memlet edge from MapEntry, for synchronization. - # Empty memlets are not properly handled in code generation, so it is better - # to avoid this pattern. Running `TaskletFusion` at this stage helps to inline - # these constant-write tasklets into compute-tasklets. sdfg.apply_transformations_repeated( dace_dataflow.TaskletFusion, validate=False, validate_all=validate_all ) From 22e4113cc7dfebbb476575043129418f733e476b Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 17:20:42 +0100 Subject: [PATCH 10/11] undo extra changes --- .../runners/dace/transformations/auto_optimize.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 899b2ab87c..51544bf91c 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -675,10 +675,6 @@ def _gt_auto_process_dataflow_inside_maps( time, so the compiler will fully unroll them anyway. """ - sdfg.apply_transformations_repeated( - dace_dataflow.TaskletFusion, validate=False, validate_all=validate_all - ) - # Constants (tasklets are needed to write them into a variable) should not be # arguments to a kernel but be present inside the body. sdfg.apply_transformations_once_everywhere( From 92bd2ce8c079cc27fe85cd95b9b4fce3e7fc47ff Mon Sep 17 00:00:00 2001 From: Edoardo Paone Date: Thu, 22 Jan 2026 17:33:01 +0100 Subject: [PATCH 11/11] edit --- .../runners/dace/transformations/auto_optimize.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py index 51544bf91c..1d04c21fc3 100644 --- a/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py +++ b/src/gt4py/next/program_processors/runners/dace/transformations/auto_optimize.py @@ -15,7 +15,6 @@ import dace from dace import data as dace_data from dace.sdfg import nodes as dace_nodes, propagation as dace_propagation, utils as dace_sdutils -from dace.transformation import dataflow as dace_dataflow from dace.transformation.auto import auto_optimize as dace_aoptimize from dace.transformation.passes import analysis as dace_analysis