This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new f7c5b680f3 [REFACTOR][Python] Align namespace helpers with their 
implementation owners (#20599)
f7c5b680f3 is described below

commit f7c5b680f33207d25dc473ac9f4588fbec1210ce
Author: Tianqi Chen <[email protected]>
AuthorDate: Thu Oct 8 14:36:01 2026 -0400

    [REFACTOR][Python] Align namespace helpers with their implementation owners 
(#20599)
    
    Align primitive constants, script display, device conversion and scalar
    extraction with their IR, Script, Target and Sym owners. Keep reducer
    construction in the S-TIR operator module and expose it through its
    script builder; remove redundant public Python hoisting configuration
    wrappers and flags while retaining native pass options. Let the TIRx
    source-kernel adapter assemble its CUDA options using existing
    lower-layer path APIs.
---
 docs/reference/api/python/script/printer.rst       |  1 +
 python/tvm/__init__.py                             |  3 +-
 python/tvm/backend/cuda/op.py                      |  3 +-
 python/tvm/backend/cuda/ptx/engine.py              |  3 +-
 python/tvm/ir/__init__.py                          |  2 +
 .../{runtime/object_generic.py => ir/_constant.py} | 10 ++--
 python/tvm/ir/_overload_prim_expr.py               |  3 +-
 python/tvm/ir/base.py                              | 24 +++------
 python/tvm/ir/expr.py                              |  5 +-
 python/tvm/ir/module.py                            | 11 ++--
 python/tvm/ir/prim/__init__.py                     |  2 +-
 python/tvm/ir/type.py                              |  4 +-
 python/tvm/relax/expr.py                           |  2 +-
 python/tvm/runtime/__init__.py                     |  8 +--
 python/tvm/runtime/_ffi_node_api.py                | 44 ----------------
 python/tvm/runtime/_tensor.py                      | 24 ---------
 python/tvm/runtime/object_generic.py               | 47 -----------------
 python/tvm/s_tir/op.py                             | 54 +++++++++++++++++++
 python/tvm/s_tir/script/__init__.py                |  3 ++
 python/tvm/s_tir/script/ir_builder/ir.py           |  5 ++
 python/tvm/s_tir/stmt.py                           |  4 +-
 python/tvm/s_tir/transform/__init__.py             |  1 -
 python/tvm/script/__init__.py                      |  4 ++
 python/tvm/script/printer/__init__.py              |  2 +
 python/tvm/script/printer/doc_printer.py           |  2 +-
 .../printer/scriptable.py}                         | 61 +++++++++-------------
 .../{s_tir/transform/__init__.py => sym/utils.py}  | 34 ++++++++++--
 python/tvm/target/__init__.py                      |  2 +-
 python/tvm/target/target.py                        | 23 +++++++-
 python/tvm/te/reduction.py                         |  4 +-
 python/tvm/te/tensor.py                            |  4 +-
 python/tvm/tirx/__init__.py                        |  2 +-
 python/tvm/tirx/expr.py                            |  2 +-
 python/tvm/tirx/function.py                        |  4 +-
 python/tvm/tirx/op/__init__.py                     |  2 +-
 .../tvm/tirx/script/ir_builder/external_kernel.py  | 23 ++++----
 python/tvm/tirx/script/ir_builder/op.py            | 37 -------------
 python/tvm/tirx/script/ir_builder/triton.py        |  2 +-
 python/tvm/tirx/stmt.py                            | 15 +++++-
 python/tvm/tirx/tile_primitive.py                  |  4 +-
 python/tvm/tirx/transform/transform.py             | 60 ---------------------
 python/tvm/topi/utils.py                           | 24 +--------
 src/ir/prim/op.cc                                  |  2 +-
 src/relax/ir/dependent_type.cc                     |  2 +-
 src/script/printer/config.cc                       |  9 ++--
 src/te/script/printer/expr.cc                      |  4 +-
 .../relax/script/test_relax_script_printer.py      |  2 +-
 .../test_s_tir_transform_hoist_expression.py       | 52 +++++++++++++++++-
 tests/python/script/test_script_printer_entry.py   |  2 +-
 tests/python/tirx-base/test_tir_index_map.py       |  3 +-
 tests/python/tirx/codegen/test_ptx_addr.py         |  3 +-
 .../python/tirx/script/test_tirx_script_printer.py |  8 +--
 ...test_tirx_script_printer_invisible_path_info.py |  2 +-
 53 files changed, 289 insertions(+), 374 deletions(-)

diff --git a/docs/reference/api/python/script/printer.rst 
b/docs/reference/api/python/script/printer.rst
index cc16c55c3b..098333de07 100644
--- a/docs/reference/api/python/script/printer.rst
+++ b/docs/reference/api/python/script/printer.rst
@@ -23,3 +23,4 @@ tvm.script.printer
 .. automodule:: tvm.script.printer
    :members:
    :imported-members:
+   :exclude-members: Scriptable
diff --git a/python/tvm/__init__.py b/python/tvm/__init__.py
index 388e2180f3..02bc9e56cd 100644
--- a/python/tvm/__init__.py
+++ b/python/tvm/__init__.py
@@ -31,7 +31,7 @@ from .base import _RUNTIME_ONLY
 
 # tvm.runtime
 from .runtime import Object
-from .runtime._tensor import device, device_from_target, cpu, cuda, opencl, 
vulkan, metal
+from .runtime._tensor import device, cpu, cuda, opencl, vulkan, metal
 from .runtime._tensor import vpi, rocm, ext_dev, hexagon
 from .runtime import DataType, DataTypeCode
 
@@ -57,6 +57,7 @@ from . import backend
 
 # tvm.target
 from . import target
+from .target import device_from_target
 
 # tvm.te
 from . import te
diff --git a/python/tvm/backend/cuda/op.py b/python/tvm/backend/cuda/op.py
index c60f788576..4090f623ca 100644
--- a/python/tvm/backend/cuda/op.py
+++ b/python/tvm/backend/cuda/op.py
@@ -24,10 +24,9 @@ from enum import Enum
 import tvm_ffi
 
 from tvm import tirx
-from tvm.ir import Attrs, Call, Op, StringImm
+from tvm.ir import Attrs, Call, Op, StringImm, const
 from tvm.ir.op import _init_op_api, _make_op_api
 from tvm.ir.type import PointerType, PrimType
-from tvm.runtime import const
 from tvm.tirx.op import bitwise_and, call_intrin, tvm_access_ptr
 from tvm.tirx.operator.intrinsics._common import (
     CP_ASYNC_BULK_CACHE_HINT as _CP_ASYNC_BULK_CACHE_HINT,
diff --git a/python/tvm/backend/cuda/ptx/engine.py 
b/python/tvm/backend/cuda/ptx/engine.py
index 473b5bd20b..f9f15859f6 100644
--- a/python/tvm/backend/cuda/ptx/engine.py
+++ b/python/tvm/backend/cuda/ptx/engine.py
@@ -42,10 +42,9 @@ from tvm_ffi import get_global_func, register_global_func, 
structural_equal
 from tvm.backend.cuda.codegen.registry import register_codegen
 from tvm.backend.cuda.codegen.utils import parse_str
 from tvm.backend.cuda.op import cuda_cvta_generic_to_shared, cuda_func_call
-from tvm.ir import Call, Op, StringImm, TensorLoad
+from tvm.ir import Call, Op, StringImm, TensorLoad, const
 from tvm.ir.op import register_op_attr
 from tvm.ir.type import PointerType, PrimType
-from tvm.runtime import const
 from tvm.tirx.expr import CallEffectKind, IntImm
 from tvm.tirx.op import call_intrin, reinterpret
 
diff --git a/python/tvm/ir/__init__.py b/python/tvm/ir/__init__.py
index 345b294468..6aa8a4ae7a 100644
--- a/python/tvm/ir/__init__.py
+++ b/python/tvm/ir/__init__.py
@@ -19,10 +19,12 @@
 """Common data structures across all IR variants."""
 
 from . import instrument, transform
+from ._constant import const
 from .attrs import Attrs, DictAttrs, make_node
 from .base import (
     EnvFunc,
     Node,
+    Scriptable,
     SourceName,
     Span,
     SequentialSpan,
diff --git a/python/tvm/runtime/object_generic.py b/python/tvm/ir/_constant.py
similarity index 89%
copy from python/tvm/runtime/object_generic.py
copy to python/tvm/ir/_constant.py
index c8cbdf596d..b07413b9a3 100644
--- a/python/tvm/runtime/object_generic.py
+++ b/python/tvm/ir/_constant.py
@@ -14,13 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-# ruff: noqa: F401
-"""Common implementation of object generic related logic"""
+"""Construction of primitive IR constants."""
 
-# pylint: disable=unused-import, invalid-name
-from tvm_ffi import ObjectConvertible
-
-from . import _ffi_node_api
+from . import _ffi_api
 
 
 def _scalar_type_inference(value):
@@ -65,4 +61,4 @@ def const(value, dtype=None, span=None):
     """
     if dtype is None:
         dtype = _scalar_type_inference(value)
-    return _ffi_node_api._const(value, dtype, span)
+    return _ffi_api._const(value, dtype, span)
diff --git a/python/tvm/ir/_overload_prim_expr.py 
b/python/tvm/ir/_overload_prim_expr.py
index 26eaf1332a..12e187df63 100644
--- a/python/tvm/ir/_overload_prim_expr.py
+++ b/python/tvm/ir/_overload_prim_expr.py
@@ -16,7 +16,8 @@
 # under the License.
 """Primitive-expression overloads for shared IR expressions."""
 
-from ..runtime import DataTypeCode, ObjectConvertible, const
+from ..runtime import DataTypeCode, ObjectConvertible
+from ._constant import const
 from .base import Span
 from .expr import Expr, TensorRegion, is_prim_expr
 from .prim import _ffi_api as _prim_ffi_api
diff --git a/python/tvm/ir/base.py b/python/tvm/ir/base.py
index f572b02e37..3cf24e4961 100644
--- a/python/tvm/ir/base.py
+++ b/python/tvm/ir/base.py
@@ -26,19 +26,12 @@ from ..libinfo import __version__
 from . import _ffi_api, json_compact
 
 
-class Node(Object):
-    """Base class of all IR Nodes."""
+class Scriptable:
+    """Marker for display methods installed by the TVMScript owner."""
 
-    def __repr__(self) -> str:
-        from tvm.runtime.script_printer import PrinterConfig, _script
 
-        try:
-            return _script(
-                self,
-                PrinterConfig(extra_config={"ir.comment_imports": True}),
-            )
-        except Exception:
-            return super().__repr__()
+class Node(Object):
+    """Base class of all IR Nodes."""
 
 
 @register_object("ir.SourceMap")
@@ -190,16 +183,13 @@ def assert_structural_equal(lhs, rhs, 
map_free_vars=False):
     """
     first_mismatch = tvm_ffi.get_first_structural_mismatch(lhs, rhs, 
map_free_vars)
     if first_mismatch is not None:
-        from tvm.runtime.script_printer import (  # pylint: 
disable=import-outside-toplevel
-            Scriptable,
-        )
-
         lhs_path, rhs_path = first_mismatch
         # Diagnostics use the same display policy as Object.script(), including
         # dialect selection and commented imports. The unbound method also
         # accepts IR objects that do not inherit the convenience mixin.
-        lhs_script = Scriptable.script(lhs, path_to_underline=[lhs_path])
-        rhs_script = Scriptable.script(rhs, path_to_underline=[rhs_path])
+        script = getattr(Scriptable, "script", None)
+        lhs_script = script(lhs, path_to_underline=[lhs_path]) if script else 
repr(lhs)
+        rhs_script = script(rhs, path_to_underline=[rhs_path]) if script else 
repr(rhs)
         raise ValueError(
             f"StructuralEqual check failed, caused by lhs at {lhs_path}:\n"
             f"{lhs_script}\n"
diff --git a/python/tvm/ir/expr.py b/python/tvm/ir/expr.py
index 3d8f368c2d..e2da21fb75 100644
--- a/python/tvm/ir/expr.py
+++ b/python/tvm/ir/expr.py
@@ -23,9 +23,10 @@ import tvm_ffi
 
 import tvm
 
-from ..runtime import Object, Scriptable, const
+from ..runtime import Object
 from . import _ffi_api, _tensor_expr_overload
-from .base import Node, Span
+from ._constant import const
+from .base import Node, Scriptable, Span
 
 
 def _convert_subscript_index(index):
diff --git a/python/tvm/ir/module.py b/python/tvm/ir/module.py
index fd5ebc59aa..9fec84e03d 100644
--- a/python/tvm/ir/module.py
+++ b/python/tvm/ir/module.py
@@ -18,13 +18,12 @@
 
 import tvm_ffi
 
-import tvm
-from tvm.runtime import Object, Scriptable
+from tvm.runtime import Object
 
 from . import _ffi_api
 from . import expr as _expr
-from .attrs import DictAttrs
-from .base import Node
+from .attrs import DictAttrs, make_node
+from .base import Node, Scriptable
 from .function import BaseFunc
 
 
@@ -55,7 +54,7 @@ class IRModule(Node, Scriptable):
 
         attrs = None if not attrs else attrs
         if attrs is not None:
-            attrs = tvm.ir.make_node("ir.DictAttrs", **attrs)
+            attrs = make_node("ir.DictAttrs", **attrs)
         if global_infos is None:
             global_infos = {}
         self.__init_handle_by_constructor__(
@@ -278,7 +277,7 @@ class IRModule(Node, Scriptable):
         mod : IRModule
             A new copy of the IRModule with the attribute
         """
-        if isinstance(attr_map, tvm.ir.DictAttrs):
+        if isinstance(attr_map, DictAttrs):
             attr_map = attr_map._dict()
 
         return _ffi_api.Module_WithAttrs(self, attr_map)
diff --git a/python/tvm/ir/prim/__init__.py b/python/tvm/ir/prim/__init__.py
index 9cadc68f81..0a6687bb35 100644
--- a/python/tvm/ir/prim/__init__.py
+++ b/python/tvm/ir/prim/__init__.py
@@ -17,7 +17,7 @@
 # pylint: disable=unused-import
 """Primitive expressions and construction helpers shared by TVM IR dialects."""
 
-from ...runtime import const
+from .._constant import const
 from ..expr import Expr
 from . import _ffi_api
 from .expr import (
diff --git a/python/tvm/ir/type.py b/python/tvm/ir/type.py
index dfaf28623e..2d67c0ade2 100644
--- a/python/tvm/ir/type.py
+++ b/python/tvm/ir/type.py
@@ -18,10 +18,8 @@
 
 import tvm_ffi
 
-from tvm.runtime import Scriptable
-
 from . import _ffi_api
-from .base import Node
+from .base import Node, Scriptable
 
 
 @tvm_ffi.register_object("ir.Type")
diff --git a/python/tvm/relax/expr.py b/python/tvm/relax/expr.py
index 245053ef59..0795d06a49 100644
--- a/python/tvm/relax/expr.py
+++ b/python/tvm/relax/expr.py
@@ -30,10 +30,10 @@ import tvm.ir
 import tvm.relax
 import tvm.runtime
 from tvm import DataType
+from tvm.ir import Scriptable
 
 from ..ir import BaseFunc, Node, Span
 from ..ir.expr import _CallableExprWithOp
-from ..runtime import Scriptable
 from . import _ffi_api
 
 # It is a workaround for mypy: 
https://github.com/python/mypy/issues/7866#issuecomment-549454370
diff --git a/python/tvm/runtime/__init__.py b/python/tvm/runtime/__init__.py
index 56b904a519..7b950012e4 100644
--- a/python/tvm/runtime/__init__.py
+++ b/python/tvm/runtime/__init__.py
@@ -20,12 +20,7 @@
 from tvm_ffi import convert, Object
 from tvm_ffi._dtype import dtype as DataType, DataTypeCode
 
-# Import _ffi_node_api for its side effect of installing AsRepr as
-# tvm_ffi.core.__object_repr__.
-from . import _ffi_node_api
-
 # class exposures
-from .script_printer import Scriptable
 from .object_generic import ObjectConvertible
 from .device import Device
 from ._tensor import Tensor, tensor, empty
@@ -33,10 +28,9 @@ from .module import Module
 from .executable import Executable
 
 # function exposures
-from ._tensor import device, device_from_target, cpu, cuda, opencl, vulkan, 
metal
+from ._tensor import device, cpu, cuda, opencl, vulkan, metal
 from ._tensor import vpi, rocm, ext_dev, from_dlpack
 from .module import load_module, enabled, system_lib, load_static_library, 
num_threads
-from .object_generic import const
 from .params import (
     save_param_dict,
     load_param_dict,
diff --git a/python/tvm/runtime/_ffi_node_api.py 
b/python/tvm/runtime/_ffi_node_api.py
deleted file mode 100644
index 1c87b989b6..0000000000
--- a/python/tvm/runtime/_ffi_node_api.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# pylint: disable=invalid-name, unused-argument
-"""FFI for tvm.node"""
-
-import tvm_ffi
-import tvm_ffi.core
-
-
-# The implementations below are default ones when the corresponding
-# functions are not available in the runtime only mode.
-# They will be overriden via tvm_ffi.init_ffi_api to the ones registered
-def AsRepr(obj):
-    return type(obj).__name__ + "(" + obj.__ctypes_handle__().value + ")"
-
-
-def SaveJSON(obj):
-    raise RuntimeError("Do not support object serialization in runtime only 
mode")
-
-
-def LoadJSON(json_str):
-    raise RuntimeError("Do not support object serialization in runtime only 
mode")
-
-
-# Exports functions registered in node namespace.
-tvm_ffi.init_ffi_api("node", __name__)
-
-# Override the default repr function for tvm_ffi.core.Object.
-tvm_ffi.core.__object_repr__ = AsRepr
diff --git a/python/tvm/runtime/_tensor.py b/python/tvm/runtime/_tensor.py
index b53d88250e..58c5e60969 100644
--- a/python/tvm/runtime/_tensor.py
+++ b/python/tvm/runtime/_tensor.py
@@ -32,7 +32,6 @@ except ImportError:
 import tvm_ffi
 from tvm_ffi import DLDeviceType, device
 
-import tvm
 from tvm.runtime import Device
 
 from . import _ffi_api
@@ -359,29 +358,6 @@ def tensor(arr, device=None, mem_scope=None):
     return empty(arr.shape, arr.dtype, device, mem_scope).copyfrom(arr)
 
 
-def device_from_target(target, index=None):
-    """Construct a runtime device from a compilation target.
-
-    Parameters
-    ----------
-    target : str or dict or tvm.target.Target
-        The compilation target whose device type should be used.
-
-    index : int, optional
-        The integer device index.
-
-    Returns
-    -------
-    dev : Device
-        The created device.
-    """
-    from tvm.target import Target  # pylint: disable=import-outside-toplevel
-
-    if not isinstance(target, Target):
-        target = Target(target)
-    return device(target.get_target_device_type(), index)
-
-
 def cpu(dev_id=0):
     """Construct a CPU device
 
diff --git a/python/tvm/runtime/object_generic.py 
b/python/tvm/runtime/object_generic.py
index c8cbdf596d..14f54dc82d 100644
--- a/python/tvm/runtime/object_generic.py
+++ b/python/tvm/runtime/object_generic.py
@@ -19,50 +19,3 @@
 
 # pylint: disable=unused-import, invalid-name
 from tvm_ffi import ObjectConvertible
-
-from . import _ffi_node_api
-
-
-def _scalar_type_inference(value):
-    if hasattr(value, "dtype"):
-        return str(value.dtype)
-    elif isinstance(value, bool):
-        return "bool"
-    elif isinstance(value, float):
-        # We intentionally prefer convert the float to float32 since it's more 
common in DL.
-        if -3.40282347e38 <= value <= 3.40282347e38:
-            return "float32"
-        else:
-            return "float64"
-    elif isinstance(value, int):
-        # We intentionally prefer convert the python int to int32 since it's 
more common in DL.
-        if -2147483648 <= value <= 2147483647:
-            return "int32"
-        else:
-            return "int64"
-    else:
-        raise NotImplementedError(f"Cannot automatically inference the type. 
value={value}")
-
-
-def const(value, dtype=None, span=None):
-    """construct a constant
-
-    Parameters
-    ----------
-    value : number
-        The content of the constant number.
-
-    dtype : str or None, optional
-        The data type.
-
-    span : Optional[Span]
-        The location of the constant value in the source.
-
-    Returns
-    -------
-    const_val: tvm.Expr
-        The result expression.
-    """
-    if dtype is None:
-        dtype = _scalar_type_inference(value)
-    return _ffi_node_api._const(value, dtype, span)
diff --git a/python/tvm/s_tir/op.py b/python/tvm/s_tir/op.py
new file mode 100644
index 0000000000..2760558d65
--- /dev/null
+++ b/python/tvm/s_tir/op.py
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""S-TIR operator construction helpers."""
+
+import inspect
+from collections.abc import Callable
+
+from tvm.te import CommReducer
+from tvm.tirx import Expr, Var
+
+
+def comm_reducer(combiner: Callable, identity: list[Expr]) -> CommReducer:
+    """
+    Create a CommReducer from lambda inputs/outputs and the identities
+
+    Parameters
+    ----------
+    combiner : Callable
+        A binary function which takes two Expr as input to return a Expr.
+
+    identity : List[Expr]
+        A list of types of output Expr.
+
+    Returns
+    -------
+    res : CommReducer
+        The CommReducer.
+    """
+    params = inspect.signature(combiner).parameters
+    num_args = len(params)
+    args = []
+    for name, i in zip(params.keys(), identity + identity):
+        if isinstance(i, int):
+            args.append(Var(name, "int32"))
+        else:
+            args.append(Var(name, i.ty))
+    res = combiner(*args)
+    if not isinstance(res, tuple):
+        res = (res,)
+    return CommReducer(args[: num_args // 2], args[num_args // 2 :], res, 
identity)
diff --git a/python/tvm/s_tir/script/__init__.py 
b/python/tvm/s_tir/script/__init__.py
index c7d43fdf76..dd0bc97707 100644
--- a/python/tvm/s_tir/script/__init__.py
+++ b/python/tvm/s_tir/script/__init__.py
@@ -41,6 +41,9 @@ def _initialize():
             if name not in ("builder", "ir_builder", "jit")
         )
         for name in (
+            "CommReducer",
+            "Reduce",
+            "comm_reducer",
             "async_copy_scope",
             "async_commit",
             "async_wait",
diff --git a/python/tvm/s_tir/script/ir_builder/ir.py 
b/python/tvm/s_tir/script/ir_builder/ir.py
index f3e701d209..8c3a39d3a0 100644
--- a/python/tvm/s_tir/script/ir_builder/ir.py
+++ b/python/tvm/s_tir/script/ir_builder/ir.py
@@ -25,8 +25,10 @@ from tvm import ir
 from tvm import tirx as tir
 from tvm.ir import TensorLoad, TensorRegion, is_prim_expr
 from tvm.s_tir.iter_var import IterVar
+from tvm.s_tir.op import comm_reducer
 from tvm.script.ir_builder.base import MISSING
 from tvm.script.parser.protocol_registry import register_mutable_decl as 
_register_mutable_decl
+from tvm.te import CommReducer, Reduce
 from tvm.tirx import Expr, IntImm, Var
 from tvm.tirx.layout import Layout
 from tvm.tirx.script.ir_builder.ir import _get_layout, _record_meta_resource
@@ -476,12 +478,15 @@ class axis:  # pylint: disable=invalid-name
 
 
 __all__ = [
+    "CommReducer",
     "IterVar",
+    "Reduce",
     "async_commit",
     "async_copy_scope",
     "async_wait",
     "axis",
     "block_name_suffix_context",
+    "comm_reducer",
     "iter_var",
     "manual_sync",
     "match_buffer",
diff --git a/python/tvm/s_tir/stmt.py b/python/tvm/s_tir/stmt.py
index 9d61e76988..8ff0317d5f 100644
--- a/python/tvm/s_tir/stmt.py
+++ b/python/tvm/s_tir/stmt.py
@@ -20,8 +20,8 @@ from collections.abc import Mapping, Sequence
 
 import tvm_ffi
 
-from tvm.ir import Expr, Span, TensorRegion, Var
-from tvm.runtime import Object, Scriptable, const
+from tvm.ir import Expr, Scriptable, Span, TensorRegion, Var, const
+from tvm.runtime import Object
 from tvm.s_tir import IterVar
 from tvm.tirx.stmt import SeqStmt, Stmt
 
diff --git a/python/tvm/s_tir/transform/__init__.py 
b/python/tvm/s_tir/transform/__init__.py
index 19bc7281f4..1a195b3fcb 100644
--- a/python/tvm/s_tir/transform/__init__.py
+++ b/python/tvm/s_tir/transform/__init__.py
@@ -19,4 +19,3 @@
 # pylint: disable=wildcard-import, invalid-name
 
 from .transform import *
-from ...tirx.transform.transform import HoistedConditionals, HoistedLetBindings
diff --git a/python/tvm/script/__init__.py b/python/tvm/script/__init__.py
index a4d9da860c..cfab7ab503 100644
--- a/python/tvm/script/__init__.py
+++ b/python/tvm/script/__init__.py
@@ -248,3 +248,7 @@ def __getattr__(name: str) -> Any:
 from .parser import register_namespace as _register_namespace
 
 _register_namespace("script", sys.modules[__name__])
+
+
+# Install the Script-owned display methods after the shared IR types exist.
+from . import printer
diff --git a/python/tvm/script/printer/__init__.py 
b/python/tvm/script/printer/__init__.py
index 8d2f73bb2b..77af75e0f0 100644
--- a/python/tvm/script/printer/__init__.py
+++ b/python/tvm/script/printer/__init__.py
@@ -19,3 +19,5 @@ TVMScript Unified Printer
 This package provides a set of APIs to print supported TVM IR into TVMScript
 in a roundtrippable way.
 """
+
+from .scriptable import PrinterConfig, Scriptable
diff --git a/python/tvm/script/printer/doc_printer.py 
b/python/tvm/script/printer/doc_printer.py
index 42216a2c18..76e18d26f1 100644
--- a/python/tvm/script/printer/doc_printer.py
+++ b/python/tvm/script/printer/doc_printer.py
@@ -18,7 +18,7 @@
 
 from tvm_ffi.access_path import AccessPath
 
-from tvm.runtime.script_printer import PrinterConfig
+from tvm.script.printer.scriptable import PrinterConfig
 
 from . import _ffi_api
 from .doc import Doc
diff --git a/python/tvm/runtime/script_printer.py 
b/python/tvm/script/printer/scriptable.py
similarity index 88%
rename from python/tvm/runtime/script_printer.py
rename to python/tvm/script/printer/scriptable.py
index d50fe142dd..0199ca4c8d 100644
--- a/python/tvm/runtime/script_printer.py
+++ b/python/tvm/script/printer/scriptable.py
@@ -19,12 +19,13 @@
 import os
 from collections.abc import Sequence
 
-from tvm_ffi import get_global_func, register_object
+from tvm_ffi import register_object
 from tvm_ffi.access_path import AccessPath
 
+from tvm.ir.base import Node, Scriptable
 from tvm.runtime import Object
 
-from . import _ffi_node_api
+from . import _ffi_api
 
 
 @register_object("script.PrinterConfig")
@@ -102,21 +103,20 @@ class PrinterConfig(Object):
         if extra_config is not None:
             cfg["extra_config"] = extra_config
         self.__init_handle_by_constructor__(
-            _ffi_node_api.PrinterConfig,
+            _ffi_api.PrinterConfig,
             cfg,  # type: ignore # pylint: disable=no-member
         )
 
 
 def _script(obj: Object, config: PrinterConfig) -> str:
-    return _ffi_node_api.TVMScriptPrinterScript(obj, config)  # type: ignore # 
pylint: disable=no-member
+    return _ffi_api.Script(obj, config)  # type: ignore # pylint: 
disable=no-member
 
 
 def _relax_script(obj: Object, config: PrinterConfig) -> str:
-    func = get_global_func("script.printer.ReprPrintRelax")
-    return func(obj, config)
+    return _ffi_api.ReprPrintRelax(obj, config)
 
 
-class Scriptable:
+class _ScriptableMethods:
     """A base class that enables the script() and show() method."""
 
     def script(
@@ -186,10 +186,6 @@ class Scriptable:
             The TVM Script of the given TVM IR
 
         """
-        # Auto-switch to tirx (`T`/`tirx`) flavor only when explicitly
-        # printing a Function / IRModule that has no s_tir-tagged content.
-        # Free objects (Buffer, buffer-backed TensorRegion, ...) keep the 
default `T`/`tir`
-        # flavor -- they have no enclosing function to indicate tirx vs s_tir.
         merged_extra: dict = {}
         if extra_config is not None:
             merged_extra.update(extra_config)
@@ -197,32 +193,6 @@ class Scriptable:
         # retain executable imports for standalone parser round-trips.
         merged_extra.setdefault("ir.comment_imports", True)
 
-        # Only auto-switch if the caller has not already set a tirx.prefix 
override.
-        if "tirx.prefix" not in merged_extra:
-            from tvm.ir import IRModule  # pylint: 
disable=import-outside-toplevel
-            from tvm.tirx import Function  # pylint: 
disable=import-outside-toplevel
-
-            switch_to_tirx = False
-            if isinstance(self, Function):
-                attrs = getattr(self, "attrs", None)
-                if attrs is None or not attrs.get("s_tir", False):
-                    switch_to_tirx = True
-            elif isinstance(self, IRModule):
-                any_prim = False
-                any_s_tir = False
-                for _, base_func in self.functions.items():
-                    if isinstance(base_func, Function):
-                        any_prim = True
-                        if getattr(base_func, "attrs", None) and 
base_func.attrs.get(
-                            "s_tir", False
-                        ):
-                            any_s_tir = True
-                            break
-                if any_prim and not any_s_tir:
-                    switch_to_tirx = True
-            if switch_to_tirx:
-                merged_extra["tirx.prefix"] = "T"
-
         return _script(
             self,
             PrinterConfig(
@@ -399,3 +369,20 @@ class Scriptable:
             style=style,
             black_format=black_format,
         )
+
+
+def _repr(self) -> str:
+    try:
+        return _script(
+            self,
+            PrinterConfig(extra_config={"ir.comment_imports": True}),
+        )
+    except Exception:
+        return Object.__repr__(self)
+
+
+# The printer supplies its explicit display capability to existing IR wrappers.
+Scriptable.script = _ScriptableMethods.script
+Scriptable.show = _ScriptableMethods.show
+Scriptable._relax_script = _ScriptableMethods._relax_script
+Node.__repr__ = _repr
diff --git a/python/tvm/s_tir/transform/__init__.py b/python/tvm/sym/utils.py
similarity index 53%
copy from python/tvm/s_tir/transform/__init__.py
copy to python/tvm/sym/utils.py
index 19bc7281f4..02d4fbc833 100644
--- a/python/tvm/s_tir/transform/__init__.py
+++ b/python/tvm/sym/utils.py
@@ -1,4 +1,3 @@
-# isort: skip_file
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,8 +14,33 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""Namespace of all S-TIR transformations"""
-# pylint: disable=wildcard-import, invalid-name
+"""Utilities for extracting values from symbolic expressions."""
 
-from .transform import *
-from ...tirx.transform.transform import HoistedConditionals, HoistedLetBindings
+from numbers import Integral
+
+from tvm.ir.prim import IntImm
+
+from .analyzer import Analyzer
+
+
+def get_const_int(expr):
+    """Verifies expr is integer and get the constant value.
+
+    Parameters
+    ----------
+    expr : tvm.Expr or int
+        The input expression.
+
+    Returns
+    -------
+    out_value : int
+        The output.
+    """
+    if isinstance(expr, Integral):
+        return expr
+    if not isinstance(expr, IntImm):
+        ana = Analyzer()
+        expr = ana.simplify(expr)
+    if not isinstance(expr, IntImm):
+        raise ValueError("Expect value to be constant int")
+    return int(expr.value)
diff --git a/python/tvm/target/__init__.py b/python/tvm/target/__init__.py
index 20e26bccf3..efe4ddacc2 100644
--- a/python/tvm/target/__init__.py
+++ b/python/tvm/target/__init__.py
@@ -31,7 +31,7 @@ Use :py:func:`tvm.target.list_tags` to list all available 
target tags,
 and :py:func:`tvm.target.register_tag` to register new tags.
 """
 
-from .target import Target, TargetKind
+from .target import Target, TargetKind, device_from_target
 from .tag import list_tags, register_tag
 from . import codegen
 from . import tag_registry  # registers tags on import
diff --git a/python/tvm/target/target.py b/python/tvm/target/target.py
index 0ecfd1d34c..80bf739064 100644
--- a/python/tvm/target/target.py
+++ b/python/tvm/target/target.py
@@ -20,7 +20,7 @@ import tvm_ffi
 from tvm_ffi import Map
 from tvm_ffi.core import String
 
-from tvm.runtime import Device, Object, convert
+from tvm.runtime import Device, Object, convert, device
 
 from . import _ffi_api
 
@@ -227,3 +227,24 @@ class Target(Object):
         if target is None:
             raise ValueError("Target is not set in env or passed as argument.")
         return target
+
+
+def device_from_target(target, index=None):
+    """Construct a runtime device from a compilation target.
+
+    Parameters
+    ----------
+    target : str or dict or tvm.target.Target
+        The compilation target whose device type should be used.
+
+    index : int, optional
+        The integer device index.
+
+    Returns
+    -------
+    dev : Device
+        The created device.
+    """
+    if not isinstance(target, Target):
+        target = Target(target)
+    return device(target.get_target_device_type(), index)
diff --git a/python/tvm/te/reduction.py b/python/tvm/te/reduction.py
index 12a47c670d..687336b639 100644
--- a/python/tvm/te/reduction.py
+++ b/python/tvm/te/reduction.py
@@ -25,11 +25,11 @@ from tvm_ffi import Array
 import tvm
 from tvm import ir
 from tvm import tirx as tir
-from tvm.ir import Expr, Var
+from tvm.ir import Expr, Scriptable, Var, const
 from tvm.ir.base import Span
 from tvm.ir.prim import _ffi_api as _prim_ffi_api
 from tvm.ir.prim import max_value, min_value
-from tvm.runtime import Object, Scriptable, const
+from tvm.runtime import Object
 from tvm.tirx.op import _primexpr_dtype
 
 from . import _ffi_api
diff --git a/python/tvm/te/tensor.py b/python/tvm/te/tensor.py
index 34c42a3e07..cbd9e90e8e 100644
--- a/python/tvm/te/tensor.py
+++ b/python/tvm/te/tensor.py
@@ -19,8 +19,8 @@
 # pylint: disable=invalid-name
 import tvm_ffi
 
-from tvm.ir import OpaqueExpr, is_prim_expr
-from tvm.runtime import Object, ObjectConvertible, const
+from tvm.ir import OpaqueExpr, const, is_prim_expr
+from tvm.runtime import Object, ObjectConvertible
 from tvm.tirx import expr as _expr
 from tvm.tirx.stmt import SeqStmt
 
diff --git a/python/tvm/tirx/__init__.py b/python/tvm/tirx/__init__.py
index f69f0e9886..6014781758 100644
--- a/python/tvm/tirx/__init__.py
+++ b/python/tvm/tirx/__init__.py
@@ -24,7 +24,7 @@ tvm.script.register_dialect("tirx", "tvm.tirx.script", 
builder_path="tvm.tirx.sc
 
 
 from tvm.ir import Expr
-from tvm.runtime import const
+from tvm.ir import const
 
 from .buffer import (
     BufferAccessKind,
diff --git a/python/tvm/tirx/expr.py b/python/tvm/tirx/expr.py
index f1c9b28616..efb24e4250 100644
--- a/python/tvm/tirx/expr.py
+++ b/python/tvm/tirx/expr.py
@@ -30,6 +30,7 @@ For example, you can use addexp.a to get the left operand of 
an Add node.
 
 from tvm import ir
 from tvm.ir import Expr
+from tvm.ir import const as const
 from tvm.ir._overload_prim_expr import (  # noqa: F401
     EqualOp,
     ExprOp,
@@ -78,7 +79,6 @@ from tvm.ir.prim.expr import (  # noqa: F401
     Sub,
 )
 from tvm.runtime import ObjectConvertible
-from tvm.runtime import const as const
 
 from . import _ffi_api
 
diff --git a/python/tvm/tirx/function.py b/python/tvm/tirx/function.py
index d5db3c9a3b..5761a85fcc 100644
--- a/python/tvm/tirx/function.py
+++ b/python/tvm/tirx/function.py
@@ -26,8 +26,8 @@ import tvm_ffi
 
 import tvm
 import tvm.runtime
-from tvm.ir import BaseFunc, Range, Var
-from tvm.runtime import Object, Scriptable
+from tvm.ir import BaseFunc, Range, Scriptable, Var
+from tvm.runtime import Object
 
 from ..runtime._tensor import Tensor
 from . import _ffi_api
diff --git a/python/tvm/tirx/op/__init__.py b/python/tvm/tirx/op/__init__.py
index f31082fdb3..264247fabf 100644
--- a/python/tvm/tirx/op/__init__.py
+++ b/python/tvm/tirx/op/__init__.py
@@ -37,6 +37,7 @@ from tvm.ir import (
     TensorLoad,
     TensorRegion,
     Var,
+    const,
 )
 from tvm.ir.base import Span
 from tvm.ir.prim import clz as clz
@@ -65,7 +66,6 @@ from tvm.ir.prim.op import shift_right as shift_right
 from tvm.ir.prim.op import truncdiv as truncdiv
 from tvm.ir.prim.op import truncmod as truncmod
 from tvm.ir.prim.op import vscale as vscale
-from tvm.runtime import const
 
 from .. import _ffi_api
 from ..buffer import buffer_data, is_tensor_var
diff --git a/python/tvm/tirx/script/ir_builder/external_kernel.py 
b/python/tvm/tirx/script/ir_builder/external_kernel.py
index fe07b346dc..3b4abbe7a9 100644
--- a/python/tvm/tirx/script/ir_builder/external_kernel.py
+++ b/python/tvm/tirx/script/ir_builder/external_kernel.py
@@ -27,9 +27,9 @@ from typing import Any
 import tvm_ffi
 
 from tvm import __version__ as tvm_version
-from tvm import tirx
-from tvm.ir import Expr, PointerType, is_prim_expr
-from tvm.runtime import Module, const
+from tvm import libinfo, tirx
+from tvm.ir import Expr, PointerType, const, is_prim_expr
+from tvm.runtime import Module
 from tvm.support import nvcc
 
 
@@ -121,10 +121,6 @@ class SourceKernel(BaseKernel):  # pylint: 
disable=too-few-public-methods
         **kwargs: dict[str, Any],
     ) -> tuple[str, Module, list[Any]]:
         """Compile the kernel to a device module."""
-        from tvm.relax.frontend.nn import (  # pylint: 
disable=import-outside-toplevel
-            SourceModule,
-        )
-
         kernel_name = kwargs["kernel_name"]
         assert len(grid) == 2, (
             "grid should be two list of integers, representing the dimension 
of "
@@ -147,8 +143,17 @@ class SourceKernel(BaseKernel):  # pylint: 
disable=too-few-public-methods
                 kernel_arg_types.append(str(arg.ty.dtype))
         runtime_args = runtime_args + list(grid[0]) + list(grid[1])
 
-        # Reuse compilation path from SourceModule
-        compile_options = SourceModule.get_compile_options("cu")
+        include_paths = [
+            Path(libinfo.find_include_path()),
+            Path(tvm_ffi.libinfo.find_include_path()),
+            Path(tvm_ffi.libinfo.find_dlpack_include_path()),
+        ]
+        compile_options = []
+        for include_path in dict.fromkeys(include_paths):
+            assert include_path.exists(), f"Not found: {include_path!s}"
+            assert include_path.is_dir(), f"Not a directory: {include_path!s}"
+            compile_options += ["-I", str(include_path)]
+        compile_options += ["-c", "-O3", "-std=c++17", "-Xcompiler=-fPIC"]
         source_code = self.source_code
         try:
             source_path = Path(source_code)
diff --git a/python/tvm/tirx/script/ir_builder/op.py 
b/python/tvm/tirx/script/ir_builder/op.py
index 423aa1849c..3116446031 100644
--- a/python/tvm/tirx/script/ir_builder/op.py
+++ b/python/tvm/tirx/script/ir_builder/op.py
@@ -19,8 +19,6 @@
 from __future__ import annotations
 
 import functools
-import inspect
-from collections.abc import Callable
 from typing import Any
 
 import tvm_ffi as _ffi
@@ -40,7 +38,6 @@ from tvm.script.ir_builder.frame import IRModuleFrame
 
 # pylint: disable=unused-import
 from tvm.target.codegen import llvm_lookup_intrinsic_id
-from tvm.te import CommReducer, Reduce
 from tvm.tirx import Expr, is_tensor_var
 from tvm.tirx import op as _tir_op
 from tvm.tirx.exec_scope import Var
@@ -154,37 +151,6 @@ def max(a: Expr, b: Expr) -> Expr:  # pylint: 
disable=redefined-builtin
     return _ffi_api.max(a, b)  # type: ignore[attr-defined] # pylint: 
disable=no-member
 
 
-def comm_reducer(combiner: Callable, identity: list[Expr]) -> CommReducer:
-    """
-    Create a CommReducer from lambda inputs/outputs and the identities
-
-    Parameters
-    ----------
-    combiner : Callable
-        A binary function which takes two Expr as input to return a Expr.
-
-    identity : List[Expr]
-        A list of types of output Expr.
-
-    Returns
-    -------
-    res : CommReducer
-        The CommReducer.
-    """
-    params = inspect.signature(combiner).parameters
-    num_args = len(params)
-    args = []
-    for name, i in zip(params.keys(), identity + identity):
-        if isinstance(i, int):
-            args.append(Var(name, "int32"))
-        else:
-            args.append(Var(name, i.ty))
-    res = combiner(*args)
-    if not isinstance(res, tuple):
-        res = (res,)
-    return CommReducer(args[: num_args // 2], args[num_args // 2 :], res, 
identity)
-
-
 def _llvm_result_type(func):
     """Keep symbolic intrinsic-name conversion when spelling the result as 
ty."""
 
@@ -806,7 +772,6 @@ __all__ = [
     "CallEffectKind",
     "CallFFIKernelAttr",
     "Cast",
-    "CommReducer",
     "Div",
     "FloorDiv",
     "FloorMod",
@@ -820,7 +785,6 @@ __all__ = [
     "Or",
     "RShift",
     "Ramp",
-    "Reduce",
     "Select",
     "Shuffle",
     "Sub",
@@ -858,7 +822,6 @@ __all__ = [
     "ceil",
     "ceildiv",
     "clz",
-    "comm_reducer",
     "cooperative_tensor_fill",
     "cooperative_tensor_load",
     "cooperative_tensor_multiply_accumulate",
diff --git a/python/tvm/tirx/script/ir_builder/triton.py 
b/python/tvm/tirx/script/ir_builder/triton.py
index f10c8d27dc..f18e2dca0b 100644
--- a/python/tvm/tirx/script/ir_builder/triton.py
+++ b/python/tvm/tirx/script/ir_builder/triton.py
@@ -26,7 +26,7 @@ from triton.runtime.jit import type_canonicalisation_dict
 from tvm import tirx
 from tvm.ir import PointerType, PrimType, is_prim_expr
 from tvm.runtime import Module
-from tvm.topi.utils import get_const_int
+from tvm.sym.utils import get_const_int
 
 from .external_kernel import BaseKernel
 
diff --git a/python/tvm/tirx/stmt.py b/python/tvm/tirx/stmt.py
index 9026d76411..1cdef7cbec 100644
--- a/python/tvm/tirx/stmt.py
+++ b/python/tvm/tirx/stmt.py
@@ -33,8 +33,19 @@ from typing import Any
 
 import tvm_ffi
 
-from tvm.ir import DictAttrs, Expr, Op, Range, Span, StringImm, TensorRegion, 
Var, make_node
-from tvm.runtime import Object, Scriptable
+from tvm.ir import (
+    DictAttrs,
+    Expr,
+    Op,
+    Range,
+    Scriptable,
+    Span,
+    StringImm,
+    TensorRegion,
+    Var,
+    make_node,
+)
+from tvm.runtime import Object
 
 from . import _ffi_api
 from .exec_scope import ScopeIdDef
diff --git a/python/tvm/tirx/tile_primitive.py 
b/python/tvm/tirx/tile_primitive.py
index 13685dd6da..ed026a4e4f 100644
--- a/python/tvm/tirx/tile_primitive.py
+++ b/python/tvm/tirx/tile_primitive.py
@@ -25,8 +25,8 @@ from typing import Any, ClassVar
 import tvm_ffi
 from tvm_ffi import register_object
 
-from tvm.ir import Expr, Op, Range, Var
-from tvm.runtime import Object, Scriptable
+from tvm.ir import Expr, Op, Range, Scriptable, Var
+from tvm.runtime import Object
 from tvm.target import Target
 
 from . import _ffi_api
diff --git a/python/tvm/tirx/transform/transform.py 
b/python/tvm/tirx/transform/transform.py
index ff7e536a1c..91ae6ec336 100644
--- a/python/tvm/tirx/transform/transform.py
+++ b/python/tvm/tirx/transform/transform.py
@@ -17,7 +17,6 @@
 """Wrapping existing transformations."""
 # pylint: disable=invalid-name, unsupported-binary-operation
 
-import enum
 from collections.abc import Callable
 
 import tvm_ffi as _ffi
@@ -399,65 +398,6 @@ def VerifyMemory():
     return _ffi_api.VerifyMemory()  # type: ignore
 
 
-@_ffi.register_object("s_tir.transform.HoistIfThenElseConfig")
-class HoistIfThenElseConfig(_ffi.Object):
-    """Config for hoist if then else pass"""
-
-
-class HoistedConditionals(enum.Flag):
-    """Flags for use in HoistExpressionConfig.conditional_types
-
-    Each bitflag represents a type of expression that should be
-    hoisted to the outermost loop possible.
-    """
-
-    Never = 0
-    """ No hoisting of conditionals """
-
-    IfElseStmt = 1
-    """ If set, look for hoist candidates in IfElseStmt """
-
-    IfElseExpr = 2
-    """ If set, look for hoist candidates in tirx.if_then_else """
-
-    BooleanExpression = 4
-    """ If set, look for hoist candidates in all boolean expressions """
-
-    UsingBlockVar = 8
-    """ If set, allow hoisting of conditionals that use a block variable (e.g. 
threadIdx.x)  """
-
-    All = IfElseStmt | IfElseExpr | BooleanExpression | UsingBlockVar
-    """ Enable all hoisting of conditionals"""
-
-
-class HoistedLetBindings(enum.Flag):
-    """Flags for use in HoistExpressionConfig.let_binding_types
-
-    Each bitflag represents a type of let binding expression that should be
-    hoisted to the outermost loop possible.
-    """
-
-    Never = 0
-    """ No hoisting of let bindings """
-
-    RequiredByConditional = 1
-    """ Bindings that are used by a hoisted conditional """
-
-    Bind = 2
-    """ Bindings occurring in Bind nodes """
-
-    LetExpr = 4
-    """ Bindings occurring in Let expressions """
-
-    All = RequiredByConditional | Bind | LetExpr
-    """ Enable all hoisting of let bindings """
-
-
-@_ffi.register_object("s_tir.transform.HoistExpressionConfig")
-class HoistExpressionConfig(_ffi.Object):
-    """Config for hoist expression pass"""
-
-
 def FlattenBuffer():
     """Flatten the multi-dimensional TensorLoad and TensorStore to single 
dimensional
     TensorLoad/TensorStore for the TIR not contains opaque block.
diff --git a/python/tvm/topi/utils.py b/python/tvm/topi/utils.py
index b1bbe29178..6f1151355c 100644
--- a/python/tvm/topi/utils.py
+++ b/python/tvm/topi/utils.py
@@ -25,6 +25,7 @@ import numpy as np
 import tvm
 from tvm import te
 from tvm.s_tir import sbijective_layout, slayout
+from tvm.sym.utils import get_const_int
 
 from . import cpp, tag
 
@@ -103,29 +104,6 @@ def prod(x):
     return res
 
 
-def get_const_int(expr):
-    """Verifies expr is integer and get the constant value.
-
-    Parameters
-    ----------
-    expr : tvm.Expr or int
-        The input expression.
-
-    Returns
-    -------
-    out_value : int
-        The output.
-    """
-    if isinstance(expr, Integral):
-        return expr
-    if not isinstance(expr, tvm.tirx.IntImm):
-        ana = tvm.sym.Analyzer()
-        expr = ana.simplify(expr)
-    if not isinstance(expr, tvm.tirx.IntImm):
-        raise ValueError("Expect value to be constant int")
-    return int(expr.value)
-
-
 def get_const_float(expr):
     """Verifies expr is a floating point and get the constant value.
 
diff --git a/src/ir/prim/op.cc b/src/ir/prim/op.cc
index 9236e6f641..55d7fc462a 100644
--- a/src/ir/prim/op.cc
+++ b/src/ir/prim/op.cc
@@ -835,7 +835,7 @@ PrimExpr prim::clz(PrimExpr x, Span span) {
 
 TVM_FFI_STATIC_INIT_BLOCK() {
   tvm::ffi::reflection::GlobalDef()
-      .def_packed("node._const",
+      .def_packed("ir._const",
                   [](ffi::PackedArgs args, ffi::Any* ret) {
                     if (auto opt = args[0].try_cast<ffi::BigInt>(); 
opt.has_value()) {
                       *ret = prim::MakeConst(args[1].cast<PrimType>(), *opt, 
args[2].cast<Span>());
diff --git a/src/relax/ir/dependent_type.cc b/src/relax/ir/dependent_type.cc
index 231b3c9f4f..a1aec4c20f 100644
--- a/src/relax/ir/dependent_type.cc
+++ b/src/relax/ir/dependent_type.cc
@@ -378,7 +378,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
   namespace refl = tvm::ffi::reflection;
   refl::GlobalDef()
       .def("relax.UpdateType", [](Expr expr, Type ty) { UpdateType(expr, ty); 
})
-      .def("ir.ExprType", [](Expr expr) { return GetType(expr); });
+      .def("relax.ExprType", [](Expr expr) { return GetType(expr); });
 }
 
 }  // namespace relax
diff --git a/src/script/printer/config.cc b/src/script/printer/config.cc
index 3e384a2628..51558a1316 100644
--- a/src/script/printer/config.cc
+++ b/src/script/printer/config.cc
@@ -182,9 +182,12 @@ ffi::Array<ffi::String> 
PrinterConfigNode::GetBuiltinKeywords() {
 
 TVM_FFI_STATIC_INIT_BLOCK() {
   PrinterConfigNode::RegisterReflection();
-  ffi::reflection::GlobalDef().def(
-      "node.PrinterConfig",
-      [](ffi::Map<ffi::String, Any> config_dict) { return 
PrinterConfig(config_dict); });
+  auto make_config = [](ffi::Map<ffi::String, Any> config_dict) {
+    return PrinterConfig(config_dict);
+  };
+  ffi::reflection::GlobalDef()
+      .def("script.printer.PrinterConfig", make_config)
+      .def("node.PrinterConfig", make_config);
 }
 
 }  // namespace tvm
diff --git a/src/te/script/printer/expr.cc b/src/te/script/printer/expr.cc
index da29b6da85..ca6c171804 100644
--- a/src/te/script/printer/expr.cc
+++ b/src/te/script/printer/expr.cc
@@ -41,7 +41,7 @@ ffi::Optional<ExprDoc> 
CommReducerDocTranslate(DocTranslatorObj* d, ffi::AnyView
   for (const PrimExpr& value : reducer->identity_element)
     identity.push_back(d->Translate(value).value());
   ExprDoc result_doc = result.size() == 1 ? result[0] : 
ExprDoc(TupleDoc(result));
-  return NamespaceDoc("tirx")
+  return NamespaceDoc("s_tir")
       ->Attr("comm_reducer")
       ->Call({LambdaDoc(args, result_doc), ListDoc(identity)});
 }
@@ -76,7 +76,7 @@ ffi::Optional<ExprDoc> ReduceDocTranslate(DocTranslatorObj* 
d, ffi::AnyView inpu
   d->RecordOrigin(source, node->source);
   d->RecordOrigin(axis, node->axis);
   d->RecordOrigin(init, node->init);
-  return NamespaceDoc("tirx")->Attr("Reduce")->Call(
+  return NamespaceDoc("s_tir")->Attr("Reduce")->Call(
       {combiner, source, axis, condition, value_index, init});
 }
 
diff --git a/tests/python/relax/script/test_relax_script_printer.py 
b/tests/python/relax/script/test_relax_script_printer.py
index 86e8aff794..76dcba5285 100644
--- a/tests/python/relax/script/test_relax_script_printer.py
+++ b/tests/python/relax/script/test_relax_script_printer.py
@@ -28,11 +28,11 @@ from tvm import IRModule, relax, tirx
 from tvm.ir import Range
 from tvm.relax import TensorType
 from tvm.relax.distributed import DeviceMesh, DTensorType, Placement
-from tvm.runtime.script_printer import PrinterConfig, _script
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import s_tir as Ts
 from tvm.script import tirx as T
+from tvm.script.printer.scriptable import PrinterConfig, _script
 
 
 def _assert_print(obj, expected):
diff --git 
a/tests/python/s_tir/transform/test_s_tir_transform_hoist_expression.py 
b/tests/python/s_tir/transform/test_s_tir_transform_hoist_expression.py
index fd502f55c9..4de0d34327 100644
--- a/tests/python/s_tir/transform/test_s_tir_transform_hoist_expression.py
+++ b/tests/python/s_tir/transform/test_s_tir_transform_hoist_expression.py
@@ -15,14 +15,64 @@
 # specific language governing permissions and limitations
 # under the License.
 # ruff: noqa: F401
+import enum
+
 import tvm
 import tvm.testing
 from tvm import s_tir
-from tvm.s_tir.transform import HoistedConditionals, HoistedLetBindings
 from tvm.script import s_tir as Ts
 from tvm.script import tirx as T
 
 
+class HoistedConditionals(enum.Flag):
+    """Test flags for the native hoisted_conditionals pass option
+
+    Each bitflag represents a type of expression that should be
+    hoisted to the outermost loop possible.
+    """
+
+    Never = 0
+    """ No hoisting of conditionals """
+
+    IfElseStmt = 1
+    """ If set, look for hoist candidates in IfElseStmt """
+
+    IfElseExpr = 2
+    """ If set, look for hoist candidates in tirx.if_then_else """
+
+    BooleanExpression = 4
+    """ If set, look for hoist candidates in all boolean expressions """
+
+    UsingBlockVar = 8
+    """ If set, allow hoisting of conditionals that use a block variable (e.g. 
threadIdx.x)  """
+
+    All = IfElseStmt | IfElseExpr | BooleanExpression | UsingBlockVar
+    """ Enable all hoisting of conditionals"""
+
+
+class HoistedLetBindings(enum.Flag):
+    """Test flags for the native hoisted_let_bindings pass option
+
+    Each bitflag represents a type of let binding expression that should be
+    hoisted to the outermost loop possible.
+    """
+
+    Never = 0
+    """ No hoisting of let bindings """
+
+    RequiredByConditional = 1
+    """ Bindings that are used by a hoisted conditional """
+
+    Bind = 2
+    """ Bindings occurring in Bind nodes """
+
+    LetExpr = 4
+    """ Bindings occurring in Let expressions """
+
+    All = RequiredByConditional | Bind | LetExpr
+    """ Enable all hoisting of let bindings """
+
+
 def _run_transform(before, hoisted_conditionals, hoisted_let_bindings):
     """Run HoistExpression transform with the given configuration."""
     before_mod = tvm.IRModule.from_expr(before)
diff --git a/tests/python/script/test_script_printer_entry.py 
b/tests/python/script/test_script_printer_entry.py
index 6a90fa3c3e..e7f9cd51af 100644
--- a/tests/python/script/test_script_printer_entry.py
+++ b/tests/python/script/test_script_printer_entry.py
@@ -23,7 +23,7 @@ import tvm_ffi
 from tvm_ffi.access_path import AccessPath
 
 import tvm
-from tvm.runtime.script_printer import PrinterConfig, _script
+from tvm.script.printer.scriptable import PrinterConfig, _script
 
 
 @pytest.mark.parametrize(
diff --git a/tests/python/tirx-base/test_tir_index_map.py 
b/tests/python/tirx-base/test_tir_index_map.py
index 13f07c1849..9a1fd90536 100644
--- a/tests/python/tirx-base/test_tir_index_map.py
+++ b/tests/python/tirx-base/test_tir_index_map.py
@@ -21,8 +21,7 @@ import tvm_ffi
 
 import tvm
 import tvm.testing
-from tvm.ir import assert_structural_equal
-from tvm.runtime import const
+from tvm.ir import assert_structural_equal, const
 from tvm.script import tirx as T
 from tvm.tirx import IndexMap, IntImm, Var, floordiv, floormod
 
diff --git a/tests/python/tirx/codegen/test_ptx_addr.py 
b/tests/python/tirx/codegen/test_ptx_addr.py
index a594073d79..8017eb32a3 100644
--- a/tests/python/tirx/codegen/test_ptx_addr.py
+++ b/tests/python/tirx/codegen/test_ptx_addr.py
@@ -20,8 +20,7 @@ import pytest
 import tvm_ffi
 
 import tvm
-from tvm.ir import Call, Op
-from tvm.runtime import const
+from tvm.ir import Call, Op, const
 from tvm.script import tirx as T
 from tvm.tirx.expr import Broadcast, CallEffectKind
 
diff --git a/tests/python/tirx/script/test_tirx_script_printer.py 
b/tests/python/tirx/script/test_tirx_script_printer.py
index 465fa6e169..3be8e04769 100644
--- a/tests/python/tirx/script/test_tirx_script_printer.py
+++ b/tests/python/tirx/script/test_tirx_script_printer.py
@@ -26,11 +26,11 @@ import tvm.testing
 from tvm import ir, s_tir, tirx
 from tvm import tirx as tir
 from tvm.ir import Range, assert_structural_equal
-from tvm.runtime.script_printer import _script
 from tvm.script import ir as I
 from tvm.script import ir_builder as IB
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
+from tvm.script.printer.scriptable import _script
 from tvm.script.tirx import tile as Tx
 from tvm.tirx.cuda import op as cuda_op
 from tvm.tirx.script import ir_builder as TB
@@ -587,11 +587,13 @@ T.atan(T.float32(1.0))
 
 
 def test_comm_reducer():
-    obj = TB.comm_reducer(lambda x, y: x + y, identity=[TB.float32(0)])
+    from tvm.s_tir.script import ir_builder as SB
+
+    obj = SB.comm_reducer(lambda x, y: x + y, identity=[TB.float32(0)])
     _assert_print(
         obj,
         """
-T.comm_reducer(lambda x, y: x + y, [T.float32(0.0)])
+Ts.comm_reducer(lambda x, y: x + y, [T.float32(0.0)])
 """,
     )
 
diff --git 
a/tests/python/tirx/script/test_tirx_script_printer_invisible_path_info.py 
b/tests/python/tirx/script/test_tirx_script_printer_invisible_path_info.py
index ad9407d253..ab3a1bf16f 100644
--- a/tests/python/tirx/script/test_tirx_script_printer_invisible_path_info.py
+++ b/tests/python/tirx/script/test_tirx_script_printer_invisible_path_info.py
@@ -21,7 +21,7 @@ from tvm_ffi.access_path import AccessPath
 
 import tvm
 import tvm.testing
-from tvm.runtime.script_printer import PrinterConfig, _script
+from tvm.script.printer.scriptable import PrinterConfig, _script
 
 
 def test_render_invisible_path_info_defaults_to_true():

Reply via email to