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

syfeng 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 8d555a08df [REFACTOR] Cleanup legacy relay runtime data structures 
(#17713)
8d555a08df is described below

commit 8d555a08df85cd55dec71018dedfdfdfb51e413d
Author: Tianqi Chen <[email protected]>
AuthorDate: Thu Mar 6 22:23:34 2025 -0500

    [REFACTOR] Cleanup legacy relay runtime data structures (#17713)
    
    This PR cleans up legacy relay runtime data structures
    ADT and closure as they can be superseded by Array and
    VMClosure in the relax VM.
---
 include/tvm/runtime/container/adt.h        | 143 -----------------------------
 include/tvm/runtime/container/closure.h    |  52 -----------
 include/tvm/runtime/object.h               |   2 -
 include/tvm/runtime/relax_vm/executable.h  |   1 -
 include/tvm/runtime/relax_vm/vm.h          |   8 +-
 python/tvm/relax/op/base.py                |  10 --
 python/tvm/runtime/container.py            |  53 -----------
 python/tvm/runtime/name_transforms.py      |  32 -------
 python/tvm/runtime/profiler_vm.py          |  91 ------------------
 src/node/structural_hash.cc                |  27 ------
 src/runtime/container.cc                   |  47 ----------
 src/runtime/relax_vm/vm.cc                 |   8 +-
 tests/cpp/container_test.cc                |  14 ---
 tests/python/relax/test_relax_operators.py |   2 +-
 14 files changed, 9 insertions(+), 481 deletions(-)

diff --git a/include/tvm/runtime/container/adt.h 
b/include/tvm/runtime/container/adt.h
deleted file mode 100644
index 013a055bd0..0000000000
--- a/include/tvm/runtime/container/adt.h
+++ /dev/null
@@ -1,143 +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.
- */
-
-/*!
- * \file tvm/runtime/container/adt.h
- * \brief Runtime ADT container types.
- */
-#ifndef TVM_RUNTIME_CONTAINER_ADT_H_
-#define TVM_RUNTIME_CONTAINER_ADT_H_
-
-#include <utility>
-#include <vector>
-
-#include "./base.h"
-
-namespace tvm {
-namespace runtime {
-
-/*! \brief An object representing a structure or enumeration. */
-class ADTObj : public Object, public InplaceArrayBase<ADTObj, ObjectRef> {
- public:
-  /*! \brief The tag representing the constructor used. */
-  int32_t tag;
-  /*! \brief Number of fields in the ADT object. */
-  uint32_t size;
-  // The fields of the structure follows directly in memory.
-
-  static constexpr const uint32_t _type_index = TypeIndex::kRuntimeADT;
-  static constexpr const char* _type_key = "runtime.ADT";
-  TVM_DECLARE_FINAL_OBJECT_INFO(ADTObj, Object);
-
- private:
-  /*!
-   * \return The number of elements in the array.
-   */
-  size_t GetSize() const { return size; }
-
-  /*!
-   * \brief Initialize the elements in the array.
-   *
-   * \tparam Iterator Iterator type of the array.
-   * \param begin The begin iterator.
-   * \param end The end iterator.
-   */
-  template <typename Iterator>
-  void Init(Iterator begin, Iterator end) {
-    size_t num_elems = std::distance(begin, end);
-    this->size = 0;
-    auto it = begin;
-    for (size_t i = 0; i < num_elems; ++i) {
-      InplaceArrayBase::EmplaceInit(i, *it++);
-      // Only increment size after the initialization succeeds
-      this->size++;
-    }
-  }
-
-  friend class ADT;
-  friend InplaceArrayBase<ADTObj, ObjectRef>;
-};
-
-/*! \brief reference to algebraic data type objects. */
-class ADT : public ObjectRef {
- public:
-  /*!
-   * \brief construct an ADT object reference.
-   * \param tag The tag of the ADT object.
-   * \param fields The fields of the ADT object.
-   */
-  ADT(int32_t tag, std::vector<ObjectRef> fields) : ADT(tag, fields.begin(), 
fields.end()){};
-
-  /*!
-   * \brief construct an ADT object reference.
-   * \param tag The tag of the ADT object.
-   * \param begin The begin iterator to the start of the fields array.
-   * \param end The end iterator to the end of the fields array.
-   */
-  template <typename Iterator>
-  ADT(int32_t tag, Iterator begin, Iterator end) {
-    size_t num_elems = std::distance(begin, end);
-    auto ptr = make_inplace_array_object<ADTObj, ObjectRef>(num_elems);
-    ptr->tag = tag;
-    ptr->Init(begin, end);
-    data_ = std::move(ptr);
-  }
-
-  /*!
-   * \brief construct an ADT object reference.
-   * \param tag The tag of the ADT object.
-   * \param init The initializer list of fields.
-   */
-  ADT(int32_t tag, std::initializer_list<ObjectRef> init) : ADT(tag, 
init.begin(), init.end()){};
-
-  /*!
-   * \brief Access element at index.
-   *
-   * \param idx The array index
-   * \return const ObjectRef
-   */
-  const ObjectRef& operator[](size_t idx) const { return 
operator->()->operator[](idx); }
-
-  /*!
-   * \brief Return the ADT tag.
-   */
-  int32_t tag() const { return operator->()->tag; }
-
-  /*!
-   * \brief Return the number of fields.
-   */
-  size_t size() const { return operator->()->size; }
-
-  /*!
-   * \brief Construct a tuple object.
-   *
-   * \tparam Args Type params of tuple feilds.
-   * \param args Tuple fields.
-   * \return ADT The tuple object reference.
-   */
-  template <typename... Args>
-  static ADT Tuple(Args&&... args) {
-    return ADT(0, std::forward<Args>(args)...);
-  }
-
-  TVM_DEFINE_OBJECT_REF_METHODS(ADT, ObjectRef, ADTObj);
-};
-}  // namespace runtime
-}  // namespace tvm
-#endif  // TVM_RUNTIME_CONTAINER_ADT_H_
diff --git a/include/tvm/runtime/container/closure.h 
b/include/tvm/runtime/container/closure.h
deleted file mode 100644
index a280d1ada7..0000000000
--- a/include/tvm/runtime/container/closure.h
+++ /dev/null
@@ -1,52 +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.
- */
-
-/*!
- * \file tvm/runtime/container/closure.h
- * \brief Runtime Closure container types.
- */
-#ifndef TVM_RUNTIME_CONTAINER_CLOSURE_H_
-#define TVM_RUNTIME_CONTAINER_CLOSURE_H_
-
-#include "./base.h"
-
-namespace tvm {
-namespace runtime {
-
-/*!
- * \brief An object representing a closure. This object is used by both the
- * Relay VM and interpreter.
- */
-class ClosureObj : public Object {
- public:
-  static constexpr const uint32_t _type_index = TypeIndex::kRuntimeClosure;
-  static constexpr const char* _type_key = "runtime.Closure";
-  TVM_DECLARE_BASE_OBJECT_INFO(ClosureObj, Object);
-};
-
-/*! \brief reference to closure. */
-class Closure : public ObjectRef {
- public:
-  TVM_DEFINE_OBJECT_REF_METHODS(Closure, ObjectRef, ClosureObj);
-};
-
-}  // namespace runtime
-}  // namespace tvm
-
-#endif  // TVM_RUNTIME_CONTAINER_CLOSURE_H_
diff --git a/include/tvm/runtime/object.h b/include/tvm/runtime/object.h
index ea31fcac48..81dcb43c0b 100644
--- a/include/tvm/runtime/object.h
+++ b/include/tvm/runtime/object.h
@@ -77,8 +77,6 @@ struct TypeIndex {
     /*! \brief runtime::RPCObjectRef */
     kRuntimeRPCObjectRef = 9,
     // static assignments that may subject to change.
-    kRuntimeClosure,
-    kRuntimeADT,
     kStaticIndexEnd,
     /*! \brief Type index is allocated during runtime. */
     kDynamic = kStaticIndexEnd
diff --git a/include/tvm/runtime/relax_vm/executable.h 
b/include/tvm/runtime/relax_vm/executable.h
index 845842f22a..e953d94eb9 100644
--- a/include/tvm/runtime/relax_vm/executable.h
+++ b/include/tvm/runtime/relax_vm/executable.h
@@ -23,7 +23,6 @@
 #ifndef TVM_RUNTIME_RELAX_VM_EXECUTABLE_H_
 #define TVM_RUNTIME_RELAX_VM_EXECUTABLE_H_
 
-#include <tvm/runtime/container/closure.h>
 #include <tvm/runtime/object.h>
 #include <tvm/runtime/packed_func.h>
 #include <tvm/runtime/registry.h>
diff --git a/include/tvm/runtime/relax_vm/vm.h 
b/include/tvm/runtime/relax_vm/vm.h
index da833d5d6c..607269d812 100644
--- a/include/tvm/runtime/relax_vm/vm.h
+++ b/include/tvm/runtime/relax_vm/vm.h
@@ -60,7 +60,7 @@ enum class VMInstrumentReturnKind : int {
 /*!
  * \brief An object representing a vm closure.
  */
-class VMClosureObj : public ClosureObj {
+class VMClosureObj : public Object {
  public:
   /*!
    * \brief The function name. The function could be any
@@ -78,14 +78,14 @@ class VMClosureObj : public ClosureObj {
 
   static constexpr const uint32_t _type_index = TypeIndex::kDynamic;
   static constexpr const char* _type_key = "relax.vm.Closure";
-  TVM_DECLARE_FINAL_OBJECT_INFO(VMClosureObj, ClosureObj);
+  TVM_DECLARE_FINAL_OBJECT_INFO(VMClosureObj, Object);
 };
 
 /*! \brief reference to closure. */
-class VMClosure : public Closure {
+class VMClosure : public ObjectRef {
  public:
   VMClosure(String func_name, PackedFunc impl);
-  TVM_DEFINE_OBJECT_REF_METHODS(VMClosure, Closure, VMClosureObj);
+  TVM_DEFINE_OBJECT_REF_METHODS(VMClosure, ObjectRef, VMClosureObj);
 
   /*!
    * \brief Create another PackedFunc with last arguments already bound to 
last_args.
diff --git a/python/tvm/relax/op/base.py b/python/tvm/relax/op/base.py
index 03e86a4633..b0570344e5 100644
--- a/python/tvm/relax/op/base.py
+++ b/python/tvm/relax/op/base.py
@@ -416,16 +416,6 @@ def render_object(val: tvm.Object) -> str:
     """
     if isinstance(val, tvm.nd.NDArray):
         return str(val)
-    # no pretty-printer by default, so if we don't handle this,
-    # then we can't look inside tuples
-    if isinstance(val, tvm.runtime.container.ADT):
-        # the fields array of an ADT cannot be directly accessed in Python
-        # so we have to get the length and index into the fields separately
-        fields = ", ".join([render_object(val[i]) for i in range(len(val))])
-        # special case: tag = 0 is a tuple
-        if val.tag == 0:
-            return f"({fields})"
-        return f"ADT(tag={val.tag}, fields=[{fields}])"
     if isinstance(val, tvm.ir.Array):
         fields = ", ".join([render_object(val[i]) for i in range(len(val))])
         return f"({fields})"
diff --git a/python/tvm/runtime/container.py b/python/tvm/runtime/container.py
index f1a0706a38..1bc8d798ef 100644
--- a/python/tvm/runtime/container.py
+++ b/python/tvm/runtime/container.py
@@ -17,7 +17,6 @@
 """Runtime container structures."""
 import tvm._ffi
 from .object import Object, PyNativeObject
-from .object_generic import ObjectTypes
 from . import _ffi_api
 
 
@@ -60,58 +59,6 @@ def getitem_helper(obj, elem_getter, length, idx):
     return elem_getter(obj, idx)
 
 
-@tvm._ffi.register_object("runtime.ADT")
-class ADT(Object):
-    """Algebatic data type(ADT) object.
-
-    Parameters
-    ----------
-    tag : int
-        The tag of ADT.
-
-    fields : list[Object] or tuple[Object]
-        The source tuple.
-    """
-
-    def __init__(self, tag, fields):
-        for f in fields:
-            assert isinstance(
-                f, ObjectTypes
-            ), f"Expect object or tvm NDArray type, but received : {type(f)}"
-        self.__init_handle_by_constructor__(_ffi_api.ADT, tag, *fields)
-
-    @property
-    def tag(self):
-        return _ffi_api.GetADTTag(self)
-
-    def __getitem__(self, idx):
-        return getitem_helper(self, _ffi_api.GetADTFields, len(self), idx)
-
-    def __len__(self):
-        return _ffi_api.GetADTSize(self)
-
-
-def tuple_object(fields=None):
-    """Create a ADT object from source tuple.
-
-    Parameters
-    ----------
-    fields : list[Object] or tuple[Object]
-        The source tuple.
-
-    Returns
-    -------
-    ret : ADT
-        The created object.
-    """
-    fields = fields if fields else []
-    for f in fields:
-        assert isinstance(
-            f, ObjectTypes
-        ), f"Expect object or tvm NDArray type, but received : {type(f)}"
-    return _ffi_api.Tuple(*fields)
-
-
 @tvm._ffi.register_object("runtime.String")
 class String(str, PyNativeObject):
     """TVM runtime.String object, represented as a python str.
diff --git a/python/tvm/runtime/name_transforms.py 
b/python/tvm/runtime/name_transforms.py
deleted file mode 100644
index 402a47f1a1..0000000000
--- a/python/tvm/runtime/name_transforms.py
+++ /dev/null
@@ -1,32 +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.
-"""
-Name transformation functions shared in Backend and Runtime
-"""
-
-from . import _ffi_api
-
-
-def sanitize_name(original_name: str):
-    """Sanitize name for output into compiler artifacts
-
-    Parameters
-    ----------
-    original_name : str
-        Original name to sanitize
-    """
-    return _ffi_api.SanitizeName(original_name)
diff --git a/python/tvm/runtime/profiler_vm.py 
b/python/tvm/runtime/profiler_vm.py
deleted file mode 100644
index 4f625c0c67..0000000000
--- a/python/tvm/runtime/profiler_vm.py
+++ /dev/null
@@ -1,91 +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=no-else-return, unidiomatic-typecheck, undefined-variable, 
invalid-name, redefined-builtin
-"""
-The Relay Virtual Machine profiler.
-
-Provides extra APIs for profiling vm execution.
-"""
-import warnings
-from tvm.runtime import _ffi_api
-from tvm.rpc import base as rpc_base
-from . import vm
-from .profiling import Report
-
-
-def enabled():
-    """Whether vm profiler is enabled."""
-    return hasattr(_ffi_api, "_VirtualMachineDebug")
-
-
-class VirtualMachineProfiler(vm.VirtualMachine):
-    """Relay profile VM runtime."""
-
-    def __init__(self, exe, device, memory_cfg=None):
-        super(VirtualMachineProfiler, self).__init__(exe, device, memory_cfg)
-
-        # Make sure the constructor of the VM module is on the proper device
-        # Remote devices have device_type of their actual device_type + 
RPC_SESS_MASK
-        if device.device_type >= rpc_base.RPC_SESS_MASK:
-            self.module = 
device._rpc_sess.get_function("runtime._VirtualMachineDebug")(exe)
-        else:
-            self.module = _ffi_api._VirtualMachineDebug(exe.module)
-
-        self._init = self.module["init"]
-        self._invoke = self.module["invoke"]
-        self._profile = self.module["profile"]
-        self._profile_rpc = self.module["profile_rpc"]
-        self._set_input = self.module["set_input"]
-        self._setup_device(device, memory_cfg)
-
-    def get_stat(self, sort_by_time=True):  # pylint: disable=unused-argument
-        """Get the statistics of executed ops.
-
-        REMOVED, use profile method instead.
-        """
-        warnings.warn("get_stat has been removed, use profile instead")
-        return ""
-
-    def profile(self, *args, func_name="main", collectors=None, **kwargs):
-        """Profile a function call.
-
-        Parameters
-        ----------
-        func_name : str
-            The name of the function.
-
-        collectors : Optional[Sequence[MetricCollector]]
-            Extra metrics to collect. If profiling over RPC, collectors must 
be `None`.
-
-        args : list[tvm.runtime.NDArray] or list[np.ndarray]
-            The arguments to the function.
-
-        kwargs: dict of str to tvm.runtime.NDArray or np.ndarray
-            Named arguments to the function.
-
-        Returns
-        -------
-        timing_results : str
-            Overall and per-op timing results formatted in a table.
-        """
-        if args or kwargs:
-            self.set_input(func_name, *args, **kwargs)
-        if self.module.type_key == "rpc":
-            # We cannot serialize MetricCollectors over RPC
-            assert collectors is None, "Profiling with collectors is not 
supported over RPC"
-            return Report.from_json(self._profile_rpc(func_name))
-        return self._profile(func_name, collectors)
diff --git a/src/node/structural_hash.cc b/src/node/structural_hash.cc
index 1c2d766e0c..0a4d9d1335 100644
--- a/src/node/structural_hash.cc
+++ b/src/node/structural_hash.cc
@@ -25,7 +25,6 @@
 #include <tvm/node/object_path.h>
 #include <tvm/node/reflection.h>
 #include <tvm/node/structural_hash.h>
-#include <tvm/runtime/container/adt.h>
 #include <tvm/runtime/profiling.h>
 #include <tvm/runtime/registry.h>
 #include <tvm/target/codegen.h>
@@ -345,32 +344,6 @@ TVM_STATIC_IR_FUNCTOR(ReprPrinter, vtable)
       p->stream << '"' << support::StrEscape(op->data, op->size) << '"';
     });
 
-struct ADTObjTrait {
-  static constexpr const std::nullptr_t VisitAttrs = nullptr;
-
-  static void SHashReduce(const runtime::ADTObj* key, SHashReducer 
hash_reduce) {
-    hash_reduce(key->tag);
-    hash_reduce(static_cast<uint64_t>(key->size));
-    for (uint32_t i = 0; i < key->size; ++i) {
-      hash_reduce((*key)[i]);
-    }
-  }
-
-  static bool SEqualReduce(const runtime::ADTObj* lhs, const runtime::ADTObj* 
rhs,
-                           SEqualReducer equal) {
-    if (lhs == rhs) return true;
-    if (lhs->tag != rhs->tag) return false;
-    if (lhs->size != rhs->size) return false;
-
-    for (uint32_t i = 0; i < lhs->size; ++i) {
-      if (!equal((*lhs)[i], (*rhs)[i])) return false;
-    }
-    return true;
-  }
-};
-
-TVM_REGISTER_REFLECTION_VTABLE(runtime::ADTObj, ADTObjTrait);
-
 struct ModuleNodeTrait {
   static constexpr const std::nullptr_t VisitAttrs = nullptr;
   static constexpr const std::nullptr_t SHashReduce = nullptr;
diff --git a/src/runtime/container.cc b/src/runtime/container.cc
index 7b5105a3fc..cf1fa6c83a 100644
--- a/src/runtime/container.cc
+++ b/src/runtime/container.cc
@@ -21,9 +21,7 @@
  * \file src/runtime/container.cc
  * \brief Implementations of common containers.
  */
-#include <tvm/runtime/container/adt.h>
 #include <tvm/runtime/container/array.h>
-#include <tvm/runtime/container/closure.h>
 #include <tvm/runtime/container/map.h>
 #include <tvm/runtime/container/shape_tuple.h>
 #include <tvm/runtime/container/string.h>
@@ -66,48 +64,6 @@ TVM_REGISTER_GLOBAL("runtime.ArraySize").set_body([](TVMArgs 
args, TVMRetValue*
   *ret = static_cast<int64_t>(static_cast<const ArrayNode*>(ptr)->size());
 });
 
-// ADT
-
-TVM_REGISTER_OBJECT_TYPE(ADTObj);
-
-TVM_REGISTER_GLOBAL("runtime.GetADTTag").set_body([](TVMArgs args, 
TVMRetValue* rv) {
-  ObjectRef obj = args[0];
-  const auto& adt = Downcast<ADT>(obj);
-  *rv = static_cast<int64_t>(adt.tag());
-});
-
-TVM_REGISTER_GLOBAL("runtime.GetADTSize").set_body([](TVMArgs args, 
TVMRetValue* rv) {
-  ObjectRef obj = args[0];
-  const auto& adt = Downcast<ADT>(obj);
-  *rv = static_cast<int64_t>(adt.size());
-});
-
-TVM_REGISTER_GLOBAL("runtime.GetADTFields").set_body([](TVMArgs args, 
TVMRetValue* rv) {
-  ObjectRef obj = args[0];
-  int idx = args[1];
-  const auto& adt = Downcast<ADT>(obj);
-  ICHECK_LT(idx, adt.size());
-  *rv = adt[idx];
-});
-
-TVM_REGISTER_GLOBAL("runtime.Tuple").set_body([](TVMArgs args, TVMRetValue* 
rv) {
-  std::vector<ObjectRef> fields;
-  for (auto i = 0; i < args.size(); ++i) {
-    fields.push_back(args[i]);
-  }
-  *rv = ADT::Tuple(fields);
-});
-
-TVM_REGISTER_GLOBAL("runtime.ADT").set_body([](TVMArgs args, TVMRetValue* rv) {
-  int itag = args[0];
-  size_t tag = static_cast<size_t>(itag);
-  std::vector<ObjectRef> fields;
-  for (int i = 1; i < args.size(); i++) {
-    fields.push_back(args[i]);
-  }
-  *rv = ADT(tag, fields);
-});
-
 // String
 TVM_REGISTER_OBJECT_TYPE(StringObj);
 
@@ -180,9 +136,6 @@ TVM_REGISTER_GLOBAL("runtime.MapItems").set_body([](TVMArgs 
args, TVMRetValue* r
   *ret = std::move(rkvs);
 });
 
-// Closure
-TVM_REGISTER_OBJECT_TYPE(ClosureObj);
-
 // ShapeTuple
 TVM_REGISTER_OBJECT_TYPE(ShapeTupleObj);
 
diff --git a/src/runtime/relax_vm/vm.cc b/src/runtime/relax_vm/vm.cc
index ebb5afb1f4..1442f6cd06 100644
--- a/src/runtime/relax_vm/vm.cc
+++ b/src/runtime/relax_vm/vm.cc
@@ -70,12 +70,12 @@ PackedFunc VMClosure::BindLastArgs(PackedFunc func, 
std::vector<TVMRetValue> las
 // Utility functions.
 //-----------------------------------------------------------
 // Use the args after `starting_arg_idx` as a series of indices into `obj`,
-// indexing into nested ADTs and returning the final indexed object.
+// indexing into nested Array and returning the final indexed object.
 ObjectRef IndexIntoNestedObject(ObjectRef obj, TVMArgs args, int 
starting_arg_idx) {
   for (int i = starting_arg_idx; i < args.size(); i++) {
-    // the object must be an ADT to be able to index into it
+    // the object must be an Array to be able to index into it
     if (!obj.as<ArrayNode>()) {
-      LOG(FATAL) << "ValueError: Attempted to index into an object that is not 
an ADT.";
+      LOG(FATAL) << "ValueError: Attempted to index into an object that is not 
an Array.";
     }
     int index = args[i];
     auto arr = Downcast<Array<ObjectRef>>(obj);
@@ -283,7 +283,7 @@ class VirtualMachineImpl : public VirtualMachine {
    * \param save_name The saved name of the function.
    * \param include_return Whether forward the return value, set it to false 
allows
    *        us to ignore forwarding return value, which can be helpful to do 
benchmarking
-   *        in RPC environment when return value is complicated ADT.
+   *        in RPC environment when return value is complicated Array.
    *
    * \param args The arguments to bound to the function.
    * \note This function is used by RPC server to help benchmarking.
diff --git a/tests/cpp/container_test.cc b/tests/cpp/container_test.cc
index 0a089eaebd..6f0c47c0ea 100644
--- a/tests/cpp/container_test.cc
+++ b/tests/cpp/container_test.cc
@@ -18,7 +18,6 @@
  */
 
 #include <gtest/gtest.h>
-#include <tvm/runtime/container/adt.h>
 #include <tvm/runtime/container/array.h>
 #include <tvm/runtime/container/map.h>
 #include <tvm/runtime/container/string.h>
@@ -99,19 +98,6 @@ class TestArrayObj : public Object, public 
InplaceArrayBase<TestArrayObj, TestEr
   friend class InplaceArrayBase;
 };
 
-TEST(ADT, Constructor) {
-  std::vector<ObjectRef> fields;
-  auto f1 = ADT::Tuple(fields);
-  auto f2 = ADT::Tuple(fields);
-  ADT v1{1, {f1, f2}};
-  ASSERT_EQ(f1.tag(), 0);
-  ASSERT_EQ(f2.size(), 0);
-  ASSERT_EQ(v1.tag(), 1);
-  ASSERT_EQ(v1.size(), 2);
-  ASSERT_EQ(Downcast<ADT>(v1[0]).tag(), 0);
-  ASSERT_EQ(Downcast<ADT>(v1[1]).size(), 0);
-}
-
 TEST(InplaceArrayBase, BadExceptionSafety) {
   auto wrong_init = []() {
     TestErrorSwitch f1{false};
diff --git a/tests/python/relax/test_relax_operators.py 
b/tests/python/relax/test_relax_operators.py
index a80b988d06..1fdded9239 100644
--- a/tests/python/relax/test_relax_operators.py
+++ b/tests/python/relax/test_relax_operators.py
@@ -378,7 +378,7 @@ def test_op_call_inplace_packed(exec_mode):
             for j in range(len(arr_a[i])):
                 arr_a[i][j] = arr_a[i][j] + arr_b[i][j]
         a.copyfrom(arr_a)
-        return tvm.runtime.container.ADT(0, [a, c])
+        return tvm.runtime.convert([a, c])
 
     @tvm.script.ir_module
     class CallInplaceTuple:

Reply via email to