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 78ade2f649 [REFACTOR][TVMScript] Restore dialect-owned IR builder 
packages (#20440)
78ade2f649 is described below

commit 78ade2f649385213814e2f7e6ecd01b392d93716
Author: Tianqi Chen <[email protected]>
AuthorDate: Thu Sep 24 18:55:32 2026 -0400

    [REFACTOR][TVMScript] Restore dialect-owned IR builder packages (#20440)
    
    Move the TIRx and Relax builder implementations into
    `tvm.tirx.script.ir_builder` and `tvm.relax.script.ir_builder`,
    including Relax distributed helpers. Each dialect registers its
    canonical builder path with the generic TVMScript namespace, so existing
    `tvm.script.ir_builder.tirx` and `.relax` imports resolve to those same
    modules.
    
    Keep shared construction APIs in `tvm.script.ir_builder`, retain lazy
    external dialect registration and deep import identity, and update
    internal imports and documentation to the owning packages.
---
 docs/arch/tvmscript.rst                            |  4 +-
 docs/reference/api/python/script/ir_builder.rst    | 15 +++--
 docs/tirx/api/script.rst                           |  4 +-
 docs/tirx/api/tile_dispatch.rst                    |  6 +-
 docs/tirx/arch/tile_dispatch.rst                   |  2 +-
 python/tvm/backend/cuda/__init__.py                |  4 +-
 python/tvm/backend/cuda/lang/alloc_pool.py         |  2 +-
 python/tvm/backend/cuda/script.py                  |  2 +-
 python/tvm/backend/metal/__init__.py               |  4 +-
 python/tvm/backend/metal/script.py                 |  2 +-
 python/tvm/backend/trn/__init__.py                 |  4 +-
 python/tvm/backend/trn/script.py                   |  2 +-
 python/tvm/relax/__init__.py                       |  4 +-
 python/tvm/relax/script/__init__.py                |  7 ++-
 .../relax => relax/script/ir_builder}/__init__.py  |  0
 .../relax => relax/script/ir_builder}/_ffi_api.py  |  2 +-
 .../script/ir_builder}/distributed/__init__.py     |  2 +-
 .../script/ir_builder}/distributed/_ffi_api.py     |  2 +-
 .../script/ir_builder}/distributed/ir.py           |  2 +-
 .../relax => relax/script/ir_builder}/frame.py     |  0
 .../relax => relax/script/ir_builder}/ir.py        |  0
 .../script/ir_builder}/parser_protocol.py          |  2 +-
 python/tvm/relax/testing/attention.py              |  2 +-
 python/tvm/relax/testing/matmul.py                 |  2 +-
 python/tvm/relax/transform/legalize_ops/grad.py    |  4 +-
 python/tvm/s_tir/tensor_intrin/arm_cpu.py          |  2 +-
 python/tvm/script/__init__.py                      | 65 +++++++++++-----------
 python/tvm/script/ir_builder/__init__.py           |  2 +-
 python/tvm/script/ir_builder/parser_protocol.py    |  4 +-
 python/tvm/script/parser/entry.py                  |  6 +-
 python/tvm/tirx/__init__.py                        |  6 +-
 python/tvm/tirx/_buffer_view.py                    |  4 +-
 python/tvm/tirx/script/__init__.py                 |  6 +-
 .../tirx => tirx/script/ir_builder}/__init__.py    |  0
 .../tirx => tirx/script/ir_builder}/_ffi_api.py    |  0
 .../script/ir_builder}/external_kernel.py          |  0
 .../tirx => tirx/script/ir_builder}/frame.py       |  0
 .../tirx => tirx/script/ir_builder}/ir.py          |  4 +-
 .../script/ir_builder}/parser_protocol.py          |  2 +-
 .../tirx => tirx/script/ir_builder}/tirx.py        |  0
 .../tirx => tirx/script/ir_builder}/triton.py      |  0
 .../tirx => tirx/script/ir_builder}/utils.py       |  2 +-
 python/tvm/tirx/script/jit.py                      |  2 +-
 python/tvm/tirx/script/tile.py                     |  2 +-
 python/tvm/topi/gpu/scan.py                        |  2 +-
 python/tvm/topi/gpu/scatter_elements.py            |  2 +-
 python/tvm/topi/gpu/scatter_nd.py                  |  2 +-
 python/tvm/topi/gpu/sort.py                        |  2 +-
 python/tvm/topi/index_put.py                       |  2 +-
 python/tvm/topi/scan.py                            |  2 +-
 python/tvm/topi/scatter.py                         |  2 +-
 python/tvm/topi/scatter_elements.py                |  2 +-
 python/tvm/topi/searchsorted.py                    |  2 +-
 python/tvm/topi/signal.py                          |  2 +-
 python/tvm/topi/sparse_reshape.py                  |  2 +-
 python/tvm/topi/unique.py                          |  2 +-
 python/tvm/topi/vision/nms.py                      |  2 +-
 python/tvm/topi/vision/nms_util.py                 |  2 +-
 tests/python/codegen/test_target_codegen_vulkan.py |  2 +-
 tests/python/relax/backend/adreno/mod_utils.py     |  2 +-
 tests/python/relax/backend/adreno/test_clml_ops.py |  2 +-
 .../relax/backend/adreno/test_texture_network.py   |  2 +-
 tests/python/relax/test_codegen_cublas.py          |  2 +-
 tests/python/relax/test_codegen_cudnn.py           |  2 +-
 tests/python/relax/test_codegen_cutlass.py         |  6 +-
 ...st_transform_attach_attr_layout_free_buffers.py |  2 +-
 .../test_transform_combine_parallel_matmul.py      |  2 +-
 .../test_transform_fold_batch_norm_to_conv2d.py    |  2 +-
 tests/python/relax/test_tvmscript_ir_builder.py    |  4 +-
 tests/python/tirx/test_layout.py                   |  2 +-
 tests/python/tirx/test_op.py                       |  2 +-
 tests/python/tirx/test_op_namespace_cleanup.py     |  6 +-
 tests/python/tirx/test_parser_printer.py           |  4 +-
 .../tvmscript/test_tvmscript_ir_builder_tir.py     |  4 +-
 .../tvmscript/test_tvmscript_parser_evaluator.py   |  2 +-
 .../python/tvmscript/test_tvmscript_printer_ir.py  |  2 +-
 .../python/tvmscript/test_tvmscript_printer_tir.py |  2 +-
 77 files changed, 139 insertions(+), 128 deletions(-)

diff --git a/docs/arch/tvmscript.rst b/docs/arch/tvmscript.rst
index 48cba1dd33..2b1e1f9d6d 100644
--- a/docs/arch/tvmscript.rst
+++ b/docs/arch/tvmscript.rst
@@ -384,7 +384,7 @@ construction policy and finalization; the syntax transpiler 
does not maintain an
 TIR builder
 ~~~~~~~~~~~
 
-The TIR builder (``python/tvm/script/ir_builder/tirx/``) implements the 
construction operations
+The TIR builder (``python/tvm/tirx/script/ir_builder/``) implements the 
construction operations
 behind public ``T`` syntax. Builder modules also support direct programmatic 
construction;
 public decorators and internal frame-opening operations have distinct roles. 
Key categories:
 
@@ -416,7 +416,7 @@ public decorators and internal frame-opening operations 
have distinct roles. Key
 Relax builder
 ~~~~~~~~~~~~~
 
-The Relax builder (``python/tvm/script/ir_builder/relax/``) implements:
+The Relax builder (``python/tvm/relax/script/ir_builder/``) implements:
 
 **Function and dataflow**:
 
diff --git a/docs/reference/api/python/script/ir_builder.rst 
b/docs/reference/api/python/script/ir_builder.rst
index e1f7f0c6ba..c89862a9b7 100644
--- a/docs/reference/api/python/script/ir_builder.rst
+++ b/docs/reference/api/python/script/ir_builder.rst
@@ -35,18 +35,21 @@ and 
:func:`~tvm.script.ir_builder.parser_protocol.function_`.
 .. automodule:: tvm.script.ir_builder.parser_protocol
    :members:
 
-tvm.script.ir_builder.relax
+Dialect builders are owned by their respective script packages. Registered
+compatibility paths under ``tvm.script.ir_builder`` resolve to the same 
modules.
+
+tvm.relax.script.ir_builder
 ***************************
-.. automodule:: tvm.script.ir_builder.relax
+.. automodule:: tvm.relax.script.ir_builder
    :members:
    :exclude-members: ExternFunc, ShapeExpr, TupleGetItem, Range
 
-tvm.script.ir_builder.relax.distributed
+tvm.relax.script.ir_builder.distributed
 ***************************************
-.. automodule:: tvm.script.ir_builder.relax.distributed
+.. automodule:: tvm.relax.script.ir_builder.distributed
    :members:
 
-tvm.script.ir_builder.tirx
+tvm.tirx.script.ir_builder
 **************************
-.. automodule:: tvm.script.ir_builder.tirx
+.. automodule:: tvm.tirx.script.ir_builder
    :members:
diff --git a/docs/tirx/api/script.rst b/docs/tirx/api/script.rst
index dccc4e21e8..0744f09299 100644
--- a/docs/tirx/api/script.rst
+++ b/docs/tirx/api/script.rst
@@ -37,12 +37,12 @@ Parser entry points
 
 Core IR builder
 ---------------
-.. automodule:: tvm.script.ir_builder.tirx.ir
+.. automodule:: tvm.tirx.script.ir_builder.ir
    :members:
    :no-index:
    :exclude-members: LetAnnotation, alloc_tcgen05_ldst_frag, anylist_getitem, 
anylist_resetitem, anylist_setitem_call_packed, anylist_setitem_call_cpacked, 
match_buffer
 
-.. currentmodule:: tvm.script.ir_builder.tirx.ir
+.. currentmodule:: tvm.tirx.script.ir_builder.ir
 
 .. py:function:: match_buffer(param, shape=None, dtype="float32", data=None, 
strides=None, elem_offset=None, scope="global", align=-1, offset_factor=0, 
layout="default")
 
diff --git a/docs/tirx/api/tile_dispatch.rst b/docs/tirx/api/tile_dispatch.rst
index 8e13d46f5d..d8ddf8d833 100644
--- a/docs/tirx/api/tile_dispatch.rst
+++ b/docs/tirx/api/tile_dispatch.rst
@@ -21,13 +21,13 @@ Tile Dispatch Extension API
 Raw node constructors
 ---------------------
 
-``tvm.script.ir_builder.tirx.tirx`` constructs the same
+``tvm.tirx.script.ir_builder.tirx`` constructs the same
 ``TilePrimitiveCall`` nodes as the validated ``Tx.tile`` facade.  This surface
 is intended for parser, builder, and extension authors; kernel code should
 normally use the :doc:`tile authoring API <tile>`.  Its public builder spelling
-is ``tvm.script.ir_builder.tirx.tile``::
+is ``tvm.tirx.script.ir_builder.tile``::
 
-   from tvm.script.ir_builder import tirx as Tx_builder
+   from tvm.tirx.script import ir_builder as Tx_builder
 
    Tx_builder.tile.copy(dst, src)
 
diff --git a/docs/tirx/arch/tile_dispatch.rst b/docs/tirx/arch/tile_dispatch.rst
index fe99b0a947..a22be597bf 100644
--- a/docs/tirx/arch/tile_dispatch.rst
+++ b/docs/tirx/arch/tile_dispatch.rst
@@ -32,7 +32,7 @@ The authoritative operation list is the C++ registry
 wrapper classes live in
 ``python/tvm/tirx/operator/tile_primitive/ops.py``.  Raw
 ``TilePrimitiveCall`` constructors live in
-``python/tvm/script/ir_builder/tirx/tirx.py``, while the validated authoring 
facade
+``python/tvm/tirx/script/ir_builder/tirx.py``, while the validated authoring 
facade
 is in ``python/tvm/tirx/script/tile.py``.  Both Python construction surfaces
 produce the same IR node type.
 
diff --git a/python/tvm/backend/cuda/__init__.py 
b/python/tvm/backend/cuda/__init__.py
index b14688ca23..d604f85d02 100644
--- a/python/tvm/backend/cuda/__init__.py
+++ b/python/tvm/backend/cuda/__init__.py
@@ -55,10 +55,10 @@ def _detect_target_from_device(dev):
 
 def register_backend():
     """Register CUDA-owned Python semantics."""
-    from tvm.script.ir_builder.tirx import (
+    from tvm.target.detect_target import register_device_target_detector
+    from tvm.tirx.script.ir_builder import (
         ir as builder_ir,  # pylint: disable=import-outside-toplevel
     )
-    from tvm.target.detect_target import register_device_target_detector
 
     runtime_dir = Path(_LOADED_LIBS["tvm_runtime"]._name).resolve().parent
     try:
diff --git a/python/tvm/backend/cuda/lang/alloc_pool.py 
b/python/tvm/backend/cuda/lang/alloc_pool.py
index 0120f71ffe..225166b80f 100644
--- a/python/tvm/backend/cuda/lang/alloc_pool.py
+++ b/python/tvm/backend/cuda/lang/alloc_pool.py
@@ -34,7 +34,7 @@ _ir = None
 def _get_ir():
     global _ir
     if _ir is None:
-        from tvm.script.ir_builder.tirx import ir as _mod
+        from tvm.tirx.script.ir_builder import ir as _mod
 
         _ir = _mod
     return _ir
diff --git a/python/tvm/backend/cuda/script.py 
b/python/tvm/backend/cuda/script.py
index 753a7bbe13..2f2fc2ea65 100644
--- a/python/tvm/backend/cuda/script.py
+++ b/python/tvm/backend/cuda/script.py
@@ -22,9 +22,9 @@ from collections.abc import Callable
 from typing import Any
 
 from tvm.backend.cuda import op as _cuda_op
-from tvm.script.ir_builder.tirx.ir import _dtype_forward, _op_wrapper
 from tvm.tirx import is_buffer_var
 from tvm.tirx import op as _tir_op
+from tvm.tirx.script.ir_builder.ir import _dtype_forward, _op_wrapper
 
 # pylint: disable=protected-access
 
diff --git a/python/tvm/backend/metal/__init__.py 
b/python/tvm/backend/metal/__init__.py
index 4954c19500..25a8252cae 100644
--- a/python/tvm/backend/metal/__init__.py
+++ b/python/tvm/backend/metal/__init__.py
@@ -41,10 +41,10 @@ def _detect_target_from_device(dev):
 
 def register_backend():
     """Register Metal-owned Python semantics."""
-    from tvm.script.ir_builder.tirx import (
+    from tvm.target.detect_target import register_device_target_detector
+    from tvm.tirx.script.ir_builder import (
         ir as builder_ir,  # pylint: disable=import-outside-toplevel
     )
-    from tvm.target.detect_target import register_device_target_detector
 
     runtime_dir = Path(_LOADED_LIBS["tvm_runtime"]._name).resolve().parent
     try:
diff --git a/python/tvm/backend/metal/script.py 
b/python/tvm/backend/metal/script.py
index 1fa677bd39..2cd4de49d4 100644
--- a/python/tvm/backend/metal/script.py
+++ b/python/tvm/backend/metal/script.py
@@ -19,9 +19,9 @@
 from __future__ import annotations
 
 from tvm.backend.metal import op as _metal_op
-from tvm.script.ir_builder.tirx.ir import _op_wrapper
 from tvm.tirx import is_buffer_var
 from tvm.tirx import op as _tir_op
+from tvm.tirx.script.ir_builder.ir import _op_wrapper
 
 
 class MetalNamespace:
diff --git a/python/tvm/backend/trn/__init__.py 
b/python/tvm/backend/trn/__init__.py
index bc8e45dc8d..b45c411af1 100644
--- a/python/tvm/backend/trn/__init__.py
+++ b/python/tvm/backend/trn/__init__.py
@@ -31,10 +31,10 @@ _LAZY_SUBMODULES = {
 
 def register_backend():
     """Register Trainium-owned Python semantics."""
-    from tvm.script.ir_builder.tirx import (
+    from tvm.tirx import compilation_pipeline  # pylint: 
disable=import-outside-toplevel
+    from tvm.tirx.script.ir_builder import (
         ir as builder_ir,  # pylint: disable=import-outside-toplevel
     )
-    from tvm.tirx import compilation_pipeline  # pylint: 
disable=import-outside-toplevel
 
     for name, namespace in script_namespaces().items():
         builder_ir.register_script_namespace(name, namespace)
diff --git a/python/tvm/backend/trn/script.py b/python/tvm/backend/trn/script.py
index 4a6bd01398..701523f273 100644
--- a/python/tvm/backend/trn/script.py
+++ b/python/tvm/backend/trn/script.py
@@ -30,7 +30,7 @@ OpWrapper = Callable[[Callable[..., Any]], Callable[..., Any]]
 
 def _default_op_wrapper(func: Callable[..., Any]) -> Callable[..., Any]:
     """Create the default facade for a returned-node NKI intrinsic."""
-    from tvm.script.ir_builder.tirx.ir import _op_wrapper  # pylint: 
disable=import-outside-toplevel
+    from tvm.tirx.script.ir_builder.ir import _op_wrapper  # pylint: 
disable=import-outside-toplevel
 
     # NKI producers return a single call_intrin node and never emit separately.
     return 
_result_span(f"T.nki.{func.__name__.removeprefix('nki_')}")(_op_wrapper(func))
diff --git a/python/tvm/relax/__init__.py b/python/tvm/relax/__init__.py
index 0b71d0a08d..c07375dbe8 100644
--- a/python/tvm/relax/__init__.py
+++ b/python/tvm/relax/__init__.py
@@ -112,12 +112,12 @@ from .binding_rewrite import DataflowBlockRewrite
 
 import tvm.script
 
-tvm.script.register_dialect("relax", "tvm.relax.script")
+tvm.script.register_dialect("relax", "tvm.relax.script", 
builder_path="tvm.relax.script.ir_builder")
 
 
 def _check_script_module(module: "tvm.ir.IRModule") -> None:
     # Delay builder imports until validation, keeping dialect/runtime 
bootstrap safe.
-    from tvm.script.ir_builder.relax.parser_protocol import 
_check_module_well_formed
+    from tvm.relax.script.ir_builder.parser_protocol import 
_check_module_well_formed
 
     _check_module_well_formed(module)
 
diff --git a/python/tvm/relax/script/__init__.py 
b/python/tvm/relax/script/__init__.py
index beff701106..b1bdfe93e8 100644
--- a/python/tvm/relax/script/__init__.py
+++ b/python/tvm/relax/script/__init__.py
@@ -45,10 +45,11 @@ def _initialize() -> None:
         return
     _initializing = True
     try:
-        from tvm.script.ir_builder import relax as builder
         from tvm.script.parser import entry, register_namespace
         from tvm.script.parser.protocol_registry import declaration_kind
 
+        from . import ir_builder as builder
+
         globals().update(
             (name, value) for name, value in vars(builder).items() if not 
name.startswith("_")
         )
@@ -69,12 +70,14 @@ def _initialize() -> None:
 
 
 def __getattr__(name: str) -> _Any:
+    if name == "ir_builder":
+        return _importlib.import_module(__name__ + ".ir_builder")
     if name.startswith("_") and name != "__all__":
         raise AttributeError(name)
     _initialize()
     if name in globals():
         return globals()[name]
-    return getattr(_importlib.import_module("tvm.script.ir_builder.relax"), 
name)
+    return getattr(_importlib.import_module("tvm.relax.script.ir_builder"), 
name)
 
 
 class _PyModuleFactory:
diff --git a/python/tvm/script/ir_builder/relax/__init__.py 
b/python/tvm/relax/script/ir_builder/__init__.py
similarity index 100%
rename from python/tvm/script/ir_builder/relax/__init__.py
rename to python/tvm/relax/script/ir_builder/__init__.py
diff --git a/python/tvm/script/ir_builder/relax/_ffi_api.py 
b/python/tvm/relax/script/ir_builder/_ffi_api.py
similarity index 95%
rename from python/tvm/script/ir_builder/relax/_ffi_api.py
rename to python/tvm/relax/script/ir_builder/_ffi_api.py
index ac4bd324af..8b14e9dd7b 100644
--- a/python/tvm/script/ir_builder/relax/_ffi_api.py
+++ b/python/tvm/relax/script/ir_builder/_ffi_api.py
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""FFI APIs for tvm.script.ir_builder.relax"""
+"""FFI APIs for tvm.relax.script.ir_builder"""
 
 import tvm_ffi
 
diff --git a/python/tvm/script/ir_builder/relax/distributed/__init__.py 
b/python/tvm/relax/script/ir_builder/distributed/__init__.py
similarity index 94%
rename from python/tvm/script/ir_builder/relax/distributed/__init__.py
rename to python/tvm/relax/script/ir_builder/distributed/__init__.py
index 9c81ce63b9..8b0bf3b40f 100644
--- a/python/tvm/script/ir_builder/relax/distributed/__init__.py
+++ b/python/tvm/relax/script/ir_builder/distributed/__init__.py
@@ -16,6 +16,6 @@
 # specific language governing permissions and limitations
 # under the License.
 # pylint: disable=unused-import
-"""Package tvm.script.ir_builder.relax.distributed"""
+"""Package tvm.relax.script.ir_builder.distributed"""
 
 from .ir import *  # pylint: disable=wildcard-import,redefined-builtin
diff --git a/python/tvm/script/ir_builder/relax/distributed/_ffi_api.py 
b/python/tvm/relax/script/ir_builder/distributed/_ffi_api.py
similarity index 93%
rename from python/tvm/script/ir_builder/relax/distributed/_ffi_api.py
rename to python/tvm/relax/script/ir_builder/distributed/_ffi_api.py
index 2ebc4935b8..e8df67e7df 100644
--- a/python/tvm/script/ir_builder/relax/distributed/_ffi_api.py
+++ b/python/tvm/relax/script/ir_builder/distributed/_ffi_api.py
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""FFI APIs for tvm.script.ir_builder.relax.distributed"""
+"""FFI APIs for tvm.relax.script.ir_builder.distributed"""
 
 import tvm_ffi
 
diff --git a/python/tvm/script/ir_builder/relax/distributed/ir.py 
b/python/tvm/relax/script/ir_builder/distributed/ir.py
similarity index 99%
rename from python/tvm/script/ir_builder/relax/distributed/ir.py
rename to python/tvm/relax/script/ir_builder/distributed/ir.py
index cb9e6391c4..f805af0cf4 100644
--- a/python/tvm/script/ir_builder/relax/distributed/ir.py
+++ b/python/tvm/relax/script/ir_builder/distributed/ir.py
@@ -40,11 +40,11 @@ from tvm.relax.op.distributed import (
 from tvm.relax.op.distributed import (
     redistribute as _redistribute,
 )
+from tvm.relax.script.ir_builder.ir import py_str
 from tvm.relax.utils import convert_to_expr
 from tvm.runtime import _tensor
 from tvm.script.ir_builder import IRBuilder, IRModuleFrame
 from tvm.script.ir_builder.ir import lookup_global_info
-from tvm.script.ir_builder.relax.ir import py_str
 
 from . import _ffi_api
 
diff --git a/python/tvm/script/ir_builder/relax/frame.py 
b/python/tvm/relax/script/ir_builder/frame.py
similarity index 100%
rename from python/tvm/script/ir_builder/relax/frame.py
rename to python/tvm/relax/script/ir_builder/frame.py
diff --git a/python/tvm/script/ir_builder/relax/ir.py 
b/python/tvm/relax/script/ir_builder/ir.py
similarity index 100%
rename from python/tvm/script/ir_builder/relax/ir.py
rename to python/tvm/relax/script/ir_builder/ir.py
diff --git a/python/tvm/script/ir_builder/relax/parser_protocol.py 
b/python/tvm/relax/script/ir_builder/parser_protocol.py
similarity index 99%
rename from python/tvm/script/ir_builder/relax/parser_protocol.py
rename to python/tvm/relax/script/ir_builder/parser_protocol.py
index c71fae3a19..539d9506de 100644
--- a/python/tvm/script/ir_builder/relax/parser_protocol.py
+++ b/python/tvm/relax/script/ir_builder/parser_protocol.py
@@ -32,7 +32,7 @@ from typing import Any, NoReturn
 
 import tvm_ffi as _ffi
 
-import tvm.script.ir_builder.relax as _builder
+import tvm.relax.script.ir_builder as _builder
 from tvm import ir as _ir
 from tvm import relax as _relax
 from tvm import tirx as _tir
diff --git a/python/tvm/relax/testing/attention.py 
b/python/tvm/relax/testing/attention.py
index 3ea7d50228..33deda07d6 100644
--- a/python/tvm/relax/testing/attention.py
+++ b/python/tvm/relax/testing/attention.py
@@ -18,10 +18,10 @@
 """Relax script for attention module."""
 
 import tvm
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def get_relax_attention_module(
diff --git a/python/tvm/relax/testing/matmul.py 
b/python/tvm/relax/testing/matmul.py
index 63986d84ca..2d2ab2d109 100644
--- a/python/tvm/relax/testing/matmul.py
+++ b/python/tvm/relax/testing/matmul.py
@@ -18,9 +18,9 @@
 """Utilities to construct matmul workloads."""
 
 import tvm
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.script import relax as R
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def get_relax_matmul_module(
diff --git a/python/tvm/relax/transform/legalize_ops/grad.py 
b/python/tvm/relax/transform/legalize_ops/grad.py
index 96e32ac2c4..a808e52cde 100644
--- a/python/tvm/relax/transform/legalize_ops/grad.py
+++ b/python/tvm/relax/transform/legalize_ops/grad.py
@@ -22,8 +22,8 @@ import logging
 from tvm import te, tirx, topi
 from tvm.ir import Call
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
-from tvm.script.ir_builder.tirx.utils import buffer_proxy
+from tvm.tirx.script import ir_builder as T
+from tvm.tirx.script.ir_builder.utils import buffer_proxy
 
 from ...block_builder import BlockBuilder
 from ...expr import Expr
diff --git a/python/tvm/s_tir/tensor_intrin/arm_cpu.py 
b/python/tvm/s_tir/tensor_intrin/arm_cpu.py
index b5fbe3a0ac..34472417f5 100644
--- a/python/tvm/s_tir/tensor_intrin/arm_cpu.py
+++ b/python/tvm/s_tir/tensor_intrin/arm_cpu.py
@@ -21,8 +21,8 @@
 from tvm import tirx
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder.tirx import prim_func as build_prim_func
 from tvm.target.codegen import llvm_version_major
+from tvm.tirx.script.ir_builder import prim_func as build_prim_func
 
 from .. import TensorIntrin
 from .dot_product_common import (
diff --git a/python/tvm/script/__init__.py b/python/tvm/script/__init__.py
index 6c846b2079..a4d9da860c 100644
--- a/python/tvm/script/__init__.py
+++ b/python/tvm/script/__init__.py
@@ -29,15 +29,15 @@ from collections.abc import Callable
 from typing import Any
 
 _DIALECT_REGISTRY: dict[str, str] = {}
+_DIALECT_BUILDER_REGISTRY: dict[str, str] = {}
 # Language variants register whole-module checks at import, independently of 
source decorators.
 # Callbacks own concrete eligibility; this list retains no source or 
construction state.
 _MODULE_VALIDATORS: list[Callable[[Any], None]] = []
 
-# An empty suffix names the public language variant namespace itself.
-# Builder redirection applies only when no real package owns that name.
+# Public parser and builder compatibility paths consume dialect-owned 
registrations.
 _REDIRECTED_SUBPACKAGES = {
-    "tvm.script.parser": "",
-    "tvm.script.ir_builder": "builder",
+    "tvm.script.parser": _DIALECT_REGISTRY,
+    "tvm.script.ir_builder": _DIALECT_BUILDER_REGISTRY,
 }
 
 
@@ -73,40 +73,44 @@ def register_module_validator(validator: Callable[[Any], 
None], *, prepend: bool
         _MODULE_VALIDATORS.append(validator)
 
 
-def register_dialect(name: str, module_path: str) -> None:
-    """Register a language variant's script package path.
+def register_dialect(name: str, module_path: str, *, builder_path: str | None 
= None) -> None:
+    """Register a dialect's script namespace and canonical builder package.
 
-    Writes ``name -> module_path`` into ``_DIALECT_REGISTRY``.  After
-    registration, ``tvm.script.<name>`` resolves to ``module_path`` via
-    ``__getattr__``, and ``tvm.script.parser.<name>`` / 
``tvm.script.ir_builder.<name>``
-    resolve to the same script namespace and the corresponding real builder
-    package, respectively. When no real builder package exists, external 
language
-    variants resolve through ``module_path + ".builder"``. Registered namespace
-    imports are handled by ``_DialectRedirectFinder`` on ``sys.meta_path``.
+    Registration is lazy: it records paths without importing either package.
+    ``tvm.script.<name>`` and ``tvm.script.parser.<name>`` expose 
``module_path``;
+    ``tvm.script.ir_builder.<name>`` exposes ``builder_path``. Deep imports 
under
+    these compatibility paths resolve to the same canonical modules, preserving
+    their identity and avoiding repeated initialization. Existing physical
+    out-of-tree packages under ``tvm.script.ir_builder`` retain normal package
+    lookup precedence.
 
-    This function is idempotent — re-registering the same name with the same
-    path is harmless.
-
-    Each in-tree language variant calls this from its own ``__init__.py``::
+    Each dialect registers from its own package initialization::
 
         import tvm.script
-        tvm.script.register_dialect("tirx", "tvm.tirx.script")
+        tvm.script.register_dialect(
+            "example", "example.script", 
builder_path="example.script.ir_builder"
+        )
 
-    Out-of-tree language variants do the same in their own package init without
-    editing any in-tree file.
+    Out-of-tree dialects register the same way without editing shared TVMScript
+    files. Re-registering the same name and paths is idempotent.
 
     Parameters
     ----------
     name : str
-        The short name exposed under ``tvm.script.<name>`` (e.g. ``"tirx"``).
+        Short name exposed under ``tvm.script.<name>``.
     module_path : str
-        The full dotted module path of the language variant's script package, 
e.g.
-        ``"tvm.tirx.script"``. That package exposes its public construction
-        entry points directly. Out-of-tree language variants provide imperative
-        APIs in a ``builder`` submodule; in-tree builders live in
-        ``tvm.script.ir_builder.<name>``.
+        Full dotted path of the dialect's script package, which owns its public
+        construction namespace.
+    builder_path : str, optional
+        Full dotted path of the dialect-owned imperative builder package,
+        normally ``module_path + ".ir_builder"``. When omitted, use
+        ``module_path + ".builder"`` to preserve existing out-of-tree
+        registrations. No imports or aliases are created at registration time.
     """
     _DIALECT_REGISTRY[name] = module_path
+    _DIALECT_BUILDER_REGISTRY[name] = (
+        builder_path if builder_path is not None else module_path + ".builder"
+    )
 
 
 def _redirect_target(fullname: str) -> str | None:
@@ -122,13 +126,13 @@ def _redirect_target(fullname: str) -> str | None:
             target = _DIALECT_REGISTRY[head]
             return f"{target}.{tail}" if tail else target
         # Registered language variants may redirect parser and builder 
subpackages.
-        for prefix, sub in _REDIRECTED_SUBPACKAGES.items():
+        for prefix, registry in _REDIRECTED_SUBPACKAGES.items():
             if fullname == prefix or not fullname.startswith(prefix + "."):
                 continue
             rest = fullname[len(prefix) + 1 :]
             head, _, tail = rest.partition(".")
-            if head in _DIALECT_REGISTRY:
-                target = _DIALECT_REGISTRY[head] + (f".{sub}" if sub else "")
+            if head in registry:
+                target = registry[head]
                 return f"{target}.{tail}" if tail else target
     return None
 
@@ -156,8 +160,7 @@ class _DialectRedirectFinder:
 
     @classmethod
     def find_spec(cls, fullname, path, target=None):
-        # A real builder package owns its canonical name. Only missing packages
-        # use the out-of-tree language variant registry fallback.
+        # Preserve real external builder packages before the registered 
fallback.
         prefix = "tvm.script.ir_builder."
         if fullname.startswith(prefix):
             package_name = prefix + fullname[len(prefix) :].partition(".")[0]
diff --git a/python/tvm/script/ir_builder/__init__.py 
b/python/tvm/script/ir_builder/__init__.py
index 5438e851e8..3906665490 100644
--- a/python/tvm/script/ir_builder/__init__.py
+++ b/python/tvm/script/ir_builder/__init__.py
@@ -75,7 +75,7 @@ __all__ = [
 
 
 def __getattr__(name: str) -> _Any:
-    # Real packages resolve directly; the finder supplies registered external 
builders.
+    # The finder resolves each registered dialect's canonical builder package.
     from tvm.script import _DIALECT_REGISTRY  # pylint: 
disable=import-outside-toplevel
 
     if name in _DIALECT_REGISTRY:
diff --git a/python/tvm/script/ir_builder/parser_protocol.py 
b/python/tvm/script/ir_builder/parser_protocol.py
index 4f97019d4f..06000c78f0 100644
--- a/python/tvm/script/ir_builder/parser_protocol.py
+++ b/python/tvm/script/ir_builder/parser_protocol.py
@@ -897,8 +897,8 @@ def function_(*, decl: bool = False, span: _Span = None, 
**options: Any) -> IRBu
         Language variant options: TIRx ``private``, ``s_tir`` and 
``persistent``
         default to False. Relax ``pure`` defaults to True and 
``private``/``local``
         to False; ``local=True`` requires a declared reference when building 
its
-        body. See :func:`tvm.script.ir_builder.tirx.function_` and
-        :func:`tvm.script.ir_builder.relax.function_` for their concrete 
options.
+        body. See :func:`tvm.tirx.script.ir_builder.function_` and
+        :func:`tvm.relax.script.ir_builder.function_` for their concrete 
options.
 
     Returns
     -------
diff --git a/python/tvm/script/parser/entry.py 
b/python/tvm/script/parser/entry.py
index 39312c8d27..4060000453 100644
--- a/python/tvm/script/parser/entry.py
+++ b/python/tvm/script/parser/entry.py
@@ -251,15 +251,15 @@ def make_decorator(
             For ``T.prim_func``, select scheduled-TIR construction semantics:
             buffers have no default layout and the body is wrapped in a root
             block. Defaults to False, selecting TIRx construction. See
-            :func:`tvm.script.ir_builder.tirx.prim_func`.
+            :func:`tvm.tirx.script.ir_builder.prim_func`.
         persistent : bool, optional
             For ``T.prim_func``, mark the resulting function as a persistent
             kernel. Defaults to False. See
-            :func:`tvm.script.ir_builder.tirx.prim_func`.
+            :func:`tvm.tirx.script.ir_builder.prim_func`.
         pure : bool, optional
             For ``R.function``, declare whether the function is pure, meaning
             that it has no observable side effects. Defaults to True. See
-            :func:`tvm.script.ir_builder.relax.function_`.
+            :func:`tvm.relax.script.ir_builder.function_`.
         **options
             Keyword options are forwarded to the selected language variant's
             :func:`~tvm.script.ir_builder.parser_protocol.function_` hook,
diff --git a/python/tvm/tirx/__init__.py b/python/tvm/tirx/__init__.py
index 38158bff41..a406ba8224 100644
--- a/python/tvm/tirx/__init__.py
+++ b/python/tvm/tirx/__init__.py
@@ -20,7 +20,7 @@
 
 import tvm.script
 
-tvm.script.register_dialect("tirx", "tvm.tirx.script")
+tvm.script.register_dialect("tirx", "tvm.tirx.script", 
builder_path="tvm.tirx.script.ir_builder")
 
 
 from tvm.ir import Expr
@@ -117,12 +117,12 @@ if not _RUNTIME_ONLY_TIRX:
 
 import tvm.script
 
-tvm.script.register_dialect("tirx", "tvm.tirx.script")
+tvm.script.register_dialect("tirx", "tvm.tirx.script", 
builder_path="tvm.tirx.script.ir_builder")
 
 
 def _check_script_module(module: "tvm.ir.IRModule") -> None:
     # Delay builder imports until validation, keeping dialect/runtime 
bootstrap safe.
-    from tvm.script.ir_builder.tirx.parser_protocol import 
_check_module_well_formed
+    from tvm.tirx.script.ir_builder.parser_protocol import 
_check_module_well_formed
 
     _check_module_well_formed(module)
 
diff --git a/python/tvm/tirx/_buffer_view.py b/python/tvm/tirx/_buffer_view.py
index 091ae9ea41..47d639947f 100644
--- a/python/tvm/tirx/_buffer_view.py
+++ b/python/tvm/tirx/_buffer_view.py
@@ -40,7 +40,7 @@ def _redecl(buf: Buffer, shape, layout, *, dtype=None, 
elem_offset=None, addr_of
         addr = buf.allocated_addr[0]
         if addr_offset is not None:
             addr = addr + addr_offset
-        return tvm.script.ir_builder.tirx.decl_buffer(
+        return tvm.tirx.script.ir_builder.decl_buffer(
             shape,
             buf.dtype if dtype is None else dtype,
             None,
@@ -53,7 +53,7 @@ def _redecl(buf: Buffer, shape, layout, *, dtype=None, 
elem_offset=None, addr_of
             layout,
             allocated_addr=addr,
         )
-    return tvm.script.ir_builder.tirx.decl_buffer(
+    return tvm.tirx.script.ir_builder.decl_buffer(
         shape,
         buf.dtype if dtype is None else dtype,
         buf.data,
diff --git a/python/tvm/tirx/script/__init__.py 
b/python/tvm/tirx/script/__init__.py
index 2ab9680e1d..9b32937e53 100644
--- a/python/tvm/tirx/script/__init__.py
+++ b/python/tvm/tirx/script/__init__.py
@@ -31,11 +31,11 @@ def _initialize() -> None:
         return
     _initializing = True
     try:
-        from tvm.script.ir_builder import tirx as builder
         from tvm.script.parser import entry, register_namespace
         from tvm.script.parser.protocol_registry import declaration_kind
         from tvm.tirx.layout import Axis
 
+        from . import ir_builder as builder
         from . import tile
         from .jit import make_jit
 
@@ -68,6 +68,8 @@ def _initialize() -> None:
 
 
 def __getattr__(name: str) -> _Any:
+    if name == "ir_builder":
+        return _importlib.import_module(__name__ + ".ir_builder")
     if name == "tile":
         return _importlib.import_module(__name__ + ".tile")
     if name.startswith("_") and name != "__all__":
@@ -75,7 +77,7 @@ def __getattr__(name: str) -> _Any:
     _initialize()
     if name in globals():
         return globals()[name]
-    return getattr(_importlib.import_module("tvm.script.ir_builder.tirx"), 
name)
+    return getattr(_importlib.import_module("tvm.tirx.script.ir_builder"), 
name)
 
 
 from .jit import OptionalAnnotation as Optional
diff --git a/python/tvm/script/ir_builder/tirx/__init__.py 
b/python/tvm/tirx/script/ir_builder/__init__.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/__init__.py
rename to python/tvm/tirx/script/ir_builder/__init__.py
diff --git a/python/tvm/script/ir_builder/tirx/_ffi_api.py 
b/python/tvm/tirx/script/ir_builder/_ffi_api.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/_ffi_api.py
rename to python/tvm/tirx/script/ir_builder/_ffi_api.py
diff --git a/python/tvm/script/ir_builder/tirx/external_kernel.py 
b/python/tvm/tirx/script/ir_builder/external_kernel.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/external_kernel.py
rename to python/tvm/tirx/script/ir_builder/external_kernel.py
diff --git a/python/tvm/script/ir_builder/tirx/frame.py 
b/python/tvm/tirx/script/ir_builder/frame.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/frame.py
rename to python/tvm/tirx/script/ir_builder/frame.py
diff --git a/python/tvm/script/ir_builder/tirx/ir.py 
b/python/tvm/tirx/script/ir_builder/ir.py
similarity index 99%
rename from python/tvm/script/ir_builder/tirx/ir.py
rename to python/tvm/tirx/script/ir_builder/ir.py
index 63a5e39606..1d35f2dea8 100644
--- a/python/tvm/script/ir_builder/tirx/ir.py
+++ b/python/tvm/tirx/script/ir_builder/ir.py
@@ -2312,7 +2312,7 @@ def launch_thread(
 
     .. code-block:: python
 
-    from tvm.script.ir_builder import tirx as T
+    from tvm.tirx.script import ir_builder as T
     brow = T.env_thread("blockIdx.y")
     T.launch_thread(brow, 1)
 
@@ -3112,7 +3112,7 @@ def register_script_namespace(name: str, namespace: 
object) -> object:
     import sys  # pylint: disable=import-outside-toplevel
 
     for module_name in [
-        "tvm.script.ir_builder.tirx",
+        "tvm.tirx.script.ir_builder",
         "tvm.tirx.script",
         "tvm.script.tirx",
     ]:
diff --git a/python/tvm/script/ir_builder/tirx/parser_protocol.py 
b/python/tvm/tirx/script/ir_builder/parser_protocol.py
similarity index 99%
rename from python/tvm/script/ir_builder/tirx/parser_protocol.py
rename to python/tvm/tirx/script/ir_builder/parser_protocol.py
index 32fa88528e..16ba16145b 100644
--- a/python/tvm/script/ir_builder/tirx/parser_protocol.py
+++ b/python/tvm/tirx/script/ir_builder/parser_protocol.py
@@ -29,7 +29,7 @@ from collections.abc import Sequence
 from functools import partial as _partial
 from typing import Any
 
-import tvm.script.ir_builder.tirx as _builder
+import tvm.tirx.script.ir_builder as _builder
 from tvm import ir as _ir
 from tvm import tirx as _tir
 from tvm.ir.prim import _ffi_api as _prim_ffi
diff --git a/python/tvm/script/ir_builder/tirx/tirx.py 
b/python/tvm/tirx/script/ir_builder/tirx.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/tirx.py
rename to python/tvm/tirx/script/ir_builder/tirx.py
diff --git a/python/tvm/script/ir_builder/tirx/triton.py 
b/python/tvm/tirx/script/ir_builder/triton.py
similarity index 100%
rename from python/tvm/script/ir_builder/tirx/triton.py
rename to python/tvm/tirx/script/ir_builder/triton.py
diff --git a/python/tvm/script/ir_builder/tirx/utils.py 
b/python/tvm/tirx/script/ir_builder/utils.py
similarity index 99%
rename from python/tvm/script/ir_builder/tirx/utils.py
rename to python/tvm/tirx/script/ir_builder/utils.py
index 7f72c46008..5edf425b95 100644
--- a/python/tvm/script/ir_builder/tirx/utils.py
+++ b/python/tvm/tirx/script/ir_builder/utils.py
@@ -213,7 +213,7 @@ def buffer_proxy(buf: Buffer) -> _BufferProxy:
     --------
     .. code-block:: python
 
-        from tvm.script.ir_builder.tirx.utils import buffer_proxy
+        from tvm.tirx.script.ir_builder.utils import buffer_proxy
 
         buf = tvm.tirx.decl_buffer([2, 3], "float32")
         ptr = buffer_proxy(buf)
diff --git a/python/tvm/tirx/script/jit.py b/python/tvm/tirx/script/jit.py
index b93a5b9bb1..c636d8d92d 100644
--- a/python/tvm/tirx/script/jit.py
+++ b/python/tvm/tirx/script/jit.py
@@ -257,7 +257,7 @@ class TIRJit:
             return cached
 
         if self.builder is None:
-            from tvm.script.ir_builder import tirx as builder
+            from tvm.tirx.script import ir_builder as builder
         else:
             builder = self.builder
         prim_func = parse(
diff --git a/python/tvm/tirx/script/tile.py b/python/tvm/tirx/script/tile.py
index a9d4921f03..bad6774f99 100644
--- a/python/tvm/tirx/script/tile.py
+++ b/python/tvm/tirx/script/tile.py
@@ -19,8 +19,8 @@
 import functools
 
 from tvm.ir import TensorRegion
-from tvm.script.ir_builder.tirx import tirx as _builder
 from tvm.tirx import is_buffer_var
+from tvm.tirx.script.ir_builder import tirx as _builder
 
 
 def _get_arg(args, kwargs, index, name):
diff --git a/python/tvm/topi/gpu/scan.py b/python/tvm/topi/gpu/scan.py
index e576e7d3e8..5e69a613d2 100644
--- a/python/tvm/topi/gpu/scan.py
+++ b/python/tvm/topi/gpu/scan.py
@@ -24,7 +24,7 @@ import tvm
 from tvm import te
 from tvm.contrib.thrust import can_use_rocthrust, can_use_thrust
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from ..math import cast, ceil_log2
 from ..transform import expand_dims, reshape, squeeze, transpose
diff --git a/python/tvm/topi/gpu/scatter_elements.py 
b/python/tvm/topi/gpu/scatter_elements.py
index 5049670e35..d778a4f080 100644
--- a/python/tvm/topi/gpu/scatter_elements.py
+++ b/python/tvm/topi/gpu/scatter_elements.py
@@ -20,7 +20,7 @@
 import tvm
 from tvm import te, tirx
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from .. import utils
 from ..math import cast
diff --git a/python/tvm/topi/gpu/scatter_nd.py 
b/python/tvm/topi/gpu/scatter_nd.py
index 6f90477fc5..ed0015174c 100644
--- a/python/tvm/topi/gpu/scatter_nd.py
+++ b/python/tvm/topi/gpu/scatter_nd.py
@@ -21,7 +21,7 @@
 import tvm
 from tvm import te, tirx  # hide redefinition of min and max
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from ..math import cast
 from ..scatter import _verify_scatter_nd_inputs
diff --git a/python/tvm/topi/gpu/sort.py b/python/tvm/topi/gpu/sort.py
index 9b9871e6c3..5d38addf92 100644
--- a/python/tvm/topi/gpu/sort.py
+++ b/python/tvm/topi/gpu/sort.py
@@ -21,7 +21,7 @@
 import tvm
 from tvm import te
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from ..math import cast, ceil_log2
 from ..searchsorted import binary_search
diff --git a/python/tvm/topi/index_put.py b/python/tvm/topi/index_put.py
index 08ba1fbecc..f2ee79a905 100644
--- a/python/tvm/topi/index_put.py
+++ b/python/tvm/topi/index_put.py
@@ -19,7 +19,7 @@
 
 from tvm import te, tirx
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from . import utils
 
diff --git a/python/tvm/topi/scan.py b/python/tvm/topi/scan.py
index 591eb9b9cd..57bb003777 100644
--- a/python/tvm/topi/scan.py
+++ b/python/tvm/topi/scan.py
@@ -22,7 +22,7 @@ from collections.abc import Callable
 
 import tvm
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from ..te import extern
 from ..tirx import decl_buffer
diff --git a/python/tvm/topi/scatter.py b/python/tvm/topi/scatter.py
index 05c3dba215..1bfef89b5c 100644
--- a/python/tvm/topi/scatter.py
+++ b/python/tvm/topi/scatter.py
@@ -20,8 +20,8 @@
 
 from tvm import DataTypeCode, ir, te, tirx  # hide redefinition of min and max
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
 from tvm.sym.analyzer import Analyzer
+from tvm.tirx.script import ir_builder as T
 
 
 def _verify_scatter_nd_inputs(data, indices, updates):
diff --git a/python/tvm/topi/scatter_elements.py 
b/python/tvm/topi/scatter_elements.py
index f1b28fed07..ebe37bfb01 100644
--- a/python/tvm/topi/scatter_elements.py
+++ b/python/tvm/topi/scatter_elements.py
@@ -18,7 +18,7 @@
 
 from tvm import te, tirx
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from . import utils
 from .math import cast
diff --git a/python/tvm/topi/searchsorted.py b/python/tvm/topi/searchsorted.py
index 36db4676f9..7adf407870 100644
--- a/python/tvm/topi/searchsorted.py
+++ b/python/tvm/topi/searchsorted.py
@@ -18,7 +18,7 @@
 """searchsorted operator"""
 
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 from . import te, utils
 from .math import cast
diff --git a/python/tvm/topi/signal.py b/python/tvm/topi/signal.py
index c3c38854b7..41c488d263 100644
--- a/python/tvm/topi/signal.py
+++ b/python/tvm/topi/signal.py
@@ -21,7 +21,7 @@ from math import pi
 
 from tvm import ir, te, tirx
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def stft(
diff --git a/python/tvm/topi/sparse_reshape.py 
b/python/tvm/topi/sparse_reshape.py
index 2017ced6cb..4676fbd6da 100644
--- a/python/tvm/topi/sparse_reshape.py
+++ b/python/tvm/topi/sparse_reshape.py
@@ -18,9 +18,9 @@
 """Sparse_Reshape operator"""
 
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
 from tvm.te import div, extern, floordiv, floormod
 from tvm.tirx import Cast, decl_buffer
+from tvm.tirx.script import ir_builder as T
 
 
 def sparse_reshape(
diff --git a/python/tvm/topi/unique.py b/python/tvm/topi/unique.py
index 6135f6c8f6..d07aca847e 100644
--- a/python/tvm/topi/unique.py
+++ b/python/tvm/topi/unique.py
@@ -19,7 +19,7 @@
 
 from tvm import te, tirx
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def _calc_adjacent_diff_ir(data, output, binop=tirx.Sub):
diff --git a/python/tvm/topi/vision/nms.py b/python/tvm/topi/vision/nms.py
index a82056f541..4953d0a099 100644
--- a/python/tvm/topi/vision/nms.py
+++ b/python/tvm/topi/vision/nms.py
@@ -20,8 +20,8 @@
 import tvm
 from tvm import te
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
 from tvm.tirx import if_then_else
+from tvm.tirx.script import ir_builder as T
 
 from .. import reduction
 from ..math import cast
diff --git a/python/tvm/topi/vision/nms_util.py 
b/python/tvm/topi/vision/nms_util.py
index a55bedb697..7a13279f14 100644
--- a/python/tvm/topi/vision/nms_util.py
+++ b/python/tvm/topi/vision/nms_util.py
@@ -21,7 +21,7 @@
 import tvm
 from tvm import te
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def _get_boundaries(output, box_idx):
diff --git a/tests/python/codegen/test_target_codegen_vulkan.py 
b/tests/python/codegen/test_target_codegen_vulkan.py
index 9ac20f0236..597ccd084e 100644
--- a/tests/python/codegen/test_target_codegen_vulkan.py
+++ b/tests/python/codegen/test_target_codegen_vulkan.py
@@ -27,8 +27,8 @@ from tvm.script import ir as I
 from tvm.script import ir_builder as I_builder
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T_builder
 from tvm.testing import env
+from tvm.tirx.script import ir_builder as T_builder
 
 dtype = tvm.testing.parameter("float32", "int32", "float16", "int8")
 fuzz_seed = tvm.testing.parameter(range(25))
diff --git a/tests/python/relax/backend/adreno/mod_utils.py 
b/tests/python/relax/backend/adreno/mod_utils.py
index ab08434c29..9bc518bc90 100644
--- a/tests/python/relax/backend/adreno/mod_utils.py
+++ b/tests/python/relax/backend/adreno/mod_utils.py
@@ -26,11 +26,11 @@ import tvm
 import tvm.testing
 from tvm import relax, rpc
 from tvm.relax.backend.adreno import clml
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def get_relax_conv2d_mod(
diff --git a/tests/python/relax/backend/adreno/test_clml_ops.py 
b/tests/python/relax/backend/adreno/test_clml_ops.py
index 428f21abdf..df8d34adab 100644
--- a/tests/python/relax/backend/adreno/test_clml_ops.py
+++ b/tests/python/relax/backend/adreno/test_clml_ops.py
@@ -51,11 +51,11 @@ import tvm.testing
 from tvm import relax, rpc
 from tvm.relax.backend.adreno import clml
 from tvm.relax.backend.adreno.clml import OpenCLMLOffLoad, 
OpenCLMLOffLoadForLLM
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 CLML_VERSION = clml.clml_sdk_version()
 TARGET_CLML_VERSION = int(os.environ.get("ADRENO_TARGET_CLML_VERSION", 4))
diff --git a/tests/python/relax/backend/adreno/test_texture_network.py 
b/tests/python/relax/backend/adreno/test_texture_network.py
index 0b7bcfcd74..456415960b 100644
--- a/tests/python/relax/backend/adreno/test_texture_network.py
+++ b/tests/python/relax/backend/adreno/test_texture_network.py
@@ -31,12 +31,12 @@ import tvm
 import tvm.testing
 from tvm import relax
 from tvm.relax.frontend.onnx import from_onnx
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.transform.legalize_ops import adreno as legalize_adreno
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 TARGETS = [tvm.target.Target("qcom/adreno-opencl-texture")]
 
diff --git a/tests/python/relax/test_codegen_cublas.py 
b/tests/python/relax/test_codegen_cublas.py
index f273ebf8ef..2e5f431a2f 100644
--- a/tests/python/relax/test_codegen_cublas.py
+++ b/tests/python/relax/test_codegen_cublas.py
@@ -27,10 +27,10 @@ pytest.importorskip("scipy")  # tvm.topi.testing imports 
scipy
 import tvm.topi.testing
 from tvm import relax
 from tvm.relax.backend.cuda.cublas import partition_for_cublas
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.testing import get_relax_matmul_module
 from tvm.script import relax as R
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 try:
     import ml_dtypes
diff --git a/tests/python/relax/test_codegen_cudnn.py 
b/tests/python/relax/test_codegen_cudnn.py
index b934cf9967..950d9cb7a4 100644
--- a/tests/python/relax/test_codegen_cudnn.py
+++ b/tests/python/relax/test_codegen_cudnn.py
@@ -28,10 +28,10 @@ import tvm.topi.testing
 from tvm import relax
 from tvm.contrib.pickle_memoize import memoize
 from tvm.relax.backend.cuda.cudnn import partition_for_cudnn
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.testing import get_relax_stacked_attention_module
 from tvm.script import relax as R
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 @pytest.fixture(autouse=True)
diff --git a/tests/python/relax/test_codegen_cutlass.py 
b/tests/python/relax/test_codegen_cutlass.py
index b26c15fc0c..ff4c764974 100644
--- a/tests/python/relax/test_codegen_cutlass.py
+++ b/tests/python/relax/test_codegen_cutlass.py
@@ -29,6 +29,7 @@ from tvm import relax
 from tvm.contrib.cutlass.build import is_shape_valid_for_cutlass_matmul
 from tvm.contrib.pickle_memoize import memoize
 from tvm.relax.backend.cuda.cutlass import partition_for_cutlass
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.testing import (
     get_relax_attention_module,
     get_relax_matmul_module,
@@ -38,7 +39,6 @@ from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 @pytest.fixture(autouse=True)
@@ -891,9 +891,9 @@ def attention_rewrite_size(request):
 def get_relax_attention_rewrite_module(
     q_shape, k_shape, v_shape, out_shape, dtype, bias_shape=None, scale=None
 ):
+    from tvm.relax.script import ir_builder as relax_builder
     from tvm.script.ir_builder import IRBuilder
-    from tvm.script.ir_builder import relax as relax_builder
-    from tvm.script.ir_builder import tirx as T
+    from tvm.tirx.script import ir_builder as T
 
     with IRBuilder() as builder:
         with relax_builder.function():
diff --git 
a/tests/python/relax/test_transform_attach_attr_layout_free_buffers.py 
b/tests/python/relax/test_transform_attach_attr_layout_free_buffers.py
index c21b9a6475..65c428c7a2 100644
--- a/tests/python/relax/test_transform_attach_attr_layout_free_buffers.py
+++ b/tests/python/relax/test_transform_attach_attr_layout_free_buffers.py
@@ -19,12 +19,12 @@ import numpy as np
 
 import tvm.testing
 from tvm import relax, tirx
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.transform import CombineParallelMatmul
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def test_param():
diff --git a/tests/python/relax/test_transform_combine_parallel_matmul.py 
b/tests/python/relax/test_transform_combine_parallel_matmul.py
index 57be71ae88..0269d7b070 100644
--- a/tests/python/relax/test_transform_combine_parallel_matmul.py
+++ b/tests/python/relax/test_transform_combine_parallel_matmul.py
@@ -19,11 +19,11 @@ import pytest
 
 import tvm.testing
 from tvm import relax, tirx
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.relax.transform import CombineParallelMatmul
 from tvm.script import relax as R
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def get_parallel_matmul(
diff --git a/tests/python/relax/test_transform_fold_batch_norm_to_conv2d.py 
b/tests/python/relax/test_transform_fold_batch_norm_to_conv2d.py
index be2dcace3b..dbdd653fef 100644
--- a/tests/python/relax/test_transform_fold_batch_norm_to_conv2d.py
+++ b/tests/python/relax/test_transform_fold_batch_norm_to_conv2d.py
@@ -24,10 +24,10 @@ import tvm.testing
 from tvm import relax
 from tvm.ir.module import IRModule
 from tvm.relax.expr_functor import PyExprVisitor, visitor
+from tvm.relax.script import ir_builder as relax_builder
 from tvm.script import ir as I
 from tvm.script import relax as R
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import relax as relax_builder
 
 
 def get_conv2d_batchnorm_sample():
diff --git a/tests/python/relax/test_tvmscript_ir_builder.py 
b/tests/python/relax/test_tvmscript_ir_builder.py
index 995e260f47..8f06282ca0 100644
--- a/tests/python/relax/test_tvmscript_ir_builder.py
+++ b/tests/python/relax/test_tvmscript_ir_builder.py
@@ -18,7 +18,7 @@
 import tvm
 import tvm.testing
 from tvm import relax, tirx, topi
-from tvm.script.ir_builder import relax as R
+from tvm.relax.script import ir_builder as R
 from tvm.script.ir_builder.base import IRBuilder
 
 
@@ -165,7 +165,7 @@ def test_dataflow_block():
 
 def test_regression_py_print():
     # Test that the py_print directs to python builtin print
-    from tvm.script.ir_builder.relax.ir import py_print  # pylint: 
disable=import-outside-toplevel
+    from tvm.relax.script.ir_builder.ir import py_print  # pylint: 
disable=import-outside-toplevel
 
     assert py_print == print
 
diff --git a/tests/python/tirx/test_layout.py b/tests/python/tirx/test_layout.py
index d7f20f4a1c..b562535760 100644
--- a/tests/python/tirx/test_layout.py
+++ b/tests/python/tirx/test_layout.py
@@ -26,7 +26,6 @@ from tvm.ir import assert_structural_equal
 from tvm.ir.type import PointerType, PrimType
 from tvm.script import tirx as T
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as Tx_builder
 from tvm.sym import Analyzer
 from tvm.tirx import Var
 from tvm.tirx.cuda.tile_primitive.tma_utils import (
@@ -54,6 +53,7 @@ from tvm.tirx.layout import (
     wgid,
     wid_in_wg,
 )
+from tvm.tirx.script import ir_builder as Tx_builder
 
 
 def test_axis():
diff --git a/tests/python/tirx/test_op.py b/tests/python/tirx/test_op.py
index bc728d7863..b9bfead5f9 100644
--- a/tests/python/tirx/test_op.py
+++ b/tests/python/tirx/test_op.py
@@ -103,7 +103,7 @@ def test_buffer_replacer_replaces_strides_and_elem_offset():
 
 def test_gemm_async_partial_scale_factor():
     """Regression test for F7: gemm_async must reject partial scale factors."""
-    from tvm.script.ir_builder.tirx.tirx import gemm_async
+    from tvm.tirx.script.ir_builder.tirx import gemm_async
 
     A = decl_buffer((64, 64), "float16", scope="shared")
     B = decl_buffer((64, 64), "float16", scope="shared")
diff --git a/tests/python/tirx/test_op_namespace_cleanup.py 
b/tests/python/tirx/test_op_namespace_cleanup.py
index 6f23681a3c..1811a59a40 100644
--- a/tests/python/tirx/test_op_namespace_cleanup.py
+++ b/tests/python/tirx/test_op_namespace_cleanup.py
@@ -160,7 +160,7 @@ def 
test_device_intrinsic_namespaces_are_canonical_and_classified():
     )
     from tvm.backend.metal.script import MetalNamespace as 
BackendMetalNamespace
     from tvm.backend.trn.script import NKINamespace as BackendNKINamespace
-    from tvm.script.ir_builder.tirx import ir as builder_ir
+    from tvm.tirx.script.ir_builder import ir as builder_ir
 
     assert isinstance(builder_ir.cuda, BackendCUDANamespace)
     assert isinstance(builder_ir.s_tir, BackendSTIRNamespace)
@@ -229,9 +229,9 @@ def test_backend_specific_wrappers_are_not_root_exports():
 
 
 def test_backend_load_updates_tirx_alias_and_script_facades(monkeypatch):
-    from tvm.script.ir_builder import tirx as builder
-    from tvm.script.ir_builder.tirx import ir as builder_ir
     from tvm.script.parser import tirx as parser
+    from tvm.tirx.script import ir_builder as builder
+    from tvm.tirx.script.ir_builder import ir as builder_ir
 
     backend_name = "unit_test_backend"
     backend_module_name = f"tvm.backend.{backend_name}"
diff --git a/tests/python/tirx/test_parser_printer.py 
b/tests/python/tirx/test_parser_printer.py
index d507cad6bc..b42be2e233 100644
--- a/tests/python/tirx/test_parser_printer.py
+++ b/tests/python/tirx/test_parser_printer.py
@@ -1088,7 +1088,7 @@ def test_scalar_assign_error_not_swallowed():
     swallowed and the assignment would silently fall through to eval_assign."""
     from unittest.mock import patch
 
-    original = tvm.script.ir_builder.tirx.buffer_store
+    original = tvm.tirx.script.ir_builder.buffer_store
 
     def bomb(*args, **kwargs):
         # Intercept only the scalar-assignment path (indices == [0])
@@ -1107,7 +1107,7 @@ def func():
 """
     # The ValueError propagates unchanged. A broad ``except Exception`` here
     # previously swallowed it and fell through to eval_assign.
-    with patch("tvm.script.ir_builder.tirx.buffer_store", side_effect=bomb):
+    with patch("tvm.tirx.script.ir_builder.buffer_store", side_effect=bomb):
         with pytest.raises(ValueError, match="boom"):
             from_source(src)
 
diff --git a/tests/python/tvmscript/test_tvmscript_ir_builder_tir.py 
b/tests/python/tvmscript/test_tvmscript_ir_builder_tir.py
index 66631d4529..567398e0a8 100644
--- a/tests/python/tvmscript/test_tvmscript_ir_builder_tir.py
+++ b/tests/python/tvmscript/test_tvmscript_ir_builder_tir.py
@@ -16,7 +16,7 @@
 # under the License.
 # pylint: disable=invalid-name, missing-docstring
 # ruff: noqa: F401, F841
-"""Unittests for tvm.script.ir_builder.tirx"""
+"""Unittests for tvm.tirx.script.ir_builder"""
 
 import numpy as np
 import pytest
@@ -27,7 +27,7 @@ import tvm.testing
 from tvm import s_tir, tirx
 from tvm.ir.base import SourceName, Span, assert_structural_equal
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def test_ir_builder_tir_primfunc_base():
diff --git a/tests/python/tvmscript/test_tvmscript_parser_evaluator.py 
b/tests/python/tvmscript/test_tvmscript_parser_evaluator.py
index 684b191e4d..7c600e5641 100644
--- a/tests/python/tvmscript/test_tvmscript_parser_evaluator.py
+++ b/tests/python/tvmscript/test_tvmscript_parser_evaluator.py
@@ -20,8 +20,8 @@
 import pytest
 
 import tvm.testing
-from tvm.script.ir_builder import tirx as T
 from tvm.script.parser.entry import _run_statements
+from tvm.tirx.script import ir_builder as T
 
 
 def _calc(expr, extra_vars=None):
diff --git a/tests/python/tvmscript/test_tvmscript_printer_ir.py 
b/tests/python/tvmscript/test_tvmscript_printer_ir.py
index a18bdb6a7b..1b0b9b34b0 100644
--- a/tests/python/tvmscript/test_tvmscript_printer_ir.py
+++ b/tests/python/tvmscript/test_tvmscript_printer_ir.py
@@ -21,7 +21,7 @@ import pytest
 from tvm import IRModule
 from tvm.script import ir_builder as I
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def _assert_print(obj, expected):
diff --git a/tests/python/tvmscript/test_tvmscript_printer_tir.py 
b/tests/python/tvmscript/test_tvmscript_printer_tir.py
index 61e6920a73..9c096fc968 100644
--- a/tests/python/tvmscript/test_tvmscript_printer_tir.py
+++ b/tests/python/tvmscript/test_tvmscript_printer_tir.py
@@ -25,7 +25,7 @@ import tvm.testing
 from tvm import ir, s_tir, tirx
 from tvm.ir import Range
 from tvm.script.ir_builder import IRBuilder
-from tvm.script.ir_builder import tirx as T
+from tvm.tirx.script import ir_builder as T
 
 
 def _assert_print(obj, expected):

Reply via email to