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 302aaf9f96 [IR] Rename Var name_hint field to name (#20016)
302aaf9f96 is described below

commit 302aaf9f961a6e0a2c5cc23dc87e51fbaabd1e42
Author: Tianqi Chen <[email protected]>
AuthorDate: Fri Jul 17 05:34:31 2026 +0800

    [IR] Rename Var name_hint field to name (#20016)
    
    Rename the reflected local `Var` field from `name_hint` to `name` and
    update its typed C++ consumers. Preserve distinct named-node APIs and
    the Python constructor keyword compatibility path, while making `.name`
    the sole stored Var property. Upgrade legacy compact JSON records for
    current and pre-unification Var schemas.
    
    Validation: full runtime/compiler build, focused C++ Var copy-helper
    test, focused Python IR/Relax/TIRx/script tests, Vulkan codegen syntax
    build, touched-file pre-commit checks, and `git diff --check`.
---
 include/tvm/ir/expr.h                              |  9 ++--
 include/tvm/relax/expr.h                           |  2 +-
 include/tvm/s_tir/data_layout.h                    | 10 ++--
 include/tvm/tirx/var.h                             |  9 ++--
 include/tvm/topi/transform.h                       |  2 +-
 python/tvm/ir/expr.py                              |  9 +---
 python/tvm/ir/json_compact.py                      | 10 ++--
 python/tvm/relax/expr.py                           |  2 +-
 src/arith/solve_linear_equation.cc                 |  2 +-
 src/arith/unwrap_vector_expr.cc                    |  2 +-
 src/backend/cuda/codegen/codegen_cuda.cc           | 16 +++----
 src/backend/vulkan/codegen/codegen_spirv.cc        | 12 ++---
 src/ir/expr.cc                                     | 12 ++---
 src/relax/analysis/var2value.cc                    |  4 +-
 src/relax/backend/contrib/codegen_c/codegen_c.h    |  2 +-
 .../backend/contrib/codegen_json/codegen_json.h    |  2 +-
 src/relax/backend/contrib/cutlass/codegen.cc       |  4 +-
 src/relax/backend/vm/codegen_vm.cc                 |  2 +-
 src/relax/backend/vm/codegen_vm_tir.cc             |  2 +-
 src/relax/backend/vm/vm_shape_lower.cc             |  2 +-
 src/relax/distributed/transform/lower_distir.cc    |  2 +-
 .../distributed/transform/propagate_sharding.cc    |  7 ++-
 src/relax/ir/binding_rewrite.cc                    |  2 +-
 src/relax/ir/block_builder.cc                      |  2 +-
 src/relax/ir/dataflow_matcher.cc                   |  4 +-
 src/relax/ir/expr.cc                               |  8 ++--
 src/relax/ir/expr_functor.cc                       |  8 ++--
 src/relax/script/builder/frame.cc                  |  2 +-
 src/relax/script/builder/ir.cc                     |  2 +-
 src/relax/script/builder/utils.h                   |  4 +-
 src/relax/script/printer/tir.cc                    |  2 +-
 src/relax/script/printer/utils.h                   |  2 +-
 src/relax/training/utils.cc                        |  2 +-
 src/relax/transform/adjust_matmul_order.cc         |  2 +-
 src/relax/transform/bind_params.cc                 |  4 +-
 src/relax/transform/bind_symbolic_vars.cc          |  4 +-
 src/relax/transform/bundle_model_params.cc         |  6 +--
 src/relax/transform/canonicalize_bindings.cc       |  2 +-
 src/relax/transform/expand_tuple_arguments.cc      |  6 +--
 src/relax/transform/fuse_ops.cc                    | 13 +++---
 src/relax/transform/fuse_tir.cc                    |  2 +-
 src/relax/transform/gradient.cc                    | 17 ++++---
 src/relax/transform/inline_functions.cc            |  2 +-
 src/relax/transform/lambda_lift.cc                 |  4 +-
 src/relax/transform/lazy_transform_params.cc       |  6 +--
 src/relax/transform/lift_transform_params.cc       |  4 +-
 src/relax/transform/realize_vdevice.cc             |  4 +-
 src/relax/transform/remove_unused_parameters.cc    |  2 +-
 src/relax/transform/rewrite_cuda_graph.cc          |  6 +--
 .../specialize_primfunc_based_on_callsite.cc       |  2 +-
 src/relax/transform/static_plan_block_memory.cc    |  6 +--
 src/relax/transform/to_mixed_precision.cc          |  4 +-
 src/relax/transform/to_non_dataflow.cc             |  2 +-
 src/relax/transform/utils.h                        |  4 +-
 src/s_tir/analysis/verify_gpu_code.cc              |  4 +-
 src/s_tir/data_layout.cc                           | 26 +++++------
 .../schedule/primitive/annotate_buffer_access.cc   |  4 +-
 src/s_tir/schedule/primitive/cache_index.cc        |  2 +-
 src/s_tir/schedule/primitive/cache_read_write.cc   |  6 +--
 .../schedule/primitive/layout_transformation.cc    |  8 ++--
 .../schedule/primitive/loop_transformation.cc      | 22 ++++-----
 src/s_tir/schedule/primitive/reduction.cc          |  6 +--
 src/s_tir/schedule/trace.cc                        |  2 +-
 src/s_tir/schedule/transform.cc                    |  5 +-
 src/s_tir/transform/compact_buffer_region.cc       |  2 +-
 src/s_tir/transform/convert_blocks_to_opaque.cc    |  2 +-
 src/s_tir/transform/inject_double_buffer.cc        |  4 +-
 src/s_tir/transform/inject_virtual_thread.cc       |  2 +-
 .../transform/lower_cross_thread_reduction.cc      |  4 +-
 src/s_tir/transform/memhammer_coalesce.cc          |  2 +-
 .../transform/merge_shared_memory_allocations.cc   |  2 +-
 src/s_tir/transform/renew_defs.cc                  |  2 +-
 src/s_tir/transform/tensorcore_infer_fragment.cc   |  4 +-
 src/script/ir_builder/ir/ir.cc                     |  2 +-
 src/target/llvm/codegen_cpu.cc                     |  9 ++--
 src/target/llvm/codegen_llvm.cc                    | 12 ++---
 src/target/source/codegen_source_base.cc           |  6 +--
 src/te/operation/create_primfunc.cc                |  6 +--
 src/tirx/analysis/var_use_def_analysis.cc          |  4 +-
 src/tirx/analysis/verify_well_formed.cc            | 14 +++---
 src/tirx/ir/buffer.cc                              |  6 +--
 src/tirx/ir/index_map.cc                           | 11 ++---
 src/tirx/script/builder/ir.cc                      |  4 +-
 src/tirx/script/printer/buffer.cc                  |  2 +-
 src/tirx/script/printer/expr.cc                    |  6 +--
 src/tirx/script/printer/stmt.cc                    |  2 +-
 src/tirx/script/printer/utils.h                    |  2 +-
 src/tirx/transform/ir_utils.cc                     |  4 +-
 src/tirx/transform/ir_utils.h                      |  4 +-
 src/tirx/transform/lower_intrin.cc                 |  2 +-
 src/tirx/transform/lower_warp_memory.cc            |  2 +-
 src/tirx/transform/narrow_datatype.cc              |  2 +-
 src/tirx/transform/split_host_device.cc            |  4 +-
 src/tirx/transform/storage_rewrite.cc              | 31 ++++++-------
 src/tirx/transform/tile_primitive_dispatch.cc      |  2 +-
 src/tirx/transform/tvm_ffi_binder.cc               | 16 +++----
 src/tirx/transform/unsupported_dtype_legalize.cc   |  8 ++--
 src/tirx/transform/update_pointer_storage_scope.cc |  2 +-
 src/tirx/transform/vectorize_loop.cc               | 10 ++--
 tests/cpp/expr_test.cc                             |  6 +--
 tests/python/ir/test_node_reflection.py            | 54 +++++++++++++++++-----
 tests/python/relax/test_expr.py                    | 16 +++++--
 102 files changed, 325 insertions(+), 297 deletions(-)

diff --git a/include/tvm/ir/expr.h b/include/tvm/ir/expr.h
index 0af9a8a103..4d614586d5 100644
--- a/include/tvm/ir/expr.h
+++ b/include/tvm/ir/expr.h
@@ -268,12 +268,12 @@ TVM_DLL PrimExpr operator~(PrimExpr a);
  */
 class VarNode : public ExprNode {
  public:
-  /*! \brief The hint to the variable name. */
-  ffi::String name_hint;
+  /*! \brief The variable name. */
+  ffi::String name;
 
   static void RegisterReflection() {
     namespace refl = tvm::ffi::reflection;
-    refl::ObjectDef<VarNode>().def_ro("name_hint", &VarNode::name_hint,
+    refl::ObjectDef<VarNode>().def_ro("name", &VarNode::name,
                                       refl::AttachFieldFlag::SEqHashIgnore());
   }
 
@@ -285,8 +285,7 @@ class VarNode : public ExprNode {
 /*! \brief Managed reference to VarNode. */
 class Var : public Expr {
  public:
-  TVM_DLL explicit Var(ffi::String name_hint, ffi::Optional<Type> 
ty_annotation,
-                       Span span = Span());
+  TVM_DLL explicit Var(ffi::String name, ffi::Optional<Type> ty_annotation, 
Span span = Span());
 
   /*! \brief Return a fresh ordinary Var with the same type and a new name. */
   TVM_DLL Var CopyWithName(const ffi::String& name) const;
diff --git a/include/tvm/relax/expr.h b/include/tvm/relax/expr.h
index bb1248016a..d534c3948e 100644
--- a/include/tvm/relax/expr.h
+++ b/include/tvm/relax/expr.h
@@ -148,7 +148,7 @@ class DataflowVarNode : public VarNode {
 
 class DataflowVar : public Var {
  public:
-  TVM_DLL explicit DataflowVar(ffi::String name_hint, ffi::Optional<Type> 
ty_annotation,
+  TVM_DLL explicit DataflowVar(ffi::String name, ffi::Optional<Type> 
ty_annotation,
                                Span span = Span());
 
   TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(DataflowVar, Var, 
DataflowVarNode);
diff --git a/include/tvm/s_tir/data_layout.h b/include/tvm/s_tir/data_layout.h
index ee6d51832d..4ba7ff5b29 100644
--- a/include/tvm/s_tir/data_layout.h
+++ b/include/tvm/s_tir/data_layout.h
@@ -46,7 +46,7 @@ class SLayoutAxis {
  public:
   static const SLayoutAxis& Get(const char name);
 
-  // Get the singleton SLayoutAxis using itvar->var->name_hint
+  // Get the singleton SLayoutAxis using itvar->var->name
   static const SLayoutAxis& Get(const tirx::IterVar& itvar);
 
   // Get the singleton SLayoutAxis using name[0] (size of name must be 1).
@@ -230,7 +230,7 @@ class SLayout : public ffi::ObjectRef {
       for (auto dst_axis : iter_vars) {
         if (SLayoutAxis::Get(dst_axis).IsPrimal()) {
           if (!this->Contains(SLayoutAxis::Get(dst_axis))) {
-            new_src_layout_str += dst_axis->var->name_hint;
+            new_src_layout_str += dst_axis->var->name;
           }
         }
       }
@@ -252,7 +252,7 @@ class SLayout : public ffi::ObjectRef {
     if (!this->defined()) return -1;
     const auto axes = operator->()->axes;
     for (size_t i = 0; i < axes.size(); ++i) {
-      if (axes[i]->var->name_hint == axis) return static_cast<int32_t>(i);
+      if (axes[i]->var->name == axis) return static_cast<int32_t>(i);
     }
     return -1;
   }
@@ -273,7 +273,7 @@ class SLayout : public ffi::ObjectRef {
    * \param iter the input iter var.
    * \return the index or -1 if not found.
    */
-  inline int32_t IndexOf(const tirx::IterVar& iter) const { return 
IndexOf(iter->var->name_hint); }
+  inline int32_t IndexOf(const tirx::IterVar& iter) const { return 
IndexOf(iter->var->name); }
 
   /*!
    * \brief Get the factor size of the subordinate axis.
@@ -294,7 +294,7 @@ class SLayout : public ffi::ObjectRef {
     for (const tirx::IterVar packed_var : operator->()->axes) {
       auto iter_vars = UnpackIterVar(packed_var);
       for (auto var : iter_vars) {
-        if (var->var->name_hint == axis.name()) {
+        if (var->var->name == axis.name()) {
           return true;
         }
       }
diff --git a/include/tvm/tirx/var.h b/include/tvm/tirx/var.h
index 467b2f7bee..28e322b3e3 100644
--- a/include/tvm/tirx/var.h
+++ b/include/tvm/tirx/var.h
@@ -46,13 +46,12 @@ using Var = tvm::Var;
 class PrimVar : public PrimExpr {
  public:
   /*! \brief Construct a scalar variable directly from a primitive type. */
-  explicit PrimVar(ffi::String name_hint, PrimType dtype = PrimType::Int(32), 
Span span = Span())
-      : PrimExpr(
-            Var(std::move(name_hint), std::move(dtype), 
std::move(span)).as_or_throw<PrimExpr>()) {}
+  explicit PrimVar(ffi::String name, PrimType dtype = PrimType::Int(32), Span 
span = Span())
+      : PrimExpr(Var(std::move(name), std::move(dtype), 
std::move(span)).as_or_throw<PrimExpr>()) {}
 
   /*! \brief Construct a scalar variable directly from a checked type 
annotation. */
-  explicit PrimVar(ffi::String name_hint, Type type_annotation, Span span = 
Span())
-      : PrimExpr(Var(std::move(name_hint), std::move(type_annotation), 
std::move(span))
+  explicit PrimVar(ffi::String name, Type type_annotation, Span span = Span())
+      : PrimExpr(Var(std::move(name), std::move(type_annotation), 
std::move(span))
                      .as_or_throw<PrimExpr>()) {}
 
   /*! \brief Safe widening to a general Var view over the same node. */
diff --git a/include/tvm/topi/transform.h b/include/tvm/topi/transform.h
index 5d56a0ca64..e886c1839a 100644
--- a/include/tvm/topi/transform.h
+++ b/include/tvm/topi/transform.h
@@ -653,7 +653,7 @@ inline PrimExpr DynamicCanonicalizeIndex(PrimExpr index, 
PrimExpr extent, PrimEx
   auto idx_var = index.as<tvm::tirx::PrimVar>();
   auto extent_var = extent.as<tvm::tirx::PrimVar>();
 
-  if (idx_var && extent_var && (*idx_var)->name_hint == 
(*extent_var)->name_hint) {
+  if (idx_var && extent_var && (*idx_var)->name == (*extent_var)->name) {
     return index;
   }
 
diff --git a/python/tvm/ir/expr.py b/python/tvm/ir/expr.py
index c1f146da87..4c28b7e7f6 100644
--- a/python/tvm/ir/expr.py
+++ b/python/tvm/ir/expr.py
@@ -374,7 +374,7 @@ class Var(_ExprWithOp):
     Parameters
     ----------
     name : str
-        The API name of the variable.  It is stored internally as a name hint.
+        The name of the variable.
 
     ty : Optional[Type or str]
         The exact type of the variable.  A string denotes a primitive dtype.
@@ -384,7 +384,7 @@ class Var(_ExprWithOp):
 
     """
 
-    name_hint: str
+    name: str
     span: Span | None
 
     def __init__(
@@ -413,11 +413,6 @@ class Var(_ExprWithOp):
                 raise TypeError("ty must be a Type or primitive dtype string")
         self.__init_handle_by_constructor__(_ffi_api.Var, name, ty, span)
 
-    @property
-    def name(self) -> str:
-        """The user-facing variable name."""
-        return self.name_hint
-
 
 @tvm_ffi.register_object("ir.Range")
 class Range(Node, Scriptable):
diff --git a/python/tvm/ir/json_compact.py b/python/tvm/ir/json_compact.py
index 948c064e64..1b65b2488e 100644
--- a/python/tvm/ir/json_compact.py
+++ b/python/tvm/ir/json_compact.py
@@ -86,14 +86,16 @@ def upgrade_json(json_str):
         raise ValueError("Legacy json graph format detected, we don't support 
it anymore.")
 
     # `ir.Var` is the sole runtime variable node.  Keep `tvm.ir.load_json`
-    # compatible with the exact pre-unification Relax and TIRx schemas.
-    # Rewriting nodes in place preserves node indices and shared references.
+    # compatible with the pre-unification Relax/TIRx schemas and with graphs
+    # written before the canonical Var field was renamed to `name`.  Rewriting
+    # nodes in place preserves node indices and shared references.
     for node in data.get("nodes", []):
         if node.get("type") == "relax.expr.Var":
             node["type"] = "ir.Var"
         elif node.get("type") == "tirx.Var":
             node["type"] = "ir.Var"
+        if node.get("type") in ("ir.Var", "relax.expr.DataflowVar"):
             fields = node.get("data", {})
-            if "name" in fields and "name_hint" not in fields:
-                fields["name_hint"] = fields.pop("name")
+            if "name_hint" in fields and "name" not in fields:
+                fields["name"] = fields.pop("name_hint")
     return json.dumps(data, indent=2)
diff --git a/python/tvm/relax/expr.py b/python/tvm/relax/expr.py
index 41b49dd2c5..8c7cdcf992 100644
--- a/python/tvm/relax/expr.py
+++ b/python/tvm/relax/expr.py
@@ -423,7 +423,7 @@ class DataflowVar(Var):
     Parameters
     ----------
     name: str
-        The API name of the variable.  It is stored internally as a name hint.
+        The name of the variable.
 
     ty: Optional[Type]
         The type annotation of the variable.
diff --git a/src/arith/solve_linear_equation.cc 
b/src/arith/solve_linear_equation.cc
index 382c166305..f2315a473f 100644
--- a/src/arith/solve_linear_equation.cc
+++ b/src/arith/solve_linear_equation.cc
@@ -393,7 +393,7 @@ IntConstraintsTransform SolveLinearEquations(const 
IntConstraints& system_to_sol
       PrimExpr to_old = analyzer_problem->Simplify(V_inv_x[j]);
       std::string name_hint = "n" + std::to_string(new_vars.size());
       if (auto old_var = to_old.as<tirx::PrimVar>()) {
-        name_hint += "_" + (*old_var)->name_hint;
+        name_hint += "_" + (*old_var)->name;
       }
       PrimVar v(name_hint, V_inv_x[j].ty());
       solution_for_V_inv_x.push_back(v);
diff --git a/src/arith/unwrap_vector_expr.cc b/src/arith/unwrap_vector_expr.cc
index de6956cf27..ddc55d0732 100644
--- a/src/arith/unwrap_vector_expr.cc
+++ b/src/arith/unwrap_vector_expr.cc
@@ -67,7 +67,7 @@ class Scalarizer : public ExprMutator {
     TVM_FFI_ICHECK(it == let_var_remap_.end()) << "Duplicate binding of 
variable " << op->var;
 
     PrimType var_ty = op->var.as_or_throw<PrimVar>().ty();
-    PrimVar new_var(op->var->name_hint + "_scalar", var_ty.WithLanes(1));
+    PrimVar new_var(op->var->name + "_scalar", var_ty.WithLanes(1));
     let_var_remap_[op->var.get()] = new_var;
 
     PrimExpr value = this->VisitPrimExpr(op->value);
diff --git a/src/backend/cuda/codegen/codegen_cuda.cc 
b/src/backend/cuda/codegen/codegen_cuda.cc
index 5576d8a578..6f951f9789 100644
--- a/src/backend/cuda/codegen/codegen_cuda.cc
+++ b/src/backend/cuda/codegen/codegen_cuda.cc
@@ -198,22 +198,22 @@ class ThreadIdxExtractor : public tirx::StmtVisitor {
   void VisitStmt_(const AttrStmtNode* op) final {
     if (op->attr_key == tirx::attr::thread_extent) {
       IterVar iv = op->node.as_or_throw<IterVar>();
-      if (iv->var->name_hint == "threadIdx.x" || iv->thread_tag == 
"threadIdx.x") {
+      if (iv->var->name == "threadIdx.x" || iv->thread_tag == "threadIdx.x") {
         threadIdx_x_ext = op->value;
       }
-      if (iv->var->name_hint == "threadIdx.y" || iv->thread_tag == 
"threadIdx.y") {
+      if (iv->var->name == "threadIdx.y" || iv->thread_tag == "threadIdx.y") {
         threadIdx_y_ext = op->value;
       }
-      if (iv->var->name_hint == "threadIdx.z" || iv->thread_tag == 
"threadIdx.z") {
+      if (iv->var->name == "threadIdx.z" || iv->thread_tag == "threadIdx.z") {
         threadIdx_z_ext = op->value;
       }
-      if (iv->var->name_hint == "clusterCtaIdx.x" || iv->thread_tag == 
"clusterCtaIdx.x") {
+      if (iv->var->name == "clusterCtaIdx.x" || iv->thread_tag == 
"clusterCtaIdx.x") {
         clusterCtaIdx_x_ext = op->value;
       }
-      if (iv->var->name_hint == "clusterCtaIdx.y" || iv->thread_tag == 
"clusterCtaIdx.y") {
+      if (iv->var->name == "clusterCtaIdx.y" || iv->thread_tag == 
"clusterCtaIdx.y") {
         clusterCtaIdx_y_ext = op->value;
       }
-      if (iv->var->name_hint == "clusterCtaIdx.z" || iv->thread_tag == 
"clusterCtaIdx.z") {
+      if (iv->var->name == "clusterCtaIdx.z" || iv->thread_tag == 
"clusterCtaIdx.z") {
         clusterCtaIdx_z_ext = op->value;
       }
     }
@@ -1995,7 +1995,7 @@ void CodeGenCUDA::PrintWmmaScope(const std::string& 
scope, const PrimType& t,
   std::stringstream type;
   PrintType(t, type);
   TVM_FFI_ICHECK(fragment_shapes.count(variable))
-      << "Cannot find shape of the wmma fragment " << variable->name_hint;
+      << "Cannot find shape of the wmma fragment " << variable->name;
   std::string shape_str = fragment_shapes.at(variable);
   if ((t.MatchesCode(DLDataTypeCode::kDLInt, DLDataTypeCode::kDLUInt)) && 
t.bits() < 8 &&
       t.lanes() == 1) {
@@ -2047,7 +2047,7 @@ int stoi(const std::string& str) {
 int32_t CodeGenCUDA::GetWmmaFragmentSize(const std::string& scope, const 
VarNode* variable,
                                          int32_t size) {
   TVM_FFI_ICHECK(fragment_shapes.count(variable))
-      << "Cannot find shape of the wmma fragment " << variable->name_hint;
+      << "Cannot find shape of the wmma fragment " << variable->name;
   std::string shape_str = fragment_shapes.at(variable);
   std::pair<int32_t, int32_t> dim = GetWmmaFragmentDimSize(shape_str, scope);
   if (dim.first * dim.second != 0)
diff --git a/src/backend/vulkan/codegen/codegen_spirv.cc 
b/src/backend/vulkan/codegen/codegen_spirv.cc
index e0d44441a3..7dbb23820b 100644
--- a/src/backend/vulkan/codegen/codegen_spirv.cc
+++ b/src/backend/vulkan/codegen/codegen_spirv.cc
@@ -88,8 +88,8 @@ runtime::SPIRVShader CodeGenSPIRV::BuildFunction(const 
PrimFunc& f, const std::s
       }
       spirv::Value arg_value = 
builder_->BufferArgument(builder_->GetSType(value_storage_type),
                                                         descriptor_set, 
i_buffer++);
-      builder_->SetName(arg_value, arg->name_hint);
-      storage_info_[arg.get()].SetContentType(value_storage_type, 
arg->name_hint);
+      builder_->SetName(arg_value, arg->name);
+      storage_info_[arg.get()].SetContentType(value_storage_type, arg->name);
       var_map_[arg.get()] = arg_value;
     } else {
       PrimType pod_type = arg->ty.as_or_throw<PrimType>();
@@ -207,7 +207,7 @@ spirv::Value CodeGenSPIRV::CreateStorageSync(const 
CallNode* op) {
 
 spirv::Value CodeGenSPIRV::VisitExpr_(const VarNode* op) {
   auto it = var_map_.find(op);
-  TVM_FFI_ICHECK(it != var_map_.end()) << "cannot find variable " << 
op->name_hint;
+  TVM_FFI_ICHECK(it != var_map_.end()) << "cannot find variable " << op->name;
   return it->second;
 }
 
@@ -628,8 +628,8 @@ spirv::Value CodeGenSPIRV::VisitExpr_(const BufferLoadNode* 
op) {
 
   } else {
     TVM_FFI_THROW(InternalError) << "Cannot perform buffer access of buffer 
variable '"
-                                 << buffer_var->name_hint << "' with element 
type "
-                                 << info.element_type << " using index of type 
" << prim_index.ty()
+                                 << buffer_var->name << "' with element type " 
<< info.element_type
+                                 << " using index of type " << prim_index.ty()
                                  << " to produce output of type " << 
op->ty.as_or_throw<PrimType>();
     return spirv::Value();
   }
@@ -706,7 +706,7 @@ void CodeGenSPIRV::VisitStmt_(const BufferStoreNode* op) {
 
   } else {
     TVM_FFI_THROW(InternalError) << "Cannot store value of type " << value_type
-                                 << " into buffer variable '" << 
buffer_var->name_hint
+                                 << " into buffer variable '" << 
buffer_var->name
                                  << "' with element type " << info.element_type
                                  << " using index of type " << index_type;
   }
diff --git a/src/ir/expr.cc b/src/ir/expr.cc
index 2330e643cd..d44cdb06f6 100644
--- a/src/ir/expr.cc
+++ b/src/ir/expr.cc
@@ -251,9 +251,9 @@ TVM_FFI_STATIC_INIT_BLOCK() {
       });
 }
 
-Var::Var(ffi::String name_hint, ffi::Optional<Type> ty_annotation, Span span) {
+Var::Var(ffi::String name, ffi::Optional<Type> ty_annotation, Span span) {
   ffi::ObjectPtr<VarNode> n = ffi::make_object<VarNode>();
-  n->name_hint = std::move(name_hint);
+  n->name = std::move(name);
   if (ty_annotation.has_value()) {
     n->ty = ty_annotation.value();
   }
@@ -265,12 +265,12 @@ Var Var::CopyWithName(const ffi::String& name) const {
   TVM_FFI_CHECK_EQ(type_index(), VarNode::RuntimeTypeIndex(), TypeError)
       << "Cannot copy a Var runtime subtype as an ordinary Var";
   ffi::ObjectPtr<VarNode> copy = ffi::make_object<VarNode>(*get());
-  copy->name_hint = name;
+  copy->name = name;
   return Var(std::move(copy));
 }
 
 Var Var::CopyWithSuffix(const ffi::String& suffix) const {
-  return CopyWithName(get()->name_hint + suffix);
+  return CopyWithName(get()->name + suffix);
 }
 
 Var Var::CopyWithDType(PrimType dtype) const {
@@ -305,8 +305,8 @@ Call::Call(Type ret_ty, Expr op, ffi::Array<Expr> args, 
Attrs attrs, ffi::Array<
 TVM_FFI_STATIC_INIT_BLOCK() {
   namespace refl = tvm::ffi::reflection;
   refl::GlobalDef()
-      .def("ir.Var", [](ffi::String name_hint, ffi::Optional<Type> 
ty_annotation,
-                        Span span) { return Var(name_hint, ty_annotation, 
span); })
+      .def("ir.Var", [](ffi::String name, ffi::Optional<Type> ty_annotation,
+                        Span span) { return Var(name, ty_annotation, span); })
       .def("ir.GlobalVar", [](ffi::String name) { return GlobalVar(name); })
       .def("ir.Call",
            [](Type ret_ty, Expr op, ffi::Array<Expr> args, Attrs attrs, 
ffi::Array<Type> ty_args,
diff --git a/src/relax/analysis/var2value.cc b/src/relax/analysis/var2value.cc
index a5e30c8139..e18d0e7fca 100644
--- a/src/relax/analysis/var2value.cc
+++ b/src/relax/analysis/var2value.cc
@@ -74,12 +74,12 @@ class Name2BindingAnalysis : public relax::ExprVisitor {
   // so we use standard container for internal usage.
   std::map<ffi::String, ffi::Array<Binding>> name2bindings_;
   void VisitBinding_(const VarBindingNode* binding) override {
-    const auto& vname = binding->var->name_hint;
+    const auto& vname = binding->var->name;
     name2bindings_[vname].push_back(ffi::GetRef<VarBinding>(binding));
   }
 
   void VisitBinding_(const MatchCastNode* binding) override {
-    const auto& vname = binding->var->name_hint;
+    const auto& vname = binding->var->name;
     name2bindings_[vname].push_back(ffi::GetRef<MatchCast>(binding));
   }
 };
diff --git a/src/relax/backend/contrib/codegen_c/codegen_c.h 
b/src/relax/backend/contrib/codegen_c/codegen_c.h
index 58f76c92a8..8b386f3bfa 100644
--- a/src/relax/backend/contrib/codegen_c/codegen_c.h
+++ b/src/relax/backend/contrib/codegen_c/codegen_c.h
@@ -282,7 +282,7 @@ class CodegenCBase {
 
     for (const auto& arg : args) {
       const auto& dtype_str = GetDtypeString(arg);
-      code_stream_ << dtype_str << "* " << arg->name_hint << ", ";
+      code_stream_ << dtype_str << "* " << arg->name << ", ";
     }
     for (size_t i = 0; i < outs.size() - 1; ++i) {
       code_stream_ << outs[i].dtype << "* out" << i << ", ";
diff --git a/src/relax/backend/contrib/codegen_json/codegen_json.h 
b/src/relax/backend/contrib/codegen_json/codegen_json.h
index 7c9f1a1ea7..8a96a788f4 100644
--- a/src/relax/backend/contrib/codegen_json/codegen_json.h
+++ b/src/relax/backend/contrib/codegen_json/codegen_json.h
@@ -238,7 +238,7 @@ class JSONSerializer : public 
relax::MemoizedExprTranslator<NodeEntries> {
   void serialize(Function func) {
     // First we convert all the parameters into input nodes.
     for (const auto& param : func->params) {
-      auto node_ptr = std::make_shared<JSONGraphNode>(param->name_hint, 
"input" /* op_type_ */);
+      auto node_ptr = std::make_shared<JSONGraphNode>(param->name, "input" /* 
op_type_ */);
       memo_[param] = AddNode(node_ptr, param);
     }
     heads_ = VisitExpr(func->body);
diff --git a/src/relax/backend/contrib/cutlass/codegen.cc 
b/src/relax/backend/contrib/cutlass/codegen.cc
index 4dacc019d8..cb1d83b1a3 100644
--- a/src/relax/backend/contrib/cutlass/codegen.cc
+++ b/src/relax/backend/contrib/cutlass/codegen.cc
@@ -159,7 +159,7 @@ class CodegenCutlass : public 
relax::MemoizedExprTranslator<OutputType>,
 
   void AddParm(Var param) {
     ext_func_args_.push_back(param);
-    auto v_name = name_sup_->FreshName(param->name_hint);
+    auto v_name = name_sup_->FreshName(param->name);
     var_name_map_[param.get()] = v_name;
   }
 
@@ -332,7 +332,7 @@ class CodegenCutlass : public 
relax::MemoizedExprTranslator<OutputType>,
   /*!
    * \brief A mapping from a variable to its unique name.
    * We use this since sometimes different parameters to the same function end 
up having the same
-   * name_hint.
+   * name.
    */
   std::unordered_map<const VarNode*, std::string> var_name_map_;
   /*! \brief A unique name supply to generate a unique name for each 
parameter. */
diff --git a/src/relax/backend/vm/codegen_vm.cc 
b/src/relax/backend/vm/codegen_vm.cc
index 176d28eabe..a7dd9a21a8 100644
--- a/src/relax/backend/vm/codegen_vm.cc
+++ b/src/relax/backend/vm/codegen_vm.cc
@@ -91,7 +91,7 @@ class CodeGenVM : public ExprFunctor<Instruction::Arg(const 
Expr&)> {
 
     ffi::Array<ffi::String> param_names;
     for (Var param : func->params) {
-      param_names.push_back(param->name_hint);
+      param_names.push_back(param->name);
     }
 
     builder_->EmitFunction(gsymbol.value(), func->params.size(), param_names);
diff --git a/src/relax/backend/vm/codegen_vm_tir.cc 
b/src/relax/backend/vm/codegen_vm_tir.cc
index 81482b0293..48191f32a3 100644
--- a/src/relax/backend/vm/codegen_vm_tir.cc
+++ b/src/relax/backend/vm/codegen_vm_tir.cc
@@ -171,7 +171,7 @@ class CodeGenVMTIR : public 
ExprFunctor<ffi::Optional<Expr>(const Expr&)> {
 
     ffi::Array<ffi::String> param_names;
     for (Var param : func->params) {
-      param_names.push_back(param->name_hint);
+      param_names.push_back(param->name);
     }
     // declare this function.
     builder_->DeclareFunction(gsymbol.value(), 
vm::VMFuncInfo::FuncKind::kVMTIRFunc);
diff --git a/src/relax/backend/vm/vm_shape_lower.cc 
b/src/relax/backend/vm/vm_shape_lower.cc
index 12ff275784..b83a5ed72d 100644
--- a/src/relax/backend/vm/vm_shape_lower.cc
+++ b/src/relax/backend/vm/vm_shape_lower.cc
@@ -368,7 +368,7 @@ class VMShapeLowerMutator
         Type ty = GetType(func->params[i]);
         std::ostringstream err_ctx;
         err_ctx << "ErrorContext(fn=" << gvar->name_hint << ", loc=param[" << i
-                << "], param=" << func->params[i]->name_hint << ", 
annotation=" << ty << ") ";
+                << "], param=" << func->params[i]->name << ", annotation=" << 
ty << ") ";
         this->CheckMatchCast(ty, func->params[i], true, i >= num_input, 
err_ctx.str(),
                              &match_todos);
         if (PrimExprSlot* slot = GetPrimValueSlot(func->params[i])) {
diff --git a/src/relax/distributed/transform/lower_distir.cc 
b/src/relax/distributed/transform/lower_distir.cc
index 01522183bb..ae0c30c3d5 100644
--- a/src/relax/distributed/transform/lower_distir.cc
+++ b/src/relax/distributed/transform/lower_distir.cc
@@ -116,7 +116,7 @@ class DistIRSharder : public ExprMutator {
     Type old_ty = GetType(input);
     Type new_ty = ConvertType(old_ty, false);
     if (const auto* var = input.as<VarNode>()) {
-      Var new_param(var->name_hint, new_ty);
+      Var new_param(var->name, new_ty);
       return new_param;
     } else if (const auto* constant = input.as<ConstantNode>()) {
       for (const auto& spec : 
old_ty.as_or_throw<DTensorType>()->placement->dim_specs) {
diff --git a/src/relax/distributed/transform/propagate_sharding.cc 
b/src/relax/distributed/transform/propagate_sharding.cc
index 738d5dc0b2..2abeccaaef 100644
--- a/src/relax/distributed/transform/propagate_sharding.cc
+++ b/src/relax/distributed/transform/propagate_sharding.cc
@@ -285,8 +285,7 @@ class ShardingConflictHandler : public ExprVisitor {
 
       if (device_mesh.has_value()) {
         TVM_FFI_ICHECK(ffi::StructuralEqual()(device_mesh.value(), 
sharding_spec.first))
-            << "Sharding conflict detected for tensor " << var->name_hint
-            << ": Device Mesh mismatch"
+            << "Sharding conflict detected for tensor " << var->name << ": 
Device Mesh mismatch"
             << ". Conflict Handling logic will be added in the future.";
       } else {
         device_mesh = sharding_spec.first;
@@ -294,7 +293,7 @@ class ShardingConflictHandler : public ExprVisitor {
       if (i >= 0) {
         int sharding_dim = sharding_spec.second;
         TVM_FFI_ICHECK(sharded_mesh_dim.count(sharding_dim) == 0)
-            << "Sharding conflict detected for tensor " << var->name_hint
+            << "Sharding conflict detected for tensor " << var->name
             << ": Replicate sharding device mesh axis " << sharding_dim
             << ". Conflict Handling logic will be added in the future.";
         sharded_mesh_dim.insert(sharding_dim);
@@ -401,7 +400,7 @@ class DistributedIRBuilder : public ExprMutator {
     }
 
     if (const auto* var = tensor.as<VarNode>()) {
-      Var new_param(var->name_hint, new_ty);
+      Var new_param(var->name, new_ty);
       return new_param;
     } else if (const auto* constant = tensor.as<ConstantNode>()) {
       Constant new_constant(constant->data, new_ty);
diff --git a/src/relax/ir/binding_rewrite.cc b/src/relax/ir/binding_rewrite.cc
index 44348e6cef..359e1b1652 100644
--- a/src/relax/ir/binding_rewrite.cc
+++ b/src/relax/ir/binding_rewrite.cc
@@ -55,7 +55,7 @@ DataflowBlockRewrite::DataflowBlockRewrite(DataflowBlock dfb, 
Function root_fn)
   n->to_users_ = std::move(p.first);
   n->fn_outputs_ = std::move(p.second);
   n->name_supply_ = UniqueNameSupply(n->to_users_.begin(), n->to_users_.end(),
-                                     [](const auto& p) { return 
p.first->name_hint; });
+                                     [](const auto& p) { return p.first->name; 
});
 
   data_ = std::move(n);
 }
diff --git a/src/relax/ir/block_builder.cc b/src/relax/ir/block_builder.cc
index e1a64d191e..ec722df110 100644
--- a/src/relax/ir/block_builder.cc
+++ b/src/relax/ir/block_builder.cc
@@ -589,7 +589,7 @@ class Normalizer : public BlockBuilderImpl, private 
ExprFunctor<Expr(const Expr&
   Expr VisitVar_(const typename T::ContainerType* var) {
     // Parameters and free-vars must be present with type
     // Other vars must have already been normalized through binding
-    TVM_FFI_ICHECK(!var->ty.IsMissing()) << "Var " << var->name_hint << " does 
not have type.";
+    TVM_FFI_ICHECK(!var->ty.IsMissing()) << "Var " << var->name << " does not 
have type.";
     return ffi::GetRef<Var>(var);
   }
 
diff --git a/src/relax/ir/dataflow_matcher.cc b/src/relax/ir/dataflow_matcher.cc
index 21717bdb8c..5a982c500e 100644
--- a/src/relax/ir/dataflow_matcher.cc
+++ b/src/relax/ir/dataflow_matcher.cc
@@ -463,7 +463,7 @@ PrimExpr DFPatternMatcher::SimplifyCondition(PrimExpr 
condition) {
   auto sort_key = [](PrimExpr expr) -> ffi::String {
     if (const auto* equal = expr.as<tirx::EQNode>()) {
       if (auto var = equal->a.as<tirx::PrimVar>()) {
-        return var.value()->name_hint;
+        return var.value()->name;
       }
     }
     return "";
@@ -582,7 +582,7 @@ bool DFPatternMatcher::VisitDFPattern_(const 
VarPatternNode* op, const Expr& exp
   // We don't jump for var pattern, as there's no need to access its value to 
judge it.
   if (const auto* var_node = expr.as<VarNode>()) {
     // "" means any name.
-    return "" == op->name_hint() || op->name_hint() == var_node->name_hint;
+    return "" == op->name_hint() || op->name_hint() == var_node->name;
   }
   return false;
 }
diff --git a/src/relax/ir/expr.cc b/src/relax/ir/expr.cc
index 050b2dc8b0..3242fb2224 100644
--- a/src/relax/ir/expr.cc
+++ b/src/relax/ir/expr.cc
@@ -138,9 +138,9 @@ TVM_FFI_STATIC_INIT_BLOCK() {
   });
 }
 
-DataflowVar::DataflowVar(ffi::String name_hint, ffi::Optional<Type> 
ty_annotation, Span span) {
+DataflowVar::DataflowVar(ffi::String name, ffi::Optional<Type> ty_annotation, 
Span span) {
   ffi::ObjectPtr<DataflowVarNode> n = ffi::make_object<DataflowVarNode>();
-  n->name_hint = std::move(name_hint);
+  n->name = std::move(name);
   if (ty_annotation.has_value()) {
     n->ty = ty_annotation.value();
   }
@@ -151,8 +151,8 @@ DataflowVar::DataflowVar(ffi::String name_hint, 
ffi::Optional<Type> ty_annotatio
 TVM_FFI_STATIC_INIT_BLOCK() {
   namespace refl = tvm::ffi::reflection;
   refl::GlobalDef().def("relax.DataflowVar",
-                        [](ffi::String name_hint, ffi::Optional<Type> 
ty_annotation, Span span) {
-                          return DataflowVar(name_hint, ty_annotation, span);
+                        [](ffi::String name, ffi::Optional<Type> 
ty_annotation, Span span) {
+                          return DataflowVar(name, ty_annotation, span);
                         });
 }
 
diff --git a/src/relax/ir/expr_functor.cc b/src/relax/ir/expr_functor.cc
index 4647d51070..3746acd758 100644
--- a/src/relax/ir/expr_functor.cc
+++ b/src/relax/ir/expr_functor.cc
@@ -928,7 +928,7 @@ Var ExprMutator::VisitVarDef_(const DataflowVarNode* var) {
   // where we should produce a DataflowVar.
   if (!output->IsInstance<DataflowVarNode>()) {
     Var delegated_output = output;
-    output = DataflowVar(output->name_hint, GetType(output), output->span);
+    output = DataflowVar(output->name, GetType(output), output->span);
     var_remap_[delegated_output] = output;
   }
   return output;
@@ -940,7 +940,7 @@ Var ExprMutator::VisitVarDef_(const VarNode* var) {
     if (ty.same_as(var->ty)) {
       return ffi::GetRef<Var>(var);
     } else {
-      return Var(var->name_hint, ty, var->span);
+      return Var(var->name, ty, var->span);
     }
   } else {
     return ffi::GetRef<Var>(var);
@@ -1041,8 +1041,8 @@ Var ExprMutator::WithType(Var var, Type ty) {
     if (var->ty.same_as(ty) || ffi::StructuralEqual()(var->ty, ty)) {
       return var;
     } else {
-      Var new_var = var.as<DataflowVarNode>() ? DataflowVar(var->name_hint, 
ty, var->span)
-                                              : Var(var->name_hint, ty, 
var->span);
+      Var new_var = var.as<DataflowVarNode>() ? DataflowVar(var->name, ty, 
var->span)
+                                              : Var(var->name, ty, var->span);
       return new_var;
     }
   } else {
diff --git a/src/relax/script/builder/frame.cc 
b/src/relax/script/builder/frame.cc
index edee981cc6..798ce96f7d 100644
--- a/src/relax/script/builder/frame.cc
+++ b/src/relax/script/builder/frame.cc
@@ -169,7 +169,7 @@ void BindingBlockFrameNode::ExitWithScope() {
     ffi::Array<tvm::Var> new_output_vars;
     std::unordered_map<tvm::Var, tvm::Var, ffi::ObjectPtrHash, 
ffi::ObjectPtrEqual> var_remap;
     for (const auto& output_var : output_vars) {
-      tvm::Var new_output_var(output_var->name_hint, 
tvm::relax::GetType(output_var));
+      tvm::Var new_output_var(output_var->name, 
tvm::relax::GetType(output_var));
       new_output_vars.push_back(new_output_var);
       var_remap[output_var] = new_output_var;
     }
diff --git a/src/relax/script/builder/ir.cc b/src/relax/script/builder/ir.cc
index 87115eca5f..ba047c6e3f 100644
--- a/src/relax/script/builder/ir.cc
+++ b/src/relax/script/builder/ir.cc
@@ -38,7 +38,7 @@ TVM_STATIC_IR_FUNCTOR(Namer, vtable)
                                                   ffi::String name) -> void {
       using tvm::relax::DataflowVarNode;
       DataflowVarNode* var = 
const_cast<DataflowVarNode*>(node.as<DataflowVarNode>());
-      var->name_hint = name;
+      var->name = name;
     });
 
 /////////////////////////////// Function ////////////////////////////////
diff --git a/src/relax/script/builder/utils.h b/src/relax/script/builder/utils.h
index bc8f087a0d..e4d63c62f6 100644
--- a/src/relax/script/builder/utils.h
+++ b/src/relax/script/builder/utils.h
@@ -99,7 +99,7 @@ inline tvm::relax::SeqExpr GetSeqExprForBranch(const 
SeqExprFrame& frame, ffi::S
   TVM_FFI_ICHECK(!last_binding->var->IsInstance<tvm::relax::DataflowVarNode>())
       << "A non-dataflow var is expected in the last binding of '" << method 
<< "'.";
 
-  *var_name = last_binding->var->name_hint;
+  *var_name = last_binding->var->name;
 
   // Step 3. Re-collect binding blocks to replace the last binding.
   ffi::Array<tvm::relax::BindingBlock> 
new_blocks(frame->binding_blocks.begin(),
@@ -107,7 +107,7 @@ inline tvm::relax::SeqExpr GetSeqExprForBranch(const 
SeqExprFrame& frame, ffi::S
   ffi::Array<tvm::relax::Binding> 
last_block_bindings(last_block->bindings.begin(),
                                                       
last_block->bindings.end() - 1);
 
-  tvm::Var new_var(last_binding->var->name_hint + output_var_suffix,
+  tvm::Var new_var(last_binding->var->name + output_var_suffix,
                    tvm::relax::GetType(last_binding->var));
   tvm::relax::Expr body;
 
diff --git a/src/relax/script/printer/tir.cc b/src/relax/script/printer/tir.cc
index 4b989958a5..dfd742a0b1 100644
--- a/src/relax/script/printer/tir.cc
+++ b/src/relax/script/printer/tir.cc
@@ -62,7 +62,7 @@ Doc PrintCanonicalVar(Var n, AccessPath n_p, IRDocsifier d) {
       TVM_FFI_ICHECK(f->is_func);
       f->func_vars->insert(n.get());
     }
-    IdDoc var = d->Define(n, ffi::GetRef<Frame>(f), n->name_hint.empty() ? "v" 
: n->name_hint);
+    IdDoc var = d->Define(n, ffi::GetRef<Frame>(f), n->name.empty() ? "v" : 
n->name);
     var->source_paths.push_back(n_p);
     f->stmts.push_back(AssignDoc(var, PrintVarCreation(prim_var, n_p, d), 
std::nullopt));
   }
diff --git a/src/relax/script/printer/utils.h b/src/relax/script/printer/utils.h
index 646f8157f3..6fe09a672b 100644
--- a/src/relax/script/printer/utils.h
+++ b/src/relax/script/printer/utils.h
@@ -75,7 +75,7 @@ inline std::string ReprPrintRelax(const ffi::ObjectRef& obj, 
const PrinterConfig
 }
 
 inline IdDoc DefineRelaxVar(const tvm::Var& var, const Frame& frame, const 
IRDocsifier& d) {
-  return d->Define(var, frame, var->name_hint.empty() ? "v" : var->name_hint);
+  return d->Define(var, frame, var->name.empty() ? "v" : var->name);
 }
 
 inline ffi::Optional<ExprDoc> TypeAsAnn(const tvm::Var& v, const AccessPath& 
v_p,
diff --git a/src/relax/training/utils.cc b/src/relax/training/utils.cc
index aca5ed16a9..39365e84ae 100644
--- a/src/relax/training/utils.cc
+++ b/src/relax/training/utils.cc
@@ -192,7 +192,7 @@ class AppendLossMutator : private ExprMutator {
     for (int i = 0; i < num_backbone_outputs_; ++i) {
       auto var = backbone_return_arr_[i];
       if (other_outputs_var.count(var) == 0 && !var->ty.as<PrimTypeNode>()) {
-        auto new_var = DataflowVar(var->name_hint, GetType(var), var->span);
+        auto new_var = DataflowVar(var->name, GetType(var), var->span);
         this->var_remap_[var] = new_var;
         backbone_return_arr_.Set(i, new_var);
       }
diff --git a/src/relax/transform/adjust_matmul_order.cc 
b/src/relax/transform/adjust_matmul_order.cc
index e93063ae28..1f0cf87281 100644
--- a/src/relax/transform/adjust_matmul_order.cc
+++ b/src/relax/transform/adjust_matmul_order.cc
@@ -102,7 +102,7 @@ std::tuple<DFPattern, ffi::TypedFunction<Expr(Expr, 
ffi::Map<DFPattern, Expr>)>>
   if (upper_bounds || lower_bounds) {
     ffi::Map<ffi::String, tirx::Var> name_lookup;
     for (const auto& tir_var : TIRVarsInType(GetType(func))) {
-      name_lookup.Set(tir_var->name_hint, tir_var);
+      name_lookup.Set(tir_var->name, tir_var);
       symbolic_var_constraints = symbolic_var_constraints && (0 <= 
tir_var.as_or_throw<PrimExpr>());
     }
 
diff --git a/src/relax/transform/bind_params.cc 
b/src/relax/transform/bind_params.cc
index 1866584041..bbe15e7b5e 100644
--- a/src/relax/transform/bind_params.cc
+++ b/src/relax/transform/bind_params.cc
@@ -39,7 +39,7 @@ ffi::Map<Var, Expr> NormalizeBindings(const Function& func,
   std::unordered_map<std::string, ffi::Array<tvm::Var>> string_lookup;
   std::unordered_set<const tvm::VarNode*> var_set;
   for (const auto& param : func->params) {
-    string_lookup[param->name_hint].push_back(param);
+    string_lookup[param->name].push_back(param);
     var_set.insert(param.get());
   }
 
@@ -52,7 +52,7 @@ ffi::Map<Var, Expr> NormalizeBindings(const Function& func,
       TVM_FFI_ICHECK(it != string_lookup.end())
           << "Function does not have parameter with name \"" << str << "\".  "
           << "Function parameters are named "
-          << func->params.Map([](const auto& param) { return param->name_hint; 
});
+          << func->params.Map([](const auto& param) { return param->name; });
       TVM_FFI_ICHECK_EQ(it->second.size(), 1)
           << "Function contains multiple parameters with name \"" << str << 
"\".  "
           << "The Relax variables " << it->second << " are all named \"" << 
str << "\"";
diff --git a/src/relax/transform/bind_symbolic_vars.cc 
b/src/relax/transform/bind_symbolic_vars.cc
index b0ed4a3674..05a898d7c7 100644
--- a/src/relax/transform/bind_symbolic_vars.cc
+++ b/src/relax/transform/bind_symbolic_vars.cc
@@ -43,7 +43,7 @@ Function FunctionBindSymbolicVars(
   std::unordered_map<std::string, ffi::Array<tirx::Var>> string_lookup;
   std::unordered_set<const tirx::VarNode*> symbolic_var_set;
   for (const auto& var : old_symbolic_vars) {
-    string_lookup[var->name_hint].push_back(var);
+    string_lookup[var->name].push_back(var);
     symbolic_var_set.insert(var.get());
   }
 
@@ -107,7 +107,7 @@ IRModule ModuleBindSymbolicVars(
         std::unordered_set<std::string> var_names;
         std::unordered_set<const tirx::VarNode*> vars;
         for (const auto& var : DefinedSymbolicVars(func)) {
-          var_names.insert(var->name_hint);
+          var_names.insert(var->name);
           vars.insert(var.get());
         }
 
diff --git a/src/relax/transform/bundle_model_params.cc 
b/src/relax/transform/bundle_model_params.cc
index c2de36d9d3..417400fb1a 100644
--- a/src/relax/transform/bundle_model_params.cc
+++ b/src/relax/transform/bundle_model_params.cc
@@ -119,7 +119,7 @@ class ModelParamBundler : public ExprMutator {
     for (const Var& var : prim_params) {
       auto it = var_to_expr_.find(var);
       TVM_FFI_ICHECK(it != var_to_expr_.end());
-      var_remap_[var] = builder_->Emit((*it).second, var->name_hint);
+      var_remap_[var] = builder_->Emit((*it).second, var->name);
     }
     BindingBlock prologue = builder_->EndBlock();
 
@@ -150,8 +150,8 @@ class ModelParamBundler : public ExprMutator {
       TVM_FFI_ICHECK(field_type != var_to_field_type_.end());
       Type rebound_type = VisitExprDepTypeField(GetType(var));
       Var replacement = (*field_type).second.same_as(rebound_type)
-                            ? builder_->Emit((*it).second, op->name_hint)
-                            : builder_->EmitMatchCast((*it).second, 
rebound_type, op->name_hint);
+                            ? builder_->Emit((*it).second, op->name)
+                            : builder_->EmitMatchCast((*it).second, 
rebound_type, op->name);
       return replacement;
     }
     return ExprMutator::VisitExpr_(op);
diff --git a/src/relax/transform/canonicalize_bindings.cc 
b/src/relax/transform/canonicalize_bindings.cc
index 65851b0cb3..7d1d168fe7 100644
--- a/src/relax/transform/canonicalize_bindings.cc
+++ b/src/relax/transform/canonicalize_bindings.cc
@@ -233,7 +233,7 @@ class CanonicalizePlanner : public ExprVisitor {
     // of trivial bindings, then we can replace it with a DataflowVar.
     for (auto var : visitor.defined_inside_dataflow_) {
       if (!var.as<DataflowVarNode>() && 
!visitor.used_outside_home_dataflow_.count(var)) {
-        DataflowVar new_var(var->name_hint, GetType(var));
+        DataflowVar new_var(var->name, GetType(var));
 
         plan.replace_binding.Set(var, new_var);
         plan.replace_usage.Set(var, new_var);
diff --git a/src/relax/transform/expand_tuple_arguments.cc 
b/src/relax/transform/expand_tuple_arguments.cc
index fa37f9ca07..8d3603bcc2 100644
--- a/src/relax/transform/expand_tuple_arguments.cc
+++ b/src/relax/transform/expand_tuple_arguments.cc
@@ -49,9 +49,9 @@ ffi::Optional<Function> ExpandParams(Function func) {
     if (auto ty = param->ty.as<TupleTypeNode>()) {
       ffi::Array<Expr> internal_tuple;
       for (size_t i = 0; i < ty->fields.size(); i++) {
-        auto name = static_cast<const std::stringstream&>(std::stringstream()
-                                                          << param->name_hint 
<< "_" << i)
-                        .str();
+        auto name =
+            static_cast<const std::stringstream&>(std::stringstream() << 
param->name << "_" << i)
+                .str();
         Var new_param(name, ty->fields[i]);
         internal_tuple.push_back(new_param);
         expand_param(new_param);
diff --git a/src/relax/transform/fuse_ops.cc b/src/relax/transform/fuse_ops.cc
index 7d8986218b..d2f9870a38 100644
--- a/src/relax/transform/fuse_ops.cc
+++ b/src/relax/transform/fuse_ops.cc
@@ -503,7 +503,7 @@ class FunctionCreator : public ExprMutator {
       TVM_FFI_ICHECK(!item_indices.empty());
       int param_idx = tuple_param_idx_[tuple_arg];
       Var param = params_[param_idx];
-      ffi::String param_name = params_[param_idx]->name_hint;
+      ffi::String param_name = params_[param_idx]->name;
       TupleType param_ty = tuple_arg->ty.as_or_throw<TupleType>();
 
       ffi::Array<Expr> item_args;
@@ -639,9 +639,8 @@ class FunctionCreator : public ExprMutator {
     }
     if ((var == nullptr || defined_vars_.count(var) == 0) &&
         (lift_constant_ || !expr->IsInstance<ConstantNode>())) {
-      ffi::String name = var != nullptr
-                             ? var->name_hint
-                             : ffi::String("param_" + 
std::to_string(n_param_for_const_++));
+      ffi::String name =
+          var != nullptr ? var->name : ffi::String("param_" + 
std::to_string(n_param_for_const_++));
       Type param_ty = GetType(expr);
       if (!IsInlinableConstants(expr)) {
         Var param(std::move(name), GetType(expr));
@@ -956,8 +955,8 @@ class OperatorFusor : public ExprMutator {
           if (producer_group != cur_group) {
             for (Group* depgroup : group_deps_[producer_group]) {
               TVM_FFI_ICHECK(depgroup != cur_group)
-                  << "A cyclic dependency detected between the groups " << 
binding->var->name_hint
-                  << " and " << used_var->name_hint << " are in.";
+                  << "A cyclic dependency detected between the groups " << 
binding->var->name
+                  << " and " << used_var->name << " are in.";
             }
             group_deps_[cur_group].push_back(producer_group);
           }
@@ -1355,7 +1354,7 @@ class CompositeFunctionAnnotator : public ExprMutator {
     ffi::Array<Expr> params;
 
     for (auto v : func_node->params) {
-      Var new_v(v->name_hint, GetType(v));
+      Var new_v(v->name, GetType(v));
       param_vars.push_back(new_v);
       params.push_back(new_v);
     }
diff --git a/src/relax/transform/fuse_tir.cc b/src/relax/transform/fuse_tir.cc
index e74584856d..3a653ea753 100644
--- a/src/relax/transform/fuse_tir.cc
+++ b/src/relax/transform/fuse_tir.cc
@@ -931,7 +931,7 @@ class FusedTIRConstructor : public ExprVisitor {
         << "All tuple parameters should be expanded before this point in 
FuseTIR.  "
         << "However, parameter " << relax_param << " has type " << ty;
 
-    auto name_hint = relax_param->name_hint;
+    auto name_hint = relax_param->name;
 
     if (const auto* tensor = ty.as<TensorTypeNode>()) {
       // Case 1. The relax param is a Tensor, we directly create a tirx var 
and buffer
diff --git a/src/relax/transform/gradient.cc b/src/relax/transform/gradient.cc
index f11d6af8c2..a927014ea4 100644
--- a/src/relax/transform/gradient.cc
+++ b/src/relax/transform/gradient.cc
@@ -166,7 +166,7 @@ class CheckpointCollector : private ExprMutator {
       // Add remapping from binding->var to new_var
       if (!binding->var.as<DataflowVarNode>() && 
var->IsInstance<DataflowVarNode>()) {
         // For output binding, emit a dummy binding
-        this->var_remap_[binding->var] = builder_->EmitOutput(orig_var, 
orig_var->name_hint);
+        this->var_remap_[binding->var] = builder_->EmitOutput(orig_var, 
orig_var->name);
       } else {
         this->var_remap_[binding->var] = orig_var;
       }
@@ -231,7 +231,7 @@ class CheckpointGenerator : private ExprMutator {
     if (it != checkpoint_map_.end()) {
       return std::make_pair((*it).second, new_value);
     }
-    auto new_var = builder_->Emit(new_value, var->name_hint + "_cp");
+    auto new_var = builder_->Emit(new_value, var->name + "_cp");
     checkpoint_map_.Set(var, new_var);
     return std::make_pair(new_var, new_value);
   }
@@ -250,7 +250,7 @@ class CheckpointGenerator : private ExprMutator {
     if (it != checkpoint_map_.end()) {
       return (*it).second;
     }
-    Var new_var = builder_->Emit(VisitExpr(binding_map_[var]), var->name_hint 
+ "_cp");
+    Var new_var = builder_->Emit(VisitExpr(binding_map_[var]), var->name + 
"_cp");
     checkpoint_map_.Set(var, new_var);
     return new_var;
   }
@@ -520,9 +520,9 @@ class BackwardBindingGenerator : private ExprVisitor {
   Var EmitAdjoint(const Var& source_var, const Expr& adjoint, bool is_output) {
     Var adjoint_var;
     if (is_output) {
-      adjoint_var = builder_->EmitOutput(adjoint, source_var->name_hint + 
"_adjoint_out");
+      adjoint_var = builder_->EmitOutput(adjoint, source_var->name + 
"_adjoint_out");
     } else {
-      adjoint_var = builder_->Emit(adjoint, source_var->name_hint + 
"_adjoint");
+      adjoint_var = builder_->Emit(adjoint, source_var->name + "_adjoint");
       adjoint_var_map_.Set(source_var, adjoint_var);
     }
     return adjoint_var;
@@ -768,16 +768,15 @@ class GradientMutator : private ExprMutator {
     for (const auto& var : require_grads) {
       auto it = var_map.find(var);
       TVM_FFI_ICHECK(it != var_map.end())
-          << "There is no Var named " << var->name_hint << " in the function " 
<< func_name;
-      TVM_FFI_ICHECK_EQ(var_set.count(var), 0)
-          << "Var " << var->name_hint << " appears more than once";
+          << "There is no Var named " << var->name << " in the function " << 
func_name;
+      TVM_FFI_ICHECK_EQ(var_set.count(var), 0) << "Var " << var->name << " 
appears more than once";
       var_set.emplace(var);
       mapped_vars.push_back((*it).second);
 
       TVM_FFI_ICHECK(IsNestedTensorConditioned(GetType(var), 
IsFloatTensorType))
           << "Only Tensors of floating point dtype or Tuples of float "
              "Tensors can require gradients, but the Type of Var "
-          << var->name_hint << " is " << GetType(var);
+          << var->name << " is " << GetType(var);
     }
     return mapped_vars;
   }
diff --git a/src/relax/transform/inline_functions.cc 
b/src/relax/transform/inline_functions.cc
index a15d896457..d790737adb 100644
--- a/src/relax/transform/inline_functions.cc
+++ b/src/relax/transform/inline_functions.cc
@@ -129,7 +129,7 @@ class FunctionInliner : public ExprMutator {
       //
       // This implementation uses Option 4.
 
-      Var param_var(func->params[i]->name_hint, args[i]->ty.as<Type>());
+      Var param_var(func->params[i]->name, args[i]->ty.as<Type>());
       param_bindings.push_back(VarBinding(param_var, args[i]));
       param_map.Set(func->params[i], param_var);
     }
diff --git a/src/relax/transform/lambda_lift.cc 
b/src/relax/transform/lambda_lift.cc
index 6a418ec815..350bb66c90 100644
--- a/src/relax/transform/lambda_lift.cc
+++ b/src/relax/transform/lambda_lift.cc
@@ -96,7 +96,7 @@ class LambdaNameCollector : ExprVisitor {
       lifted_with_global_symbol_.insert({func, public_name});
     }
 
-    name_stack_.push_back(binding->var->name_hint);
+    name_stack_.push_back(binding->var->name);
     lambda_location_.insert({func, name_stack_});
     ExprVisitor::VisitBinding_(binding, func);
     name_stack_.pop_back();
@@ -285,7 +285,7 @@ class LambdaLifter : public ExprMutator {
     ffi::Array<Var> typed_captured_vars;
     ffi::Map<Var, Expr> rebinding_map;
     for (auto free_var : captured_vars) {
-      Var var = Var(free_var->name_hint, GetType(free_var), free_var->span);
+      Var var = Var(free_var->name, GetType(free_var), free_var->span);
       typed_captured_vars.push_back(var);
       rebinding_map.Set(free_var, var);
     }
diff --git a/src/relax/transform/lazy_transform_params.cc 
b/src/relax/transform/lazy_transform_params.cc
index 027d796245..e2ce85896b 100644
--- a/src/relax/transform/lazy_transform_params.cc
+++ b/src/relax/transform/lazy_transform_params.cc
@@ -99,10 +99,10 @@ class LazyInputMutator : public ExprMutator {
         auto untyped = builder_->Emit(Call(Type::Missing(), plan_->fget_param,
                                            {
                                                
PrimExpr(IntImm::Int64(it->second)),
-                                               StringImm(var->name_hint),
+                                               StringImm(var->name),
                                            }),
-                                      var->name_hint + "_untyped");
-        return builder_->EmitMatchCast(untyped, GetType(var), var->name_hint);
+                                      var->name + "_untyped");
+        return builder_->EmitMatchCast(untyped, GetType(var), var->name);
       }
     }
 
diff --git a/src/relax/transform/lift_transform_params.cc 
b/src/relax/transform/lift_transform_params.cc
index 0a4214b878..84e77c6394 100644
--- a/src/relax/transform/lift_transform_params.cc
+++ b/src/relax/transform/lift_transform_params.cc
@@ -104,7 +104,7 @@ struct BaseCollectInfo {
     }
 
     for (const auto& var : outputs) {
-      Var out_var(var->name_hint + "_output", GetType(var));
+      Var out_var(var->name + "_output", GetType(var));
       output_var_binding.push_back(VarBinding(out_var, var));
       output_exprs.push_back(out_var);
     }
@@ -274,7 +274,7 @@ struct LocalCollectInfo : public BaseCollectInfo {
       return global_outputs;
     }();
     for (const auto& var : compile_time_outputs) {
-      Var param_var(var->name_hint, GetType(var));
+      Var param_var(var->name, GetType(var));
       bindings.push_back(VarBinding(var, param_var));
       params.push_back(param_var);
     }
diff --git a/src/relax/transform/realize_vdevice.cc 
b/src/relax/transform/realize_vdevice.cc
index d2ff9aa5d1..834fe97351 100644
--- a/src/relax/transform/realize_vdevice.cc
+++ b/src/relax/transform/realize_vdevice.cc
@@ -368,9 +368,9 @@ class VDeviceTypeUpdater : ExprMutator {
         }();
 
         if (var->IsInstance<DataflowVarNode>()) {
-          var = DataflowVar(var->name_hint, new_ty, var->span);
+          var = DataflowVar(var->name, new_ty, var->span);
         } else {
-          var = Var(var->name_hint, new_ty, var->span);
+          var = Var(var->name, new_ty, var->span);
         }
       }
     }
diff --git a/src/relax/transform/remove_unused_parameters.cc 
b/src/relax/transform/remove_unused_parameters.cc
index 61ead90cf7..0ec73ee2d6 100644
--- a/src/relax/transform/remove_unused_parameters.cc
+++ b/src/relax/transform/remove_unused_parameters.cc
@@ -103,7 +103,7 @@ std::optional<CalleeAnalysis> AnalyzeCallee(Function func) {
     // Promote the free symbolic var via a 1-D shape param so the param 
actually
     // *defines* the var. A PrimType param only carries a dtype and defines no
     // TIR var, which leaves the var undefined under the strict tirx verifier.
-    Var relax_var("param_" + tir_var->name_hint, 
ShapeType({tir_var.as_or_throw<PrimExpr>()}));
+    Var relax_var("param_" + tir_var->name, 
ShapeType({tir_var.as_or_throw<PrimExpr>()}));
     params.push_back(relax_var);
   }
 
diff --git a/src/relax/transform/rewrite_cuda_graph.cc 
b/src/relax/transform/rewrite_cuda_graph.cc
index c993a83748..5396d3ce2e 100644
--- a/src/relax/transform/rewrite_cuda_graph.cc
+++ b/src/relax/transform/rewrite_cuda_graph.cc
@@ -138,7 +138,7 @@ class FuncBuilder : public ExprMutator {
     }
     // Set up the parameters
     for (const auto* input : inputs_) {
-      auto new_var = Var(input->name_hint, 
VisitExprDepTypeField(input->ty.as_or_throw<Type>()));
+      auto new_var = Var(input->name, 
VisitExprDepTypeField(input->ty.as_or_throw<Type>()));
       var_remap_[ffi::GetRef<Var>(input)] = new_var;
       params.push_back(new_var);
     }
@@ -252,7 +252,7 @@ class CUDAGraphRewritePlanner : public ExprVisitor {
           if (i < num_inputs) {
             for (const auto& symbolic_var : symbolic_vars) {
               auto prim_var = symbolic_var.as_or_throw<tirx::PrimVar>();
-              if 
(capture_symbolic_var_name_hints.count(symbolic_var->name_hint)) {
+              if (capture_symbolic_var_name_hints.count(symbolic_var->name)) {
                 capture_symbolic_vars_.insert(prim_var);
               }
             }
@@ -869,7 +869,7 @@ class CUDAGraphRewriter : public ExprMutator {
   }
 
   Var EmitRedef(const VarNode* var, const Expr& redef) {
-    auto new_var = builder_->Emit(redef, var->name_hint);
+    auto new_var = builder_->Emit(redef, var->name);
     var_remap_[ffi::GetRef<Var>(var)] = new_var;
     return new_var;
   }
diff --git a/src/relax/transform/specialize_primfunc_based_on_callsite.cc 
b/src/relax/transform/specialize_primfunc_based_on_callsite.cc
index e9563d43cd..9425694102 100644
--- a/src/relax/transform/specialize_primfunc_based_on_callsite.cc
+++ b/src/relax/transform/specialize_primfunc_based_on_callsite.cc
@@ -94,7 +94,7 @@ class SpecializeTIRCallArgs : ExprMutator {
       }
       ffi::String name;
       if (args[i]->IsInstance<tvm::VarNode>()) {
-        name = args[i].as_or_throw<Var>()->name_hint;
+        name = args[i].as_or_throw<Var>()->name;
       } else {
         name = std::string({static_cast<char>('A' + i)});
       }
diff --git a/src/relax/transform/static_plan_block_memory.cc 
b/src/relax/transform/static_plan_block_memory.cc
index c5db48b532..7d20152ab2 100644
--- a/src/relax/transform/static_plan_block_memory.cc
+++ b/src/relax/transform/static_plan_block_memory.cc
@@ -442,8 +442,8 @@ void SetTIRVarRangeConstraints(Function func, 
arith::AnalyzerObj* ana,
   }
   ffi::Array<tirx::Var> var_in_signature = TIRVarsInType(GetType(func));
   for (const tirx::Var& tir_var : var_in_signature) {
-    auto it_upper = var_upper_bound_attr.find(tir_var->name_hint);
-    auto it_lower = var_lower_bound_attr.find(tir_var->name_hint);
+    auto it_upper = var_upper_bound_attr.find(tir_var->name);
+    auto it_lower = var_lower_bound_attr.find(tir_var->name);
 
     // Only bind the variable to a range if an upper bound is explicitly 
provided.
     // Without an upper bound, memory planning cannot determine the required 
storage size,
@@ -457,7 +457,7 @@ void SetTIRVarRangeConstraints(Function func, 
arith::AnalyzerObj* ana,
       dom_map->Set(tir_var, arith::IntSet::FromRange(range));
     } else if (it_lower != var_lower_bound_attr.end() && 
it_lower->second->value >= 0) {
       ana->MarkGlobalNonNegValue(tir_var.as_or_throw<PrimExpr>());
-    } else if (non_negative_var_attr.count(tir_var->name_hint)) {
+    } else if (non_negative_var_attr.count(tir_var->name)) {
       ana->MarkGlobalNonNegValue(tir_var.as_or_throw<PrimExpr>());
     }
   }
diff --git a/src/relax/transform/to_mixed_precision.cc 
b/src/relax/transform/to_mixed_precision.cc
index 0764fd268f..3fe3da71b7 100644
--- a/src/relax/transform/to_mixed_precision.cc
+++ b/src/relax/transform/to_mixed_precision.cc
@@ -283,7 +283,7 @@ class ToMixedPrecisionRewriter : public ExprMutator {
     if (it != var_remap_.end()) {
       return it->second;
     } else {
-      if (fp16_input_names_.count(var->name_hint)) {
+      if (fp16_input_names_.count(var->name)) {
         auto ty = GetType(var);
         if (auto tensor_ty = ty.as<TensorTypeNode>()) {
           VDevice vdev = VDevice();
@@ -291,7 +291,7 @@ class ToMixedPrecisionRewriter : public ExprMutator {
             vdev = tensor_ty->vdevice.value();
           }
           TensorType fp16_ty(tensor_ty->shape.value(), PrimType::Float(16), 
vdev, tensor_ty->span);
-          Var fp16_var(var->name_hint, fp16_ty, var->span);
+          Var fp16_var(var->name, fp16_ty, var->span);
           var_remap_[var] = fp16_var;
           return fp16_var;
         }
diff --git a/src/relax/transform/to_non_dataflow.cc 
b/src/relax/transform/to_non_dataflow.cc
index ae279e4cd5..695e700251 100644
--- a/src/relax/transform/to_non_dataflow.cc
+++ b/src/relax/transform/to_non_dataflow.cc
@@ -34,7 +34,7 @@ class ToNonDFMutator : public ExprMutator {
  public:
   Var VisitVarDef(const Var& var) final {
     if (var.as<DataflowVarNode>()) {
-      Var new_var = Var(var->name_hint, GetType(var), var->span);
+      Var new_var = Var(var->name, GetType(var), var->span);
       this->var_remap_[var] = new_var;
       return new_var;
     }
diff --git a/src/relax/transform/utils.h b/src/relax/transform/utils.h
index 54b6d9f5a0..2f2e0895e7 100644
--- a/src/relax/transform/utils.h
+++ b/src/relax/transform/utils.h
@@ -245,9 +245,9 @@ class SymbolicVarRenewMutator : public ExprMutator {
   static Var CopyVar(const VarNode* op, Type ty) {
     ffi::Optional<Type> ty_annotation = ty.IsMissing() ? std::nullopt : 
ffi::Optional<Type>(ty);
     if (op->IsInstance<DataflowVarNode>()) {
-      return DataflowVar(op->name_hint, std::move(ty_annotation), op->span);
+      return DataflowVar(op->name, std::move(ty_annotation), op->span);
     }
-    return Var(op->name_hint, std::move(ty_annotation), op->span);
+    return Var(op->name, std::move(ty_annotation), op->span);
   }
 
   Type RenewType(const VarNode* op) {
diff --git a/src/s_tir/analysis/verify_gpu_code.cc 
b/src/s_tir/analysis/verify_gpu_code.cc
index c198a1cd06..9f20b80a0e 100644
--- a/src/s_tir/analysis/verify_gpu_code.cc
+++ b/src/s_tir/analysis/verify_gpu_code.cc
@@ -107,7 +107,7 @@ class GPUCodeVerifier : public StmtExprVisitor {
       const auto* extent = op->value.as<IntImmNode>();
       TVM_FFI_ICHECK(extent);
 
-      std::string name = var.get()->name_hint;
+      std::string name = var.get()->name;
       // record the number of threads in a block
       if (name == "threadIdx.x" || name == "threadIdx.y" || name == 
"threadIdx.z" ||
           name == "vthread") {
@@ -183,7 +183,7 @@ class GPUCodeVerifier : public StmtExprVisitor {
   }
 
   void VisitStmt_(const ForNode* op) {
-    if (op->loop_var->name_hint == "vthread.s") {
+    if (op->loop_var->name == "vthread.s") {
       const auto* extent = op->extent.as<IntImmNode>();
       TVM_FFI_ICHECK(extent);
 
diff --git a/src/s_tir/data_layout.cc b/src/s_tir/data_layout.cc
index e449208904..4393bfabb3 100644
--- a/src/s_tir/data_layout.cc
+++ b/src/s_tir/data_layout.cc
@@ -71,7 +71,7 @@ const SLayoutAxis& SLayoutAxis::Get(const char name) {
 }
 
 const SLayoutAxis& SLayoutAxis::Get(const IterVar& itvar) {
-  const std::string axis = itvar->var.get()->name_hint;
+  const std::string axis = itvar->var.get()->name;
   TVM_FFI_ICHECK_EQ(axis.size(), 1) << "Invalid layout axis " << axis;
   return SLayoutAxis::Get(axis[0]);
 }
@@ -99,12 +99,12 @@ SLayout::SLayout(const ffi::Array<IterVar>& axes) {
         TVM_FFI_ICHECK(!is_grouped)
             << "Only Subordinate Axes with extent is allowed within a packed 
dim";
       }
-      TVM_FFI_ICHECK_EQ(axis->var.get()->name_hint.size(), 1)
-          << "Invalid layout axis " << axis->var.get()->name_hint;
-      char c = axis->var.get()->name_hint.operator std::string()[0];
+      TVM_FFI_ICHECK_EQ(axis->var.get()->name.size(), 1)
+          << "Invalid layout axis " << axis->var.get()->name;
+      char c = axis->var.get()->name.operator std::string()[0];
       TVM_FFI_ICHECK((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
           << "Invalid layout axis " << c;
-      repr << axis->var.get()->name_hint;
+      repr << axis->var.get()->name;
     }
     if (is_grouped) repr << "]";
   }
@@ -167,9 +167,9 @@ SLayout::SLayout(const std::string& name, PrimType 
index_ty) {  // NOLINT(*)
       int64_t extent = 1;
       for (auto& axis : unpacked_axes) {
         TVM_FFI_ICHECK(axis->dom->extent.as<IntImmNode>())
-            << "Invalid SLayout " << name << ": can't have variable sized 
node("
-            << axis->var->name_hint << ") within a packed axis";
-        auto axis_name = axis->var->name_hint.operator std::string();
+            << "Invalid SLayout " << name << ": can't have variable sized 
node(" << axis->var->name
+            << ") within a packed axis";
+        auto axis_name = axis->var->name.operator std::string();
         auto factor = axis->dom->extent.as<IntImm>().value();
         ss << axis_name;
         extent = extent * factor->value;
@@ -192,7 +192,7 @@ SLayout::SLayout(const std::string& name, PrimType 
index_ty) {  // NOLINT(*)
   std::vector<int> axis_cnt(256, 0);
   for (const IterVar& pv : node->axes) {
     for (const IterVar& v : UnpackIterVar(pv)) {
-      auto axis_str = v->var.get()->name_hint.operator std::string();
+      auto axis_str = v->var.get()->name.operator std::string();
       TVM_FFI_ICHECK_EQ(axis_str.size(), 1);
       char axis = axis_str[0];
       TVM_FFI_ICHECK((axis >= 'a' && axis <= 'z') || (axis >= 'A' && axis <= 
'Z'));
@@ -201,7 +201,7 @@ SLayout::SLayout(const std::string& name, PrimType 
index_ty) {  // NOLINT(*)
   }
   for (const IterVar& pv : node->axes) {
     for (const IterVar& v : UnpackIterVar(pv)) {
-      char axis = v->var.get()->name_hint.operator std::string()[0];
+      char axis = v->var.get()->name.operator std::string()[0];
       if (axis >= 'a' && axis <= 'z') {
         TVM_FFI_ICHECK(axis_cnt[axis - 'a' + 'A'])
             << "Invalid layout " << name << ": missing axis " << 
std::toupper(axis);
@@ -231,7 +231,7 @@ ffi::Array<IterVar> SLayout::UnpackIterVar(IterVar 
packed_iter) {
   ffi::Array<IterVar> result;
   int64_t factor = 0, final_factor = 1;
 
-  std::string name(packed_iter->var->name_hint.c_str());
+  std::string name(packed_iter->var->name.c_str());
   PrimType index_ty = packed_iter->var.ty();
 
   for (auto ch : name) {
@@ -261,7 +261,7 @@ IterVar SLayout::PackIterVar(ffi::Array<IterVar> iter_vars) 
{
   for (auto itvar : iter_vars) {
     TVM_FFI_ICHECK(itvar->dom->extent.as<IntImm>())
         << "Packed Axis can contain only Subordinate Axes";
-    name << itvar->dom->extent.as<IntImm>().value() << itvar->var->name_hint;
+    name << itvar->dom->extent.as<IntImm>().value() << itvar->var->name;
     extent = extent * itvar->dom->extent.as<IntImm>().value()->value;
   }
 
@@ -594,7 +594,7 @@ TVM_FFI_STATIC_INIT_BLOCK() {
       .def("s_tir.SLayoutGetItem",
            [](SLayout layout, int idx) -> std::string {
              const auto& axis = layout.PackedAxisAt(idx);
-             return axis->var->name_hint;
+             return axis->var->name;
            })
       .def("s_tir.SBijectiveLayout",
            [](SLayout src_layout, SLayout dst_layout) -> SBijectiveLayout {
diff --git a/src/s_tir/schedule/primitive/annotate_buffer_access.cc 
b/src/s_tir/schedule/primitive/annotate_buffer_access.cc
index 10887e2c4d..0e2448f87c 100644
--- a/src/s_tir/schedule/primitive/annotate_buffer_access.cc
+++ b/src/s_tir/schedule/primitive/annotate_buffer_access.cc
@@ -134,7 +134,7 @@ struct AnnotateBufferAccessTraits : public 
UnpackedInstTraits<AnnotateBufferAcce
     std::ostringstream oss;
     auto print_expr = [&oss](const PrimExpr& expr) {
       if (auto var = expr.as<PrimVar>()) {
-        oss << var.value()->name_hint;
+        oss << var.value()->name;
       } else {
         oss << expr;
       }
@@ -142,7 +142,7 @@ struct AnnotateBufferAccessTraits : public 
UnpackedInstTraits<AnnotateBufferAcce
     oss << "lambda ";
     for (size_t i = 0; i < index_map->initial_indices.size(); ++i) {
       if (i != 0) oss << ", ";
-      oss << index_map->initial_indices[i]->name_hint;
+      oss << index_map->initial_indices[i]->name;
     }
     oss << ": [";
     for (size_t i = 0; i < index_map->final_indices.size(); i += 2) {
diff --git a/src/s_tir/schedule/primitive/cache_index.cc 
b/src/s_tir/schedule/primitive/cache_index.cc
index 9871f18fd3..e0c075544f 100644
--- a/src/s_tir/schedule/primitive/cache_index.cc
+++ b/src/s_tir/schedule/primitive/cache_index.cc
@@ -270,7 +270,7 @@ ffi::Array<SBlock> MakeIndexCacheStage(IndexInfo* info, 
const ffi::String& stora
           arith::EvalSet(info->var_binding.at(it), 
arith::AsIntSet(info->range_map)).max() + 1);
     }
     info->cache_buffer.push_back(Buffer(index_buffer_var, data_ty, 
buffer_shape, {1}, {0},
-                                        index_buffer_var->name_hint, 0, 0, 
kDefault));
+                                        index_buffer_var->name, 0, 0, 
kDefault));
 
     // Create loop vars and block vars' binding_value
     std::vector<PrimVar> loop_vars;
diff --git a/src/s_tir/schedule/primitive/cache_read_write.cc 
b/src/s_tir/schedule/primitive/cache_read_write.cc
index 47aa8354a7..c1d2025e9b 100644
--- a/src/s_tir/schedule/primitive/cache_read_write.cc
+++ b/src/s_tir/schedule/primitive/cache_read_write.cc
@@ -165,7 +165,7 @@ SBlock MakeReindexCacheStage(const BufferRegion& 
cache_region, ReindexCacheStage
   ffi::Map<Var, Var> var_map;
   for (size_t i = 0; i < info->loop_vars.size(); ++i) {
     Var original_var = info->loop_vars[i];
-    PrimVar loop_var(original_var->name_hint, 
original_var->ty.as_or_throw<PrimType>());
+    PrimVar loop_var(original_var->name, 
original_var->ty.as_or_throw<PrimType>());
     var_map.Set(original_var, loop_var);
     loop_vars.push_back(loop_var);
   }
@@ -174,7 +174,7 @@ SBlock MakeReindexCacheStage(const BufferRegion& 
cache_region, ReindexCacheStage
     PrimExpr original_iter_value = info->block_iter_values[i];
     IterVar block_var = IterVar(
         /*dom=*/original_block_var->dom,
-        /*var=*/PrimVar(original_block_var->var->name_hint, 
original_block_var->var.ty()),
+        /*var=*/PrimVar(original_block_var->var->name, 
original_block_var->var.ty()),
         /*IterVarType=*/kDataPar);
     var_map.Set(original_block_var->var, block_var->var);
     block_vars.push_back(block_var);
@@ -2039,7 +2039,7 @@ void CollectReindexCacheStageInfoAndCreateBuffer(
   ffi::ObjectPtr<VarNode> new_var = 
ffi::make_object<VarNode>(*old_buffer->data.get());
   const auto* ptr_type = TVM_TYPE_AS(old_buffer->data->ty, PointerTypeNode);
   new_var->ty = PointerType(ptr_type->element_type, storage_scope);
-  new_buffer->data = Var(new_var->name_hint + "_" + storage_scope, 
new_var->ty);
+  new_buffer->data = Var(new_var->name + "_" + storage_scope, new_var->ty);
   new_buffer->name = old_buffer->name + "_" + storage_scope;
   new_buffer->shape = new_shape;
 
diff --git a/src/s_tir/schedule/primitive/layout_transformation.cc 
b/src/s_tir/schedule/primitive/layout_transformation.cc
index de0ed83e28..9ebdd599a2 100644
--- a/src/s_tir/schedule/primitive/layout_transformation.cc
+++ b/src/s_tir/schedule/primitive/layout_transformation.cc
@@ -294,7 +294,7 @@ class TransformLayoutPlanner : private StmtExprVisitor {
 
       new_indices = inverse->initial_indices.Map([](PrimVar var) {
         std::stringstream ss;
-        ss << "v_" << var->name_hint;
+        ss << "v_" << var->name;
         return Var(ss.str(), var.ty());
       });
 
@@ -478,7 +478,7 @@ class TransformLayoutPlanner : private StmtExprVisitor {
     for (size_t i = 0; i < inverse->initial_indices.size(); i++) {
       const auto& loop_var = inverse->initial_indices[i];
       const auto& dim = new_buffer->shape[i];
-      Var block_var("v_" + loop_var->name_hint, loop_var.ty());
+      Var block_var("v_" + loop_var->name, loop_var.ty());
       IterVar iter_var(Range(0, dim), block_var.as_or_throw<PrimVar>(), 
kDataPar);
       loop_indices_to_block_indices.Set(loop_var, block_var);
       indices.push_back(iter_var->var);
@@ -573,7 +573,7 @@ class TransformLayoutPlanner : private StmtExprVisitor {
     for (size_t i = 0; i < inverse->initial_indices.size(); i++) {
       const auto& loop_var = inverse->initial_indices[i];
       const auto& dim = new_buffer->shape[i];
-      Var block_var("v_" + loop_var->name_hint, loop_var.ty());
+      Var block_var("v_" + loop_var->name, loop_var.ty());
       IterVar iter_var(Range(0, dim), block_var.as_or_throw<PrimVar>(), 
kDataPar);
       indices.push_back(iter_var->var);
       iter_vars.push_back(iter_var);
@@ -1135,7 +1135,7 @@ IndexMap LegalizeIndexMapDType(const IndexMap& index_map, 
const ffi::Array<PrimE
 
     DLDataType initial_dtype = initial_indices_orig[i].ty()->dtype;
     if (arg_dtype != initial_dtype) {
-      auto new_idx = Var(initial_indices_orig[i]->name_hint, args[i].ty());
+      auto new_idx = Var(initial_indices_orig[i]->name, args[i].ty());
       initial_indices.push_back(new_idx);
       var_map.Set(initial_indices_orig[i], new_idx.as_or_throw<PrimExpr>());
     } else {
diff --git a/src/s_tir/schedule/primitive/loop_transformation.cc 
b/src/s_tir/schedule/primitive/loop_transformation.cc
index b3573843b4..845e88fe64 100644
--- a/src/s_tir/schedule/primitive/loop_transformation.cc
+++ b/src/s_tir/schedule/primitive/loop_transformation.cc
@@ -485,7 +485,7 @@ class BufferIndicesMapExtractor : public StmtExprVisitor {
         check_ = true;
         break;
       }
-      indices.push_back(var.value()->name_hint);
+      indices.push_back(var.value()->name);
     }
     if (buffer_indices_map.find(store->buffer->name) == 
buffer_indices_map.end() && !check_)
       buffer_indices_map.Set(store->buffer->name, indices);
@@ -501,7 +501,7 @@ class BufferIndicesMapExtractor : public StmtExprVisitor {
         check_ = true;
         break;
       }
-      indices.push_back(var.value()->name_hint);
+      indices.push_back(var.value()->name);
     }
     if (buffer_indices_map.find(load->buffer->name) == 
buffer_indices_map.end() && !check_)
       buffer_indices_map.Set(load->buffer->name, indices);
@@ -547,7 +547,7 @@ class BlockMutator : public StmtExprMutator {
     // If iter_vars.size() is 0, then the block most probably be an Opaque 
block
     if (new_block->iter_vars.size() == 0 || inner_iter_var_index == -1) {
       new_block.CopyOnWrite()->name_hint =
-          new_block.CopyOnWrite()->name_hint + "_" + new_loop_var_->name_hint;
+          new_block.CopyOnWrite()->name_hint + "_" + new_loop_var_->name;
       return new_block;
     }
 
@@ -558,7 +558,7 @@ class BlockMutator : public StmtExprMutator {
         MutateArray(new_block->iter_vars, [this, &iter_var_](const IterVar& 
iter) {
           auto dtype = iter->var.ty();
           // Create new Var instance for each IterVar
-          Var new_var = Var(iter->var->name_hint, iter->var.ty());
+          Var new_var = Var(iter->var->name, iter->var.ty());
           IterVar new_iter = iter;
           new_iter.CopyOnWrite()->var = new_var.as_or_throw<PrimVar>();
           // Change the domain of IterVar corresponding to partitioned loop_var
@@ -572,14 +572,14 @@ class BlockMutator : public StmtExprMutator {
     if (!new_block->iter_vars.same_as(new_iter_vars)) {
       new_block.CopyOnWrite()->iter_vars = std::move(new_iter_vars);
       new_block.CopyOnWrite()->name_hint =
-          new_block.CopyOnWrite()->name_hint + "_" + new_loop_var_->name_hint;
+          new_block.CopyOnWrite()->name_hint + "_" + new_loop_var_->name;
     }
 
     // Get the (iter_var, new Range) map
     ffi::Map<ffi::String, Range> index_range_map;
     for (size_t i = 0; i < new_block->iter_vars.size(); i++) {
       IterVar iter = new_block->iter_vars[i];
-      index_range_map.Set(iter->var->name_hint, iter->dom);
+      index_range_map.Set(iter->var->name, iter->dom);
     }
 
     // Get the (Buffer, indices) map
@@ -623,7 +623,7 @@ class BlockMutator : public StmtExprMutator {
 
   Stmt VisitStmt_(const ForNode* op) final {
     For res = StmtMutator::VisitStmt_(op).as_or_throw<For>();
-    Var new_var = Var(op->loop_var->name_hint, op->loop_var.ty());
+    Var new_var = Var(op->loop_var->name, op->loop_var.ty());
 
     if (!op->loop_var.same_as(new_var)) {
       // If the partioned loop contains nested for loop, then create new 
iteration variable instance
@@ -664,7 +664,7 @@ ffi::Array<StmtSRef> LoopPartition(ScheduleState self, 
const StmtSRef& loop_sref
     dtype = PrimType::Int(bits);
   }
 
-  ffi::String block_name = get_sblock_name(loop->body) + "_" + 
loop->loop_var->name_hint;
+  ffi::String block_name = get_sblock_name(loop->body) + "_" + 
loop->loop_var->name;
   int n = factors.size();
   PrimExpr min_value = loop->min;
   PrimExpr extent_value;
@@ -913,7 +913,7 @@ StmtSRef Fuse(ScheduleState self, const 
ffi::Array<StmtSRef>& loop_srefs,
       return false;
     };
     if (UsesVar(loop->extent, f_contain)) {
-      throw DependentLoopError(self->mod, ffi::GetRef<For>(loop), 
used_var->name_hint,
+      throw DependentLoopError(self->mod, ffi::GetRef<For>(loop), 
used_var->name,
                                DependentLoopError::PrimitiveKind::kFuse);
     }
     outer_loop_vars.insert(loop->loop_var.get());
@@ -924,7 +924,7 @@ StmtSRef Fuse(ScheduleState self, const 
ffi::Array<StmtSRef>& loop_srefs,
   int n = loops.size();
   int bits = loops[0]->loop_var.ty().bits();
   for (int i = 1; i < n; i++) {
-    suffix += "_" + loops[i]->loop_var->name_hint;
+    suffix += "_" + loops[i]->loop_var->name;
     bits = std::max(bits, loops[i]->loop_var.ty().bits());
   }
   suffix += "_fused";
@@ -1111,7 +1111,7 @@ For ConstructNewLoopChain(const ScheduleState& self, 
std::vector<const StmtSRefN
       return false;
     };
     if (UsesVar(copy->min, f_contain) || UsesVar(copy->extent, f_contain)) {
-      throw DependentLoopError(self->mod, ffi::GetRef<For>(copy), 
used_var->name_hint,
+      throw DependentLoopError(self->mod, ffi::GetRef<For>(copy), 
used_var->name,
                                DependentLoopError::PrimitiveKind::kReorder);
     }
     inner_vars.insert(copy->loop_var.get());
diff --git a/src/s_tir/schedule/primitive/reduction.cc 
b/src/s_tir/schedule/primitive/reduction.cc
index 9dbc58233e..cf5e74a51e 100644
--- a/src/s_tir/schedule/primitive/reduction.cc
+++ b/src/s_tir/schedule/primitive/reduction.cc
@@ -889,7 +889,7 @@ class RFactorBlockCreator : public BaseBlockCreator {
   void CreateAdditionalIter() final {
     // Create a new data parallel block iter for the rfactor loop.
     additional_iter_ =
-        IterVarFromLoop(rf_loop_, "v" + rf_loop_->loop_var->name_hint, 
IterVarType::kDataPar);
+        IterVarFromLoop(rf_loop_, "v" + rf_loop_->loop_var->name, 
IterVarType::kDataPar);
     loop_var2block_binding_[rf_loop_->loop_var.get()] = additional_iter_->var;
     iter_vars_.push_back(additional_iter_);
     iter_values_.push_back(rf_loop_->loop_var);
@@ -923,7 +923,7 @@ class RFactorBlockCreator : public BaseBlockCreator {
         // We haven't created the new block iter for `var`. So here we create 
it, append it
         // and its binding to `rf_block_iter_vars` and `rf_block_iter_values` 
respectively.
         IterVar new_iter_var =
-            IterVarFromLoop(loop, "v" + loop->loop_var->name_hint, 
IterVarType::kCommReduce);
+            IterVarFromLoop(loop, "v" + loop->loop_var->name, 
IterVarType::kCommReduce);
         loop_var2block_binding_[var.get()] = new_iter_var->var;
         iter_vars_.push_back(new_iter_var);
         iter_values_.push_back(var.as_or_throw<PrimExpr>());
@@ -1017,7 +1017,7 @@ class WriteBackBlockCreator : public BaseBlockCreator {
   void CreateAdditionalIter() final {
     // Create a new reduction block iter for the rfactor loop.
     IterVar wb_new_block_iter =
-        IterVarFromLoop(rf_loop_, "v" + rf_loop_->loop_var->name_hint, 
kCommReduce);
+        IterVarFromLoop(rf_loop_, "v" + rf_loop_->loop_var->name, kCommReduce);
     iter_vars_.push_back(wb_new_block_iter);
     iter_values_.push_back(rf_loop_->loop_var);
     var_map_.Set(rf_additional_iter_->var, wb_new_block_iter->var);
diff --git a/src/s_tir/schedule/trace.cc b/src/s_tir/schedule/trace.cc
index 6410416baa..516a44d287 100644
--- a/src/s_tir/schedule/trace.cc
+++ b/src/s_tir/schedule/trace.cc
@@ -205,7 +205,7 @@ ffi::Array<Any> TranslateInputRVs(
       if (obj.as<IndexMapNode>()) {
         IndexMap index_map = obj.as_or_throw<IndexMap>();
         index_map = Substitute(index_map, [&named_rvs](const Var& var) -> 
ffi::Optional<PrimExpr> {
-          auto it = named_rvs.find(var->name_hint);
+          auto it = named_rvs.find(var->name);
           if (it != named_rvs.end()) {
             return it->second.as_or_throw<Var>().as_or_throw<PrimExpr>();
           }
diff --git a/src/s_tir/schedule/transform.cc b/src/s_tir/schedule/transform.cc
index ea67a44ce8..4c7ed8a074 100644
--- a/src/s_tir/schedule/transform.cc
+++ b/src/s_tir/schedule/transform.cc
@@ -43,7 +43,7 @@ Buffer WithScope(const Buffer& buffer, const ffi::String& 
scope) {
   ffi::ObjectPtr<BufferNode> new_buffer = 
ffi::make_object<BufferNode>(*buffer.get());
   const auto* ptr_type = TVM_TYPE_AS(buffer->data->ty, PointerTypeNode);
   Type new_type = PointerType(ptr_type->element_type, scope);
-  new_buffer->data = tirx::Var(buffer->data->name_hint + "_" + scope, 
new_type);
+  new_buffer->data = tirx::Var(buffer->data->name + "_" + scope, new_type);
   new_buffer->name = buffer->name + "_" + scope;
   return Buffer(new_buffer);
 }
@@ -52,8 +52,7 @@ Buffer WithDType(const Buffer& buffer, PrimType dtype) {
   ffi::ObjectPtr<BufferNode> new_buffer = 
ffi::make_object<BufferNode>(*buffer.get());
   new_buffer->dtype = dtype;
   const auto* ptr_type = TVM_TYPE_AS(buffer->data->ty, PointerTypeNode);
-  new_buffer->data =
-      tirx::Var(buffer->data->name_hint, PointerType(dtype, 
ptr_type->storage_scope));
+  new_buffer->data = tirx::Var(buffer->data->name, PointerType(dtype, 
ptr_type->storage_scope));
   new_buffer->name = buffer->name;
   return Buffer(new_buffer);
 }
diff --git a/src/s_tir/transform/compact_buffer_region.cc 
b/src/s_tir/transform/compact_buffer_region.cc
index 2db7d08278..b963af8b40 100644
--- a/src/s_tir/transform/compact_buffer_region.cc
+++ b/src/s_tir/transform/compact_buffer_region.cc
@@ -362,7 +362,7 @@ class BufferAccessRegionCollector : public StmtExprVisitor {
         }
         auto dom_it = dom_map_.find(v);
         TVM_FFI_ICHECK(dom_it != dom_map_.end())
-            << "Could not find domain for loop variable " << v->name_hint;
+            << "Could not find domain for loop variable " << v->name;
         non_relaxed[i] = dom_it->second;
         dom_map_.erase(dom_it);
       }
diff --git a/src/s_tir/transform/convert_blocks_to_opaque.cc 
b/src/s_tir/transform/convert_blocks_to_opaque.cc
index 3bc9e9e514..15c7b2b06b 100644
--- a/src/s_tir/transform/convert_blocks_to_opaque.cc
+++ b/src/s_tir/transform/convert_blocks_to_opaque.cc
@@ -49,7 +49,7 @@ class OpaqueBlockConverter : public StmtExprMutator {
 
   Expr VisitExpr_(const VarNode* var) final {
     TVM_FFI_ICHECK(!forbidden_iter_vars_.count(var))
-        << "Variable " << var->name_hint << " occurs in the predicate or 
iter_values of a block, "
+        << "Variable " << var->name << " occurs in the predicate or 
iter_values of a block, "
         << "but isn't defined until the body of the block";
 
     auto it = var_substitutes_.find(var);
diff --git a/src/s_tir/transform/inject_double_buffer.cc 
b/src/s_tir/transform/inject_double_buffer.cc
index 151bc11f55..d01ce9e6b4 100644
--- a/src/s_tir/transform/inject_double_buffer.cc
+++ b/src/s_tir/transform/inject_double_buffer.cc
@@ -168,7 +168,7 @@ class DoubleBufferInjector : public StmtExprMutator {
         PrimExpr factor = IntImm(new_ext.ty(), split_loop_);
         PrimExpr outer_ext = new_ext / factor;
         PrimExpr tail_base = outer_ext * factor;
-        Var outer_var(old_loop->loop_var->name_hint + ".outer", 
old_loop->loop_var.ty());
+        Var outer_var(old_loop->loop_var->name + ".outer", 
old_loop->loop_var.ty());
         std::unordered_map<const VarNode*, PrimExpr> vmap;
         std::vector<Stmt> loop_seq;
         for (int32_t i = 0; i < split_loop_; ++i) {
@@ -280,7 +280,7 @@ class DoubleBufferInjector : public StmtExprMutator {
     PrimExpr one = IntImm(e.loop->loop_var.ty(), 1);
     PrimExpr two = IntImm(e.loop->loop_var.ty(), 2);
     PrimExpr loop_shift = e.loop->loop_var + one;
-    e.switch_write_var = Var(e.loop->loop_var->name_hint + ".db", 
e.loop->loop_var.ty());
+    e.switch_write_var = Var(e.loop->loop_var->name + ".db", 
e.loop->loop_var.ty());
     e.switch_read_var = indexmod(e.loop->loop_var, two);
     in_double_buffer_scope_ = true;
     Stmt body = this->VisitStmt(op->body);
diff --git a/src/s_tir/transform/inject_virtual_thread.cc 
b/src/s_tir/transform/inject_virtual_thread.cc
index b1740260f3..e542707028 100644
--- a/src/s_tir/transform/inject_virtual_thread.cc
+++ b/src/s_tir/transform/inject_virtual_thread.cc
@@ -481,7 +481,7 @@ class VTInjector : public arith::IRMutatorWithAnalyzer {
       return SeqStmt::Flatten(seq);
     } else {
       // insert a for loop
-      Var idx(var_->name_hint + ".s", var_->ty);
+      Var idx(var_->name + ".s", var_->ty);
       stmt = Substitute(stmt, ffi::Map<Var, Expr>{{var_, idx}});
       PrimType idx_dtype = idx->ty.as_or_throw<PrimType>();
       return For(idx.as_or_throw<PrimVar>(), IntImm(idx_dtype, 0),
diff --git a/src/s_tir/transform/lower_cross_thread_reduction.cc 
b/src/s_tir/transform/lower_cross_thread_reduction.cc
index c1fefb5c2e..23011943b4 100644
--- a/src/s_tir/transform/lower_cross_thread_reduction.cc
+++ b/src/s_tir/transform/lower_cross_thread_reduction.cc
@@ -444,7 +444,7 @@ Stmt TransformReductionBlock(const SBlockRealizeNode* 
realize,
         IterVar new_iter_var{nullptr};
         {
           ffi::ObjectPtr<IterVarNode> n = 
ffi::make_object<IterVarNode>(*iter_var.get());
-          Var v(iter_var->var->name_hint, iter_var->var->ty, 
iter_var->var->span);
+          Var v(iter_var->var->name, iter_var->var->ty, iter_var->var->span);
           n->var = v.as_or_throw<PrimVar>();
           new_iter_var = IterVar(n);
         }
@@ -670,7 +670,7 @@ class CrossThreadReductionTransformer : public StmtMutator {
         TVM_FFI_CHECK(IsBoundToThreadIdx(reduction_loop), ValueError)
             << "Cross-thread reduction requires all the reduction-related 
loops that "
                "are bound to GPU thread axes to only be bound 
`threadIdx.x/y/z`. However, loop "
-            << reduction_loop->loop_var->name_hint << " violates the 
condition.";
+            << reduction_loop->loop_var->name << " violates the condition.";
       }
     }
 
diff --git a/src/s_tir/transform/memhammer_coalesce.cc 
b/src/s_tir/transform/memhammer_coalesce.cc
index 57388f4e81..728bcace44 100644
--- a/src/s_tir/transform/memhammer_coalesce.cc
+++ b/src/s_tir/transform/memhammer_coalesce.cc
@@ -37,7 +37,7 @@ Stmt FuseNestLoops(Stmt body) {
   std::string suffix;
   int n = loops.size();
   for (int i = 1; i < n; i++) {
-    suffix += "_" + loops[i]->loop_var->name_hint;
+    suffix += "_" + loops[i]->loop_var->name;
   }
   suffix += "_fused";
   PrimVar fused_var = loops[0]->loop_var.CopyWithSuffix(suffix);
diff --git a/src/s_tir/transform/merge_shared_memory_allocations.cc 
b/src/s_tir/transform/merge_shared_memory_allocations.cc
index 1bed17389f..952468f632 100644
--- a/src/s_tir/transform/merge_shared_memory_allocations.cc
+++ b/src/s_tir/transform/merge_shared_memory_allocations.cc
@@ -394,7 +394,7 @@ class SharedMemoryRewriter : public StmtExprMutator {
 
       // 7. Wrap with the merged-buffer AllocBuffer.
       Buffer merged_buf(scope.merged_buf_var, PrimType::UInt(8), 
{scope.merged_alloc_size}, {},
-                        PrimExpr(), scope.merged_buf_var->name_hint, 0, 0, 
BufferType::kDefault);
+                        PrimExpr(), scope.merged_buf_var->name, 0, 0, 
BufferType::kDefault);
       ffi::Map<ffi::String, ffi::Any> annotations;
       if (scope.has_volatile_alloc) {
         annotations.Set(tirx::attr::kVolatile, true);
diff --git a/src/s_tir/transform/renew_defs.cc 
b/src/s_tir/transform/renew_defs.cc
index 392e89b86e..23410ae422 100644
--- a/src/s_tir/transform/renew_defs.cc
+++ b/src/s_tir/transform/renew_defs.cc
@@ -156,7 +156,7 @@ class RenewDefMutator : public StmtExprMutator {
 
  private:
   Var ReDefineVar(const Var& var) {
-    Var new_var(var->name_hint, var->ty, var->span);
+    Var new_var(var->name, var->ty, var->span);
     this->AddDefRemap(var, new_var);
     return new_var;
   }
diff --git a/src/s_tir/transform/tensorcore_infer_fragment.cc 
b/src/s_tir/transform/tensorcore_infer_fragment.cc
index 860cdc2cc0..28b92a6e62 100644
--- a/src/s_tir/transform/tensorcore_infer_fragment.cc
+++ b/src/s_tir/transform/tensorcore_infer_fragment.cc
@@ -163,11 +163,11 @@ class FragmentChecker : public StmtExprVisitor {
   // A tool for checking shapes of two fragments
   bool CheckShape(const VarNode* buffer1, const VarNode* buffer2) {
     TVM_FFI_ICHECK(fragment_getter.fragments.count(buffer1))
-        << "Tensorecore fragment " << buffer1->name_hint
+        << "Tensorecore fragment " << buffer1->name
         << " must be filled (with tvm_fill_fragment) or loaded (with 
tvm_load_matrix_sync) before "
            "use.";
     TVM_FFI_ICHECK(fragment_getter.fragments.count(buffer2))
-        << "Tensorecore fragment " << buffer2->name_hint
+        << "Tensorecore fragment " << buffer2->name
         << " must be filled (with tvm_fill_fragment) or loaded (with 
tvm_load_matrix_sync) before "
            "use.";
     FragmentInfo info1 = fragment_getter.fragments.at(buffer1);
diff --git a/src/script/ir_builder/ir/ir.cc b/src/script/ir_builder/ir/ir.cc
index d1840e2fef..55e4f1b8f4 100644
--- a/src/script/ir_builder/ir/ir.cc
+++ b/src/script/ir_builder/ir/ir.cc
@@ -34,7 +34,7 @@ using tvm::script::ir_builder::details::Namer;
 TVM_STATIC_IR_FUNCTOR(Namer, vtable)
     .set_dispatch<tvm::VarNode>([](const ffi::ObjectRef& node, ffi::String 
name) -> void {
       VarNode* var = const_cast<VarNode*>(node.as<VarNode>());
-      var->name_hint = name;
+      var->name = name;
     });
 
 IRModuleFrame IRModule() {
diff --git a/src/target/llvm/codegen_cpu.cc b/src/target/llvm/codegen_cpu.cc
index 00ef46c952..f6dcb29cec 100644
--- a/src/target/llvm/codegen_cpu.cc
+++ b/src/target/llvm/codegen_cpu.cc
@@ -546,7 +546,7 @@ void CodeGenCPU::CreateComputeScope(const AttrStmtNode* op) 
{
   std::vector<llvm::Type*> arg_types;
   for (Var v : vargs) {
     llvm::Value* value = MakeValue(v);
-    value->setName(v->name_hint.c_str());
+    value->setName(v->name.c_str());
     arg_values.push_back(value);
     arg_types.push_back(value->getType());
   }
@@ -561,7 +561,7 @@ void CodeGenCPU::CreateComputeScope(const AttrStmtNode* op) 
{
   SetTargetAttributes(fcompute);
   for (auto it = fcompute->arg_begin(); it != fcompute->arg_end(); it++) {
     const Var& var = vargs[std::distance(fcompute->arg_begin(), it)];
-    it->setName(std::string(var->name_hint));
+    it->setName(std::string(var->name));
   }
 
   llvm::BasicBlock* compute_call_end = 
CheckCallSuccess(builder_->CreateCall(fcompute, arg_values));
@@ -635,8 +635,7 @@ void CodeGenCPU::UnpackClosureData(TypedPointer cdata, 
const ffi::Array<Var>& vf
     llvm::Type* field_type = cdata.type->getStructElementType(i);
     llvm::Value* field_addr =
         builder_->CreateInBoundsGEP(cdata.type, cdata.addr, {ConstInt32(0), 
ConstInt32(i)});
-    llvm::Value* load =
-        builder_->CreateLoad(field_type, field_addr, 
std::string(vfields[i]->name_hint));
+    llvm::Value* load = builder_->CreateLoad(field_type, field_addr, 
std::string(vfields[i]->name));
     (*vmap)[vfields[i].get()] = load;
   }
 }
@@ -1190,7 +1189,7 @@ void CodeGenCPU::VisitStmt_(const ForNode* op) {
     if (parallel_env_.penv == nullptr) {
       auto copy_node = For(ffi::make_object<ForNode>(*op));
       CreateParallelLaunch(copy_node, 0,
-                           std::string("loop_parallel_") + 
op->loop_var->name_hint.c_str());
+                           std::string("loop_parallel_") + 
op->loop_var->name.c_str());
     } else {
       // already in parallel env.
       TVM_FFI_ICHECK(parallel_env_.task_id.defined());
diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
index 89aeb9bde9..4e8c3beda5 100644
--- a/src/target/llvm/codegen_llvm.cc
+++ b/src/target/llvm/codegen_llvm.cc
@@ -324,7 +324,7 @@ void CodeGenLLVM::AddFunctionInternal(const GlobalVar& 
gvar, const PrimFunc& f)
     llvm::Argument* v = &(*arg_it);
     const Var& var = f->params[i];
     var_map_[var.get()] = v;
-    v->setName(std::string(var->name_hint));
+    v->setName(std::string(var->name));
     if (is_restricted_) {
       if (var->ty.as<PointerTypeNode>() && !alias_var_set_.count(var.get())) {
         // set non alias.
@@ -875,7 +875,7 @@ llvm::Value* 
CodeGenLLVM::CreateVecConcat(std::vector<llvm::Value*> vecs) {
 void CodeGenLLVM::CreateSerialFor(llvm::Value* begin, llvm::Value* end, 
llvm::Value* stride,
                                   const PrimVar& loop_var, const Stmt& body) {
   llvm::BasicBlock* pre_block = builder_->GetInsertBlock();
-  std::string loop_var_name = loop_var->name_hint;
+  std::string loop_var_name = loop_var->name;
   llvm::LLVMContext* ctx = llvm_target_->GetContext();
   auto* for_begin = llvm::BasicBlock::Create(*ctx, "for_begin_" + 
loop_var_name, function_);
   auto* for_body = llvm::BasicBlock::Create(*ctx, "for_body_" + loop_var_name, 
function_);
@@ -1021,7 +1021,7 @@ CodeGenLLVM::TypedPointer 
CodeGenLLVM::CreateBufferPtr(llvm::Value* buffer_ptr,
 
 llvm::Value* CodeGenLLVM::GetVarValue(const VarNode* v) const {
   auto it = var_map_.find(v);
-  TVM_FFI_ICHECK(it != var_map_.end()) << "cannot find variable " << 
v->name_hint;
+  TVM_FFI_ICHECK(it != var_map_.end()) << "cannot find variable " << v->name;
   return it->second;
 }
 
@@ -2191,7 +2191,7 @@ void CodeGenLLVM::VisitStmt_(const BindNode* op) {
         << ", but is being bound to expression with type " << op->value->ty;
     auto* llvm_type = GetLLVMType(v->ty);
     if (llvm_type != value->getType()) {
-      value->setName((v->name_hint + "_void_ptr").c_str());
+      value->setName((v->name + "_void_ptr").c_str());
       value = builder_->CreatePointerCast(value, llvm_type);
     }
   }
@@ -2300,7 +2300,7 @@ void CodeGenLLVM::AddDebugInformation(llvm::Function* 
f_llvm,
 
 void CodeGenLLVM::AddDebugInformation(llvm::Value* llvm_value, const Var& 
tir_var,
                                       llvm::Instruction* insert_before) {
-  llvm_value->setName(tir_var->name_hint.c_str());
+  llvm_value->setName(tir_var->name.c_str());
 
   if (!di_subprogram_) return;
 
@@ -2308,7 +2308,7 @@ void CodeGenLLVM::AddDebugInformation(llvm::Value* 
llvm_value, const Var& tir_va
   // no invalid dtypes
   if (!dbg_dtype) return;
   auto local_var = dbg_info_->di_builder_->createAutoVariable(
-      di_subprogram_, std::string(tir_var->name_hint), dbg_info_->file_, 0, 
dbg_dtype);
+      di_subprogram_, std::string(tir_var->name), dbg_info_->file_, 0, 
dbg_dtype);
 
   auto* di_loc = llvm::DILocation::get(*llvm_target_->GetContext(), 0, 0, 
di_subprogram_);
 
diff --git a/src/target/source/codegen_source_base.cc 
b/src/target/source/codegen_source_base.cc
index f9635b047a..9efb3815a3 100644
--- a/src/target/source/codegen_source_base.cc
+++ b/src/target/source/codegen_source_base.cc
@@ -55,8 +55,8 @@ std::string CodeGenSourceBase::SSAGetID(std::string src, 
const Type& t) {
 }
 
 std::string CodeGenSourceBase::AllocVarID(const tirx::VarNode* v) {
-  TVM_FFI_ICHECK(!var_idmap_.count(v)) << "Need input to be in SSA form dup " 
<< v->name_hint;
-  std::string key = v->name_hint;
+  TVM_FFI_ICHECK(!var_idmap_.count(v)) << "Need input to be in SSA form dup " 
<< v->name;
+  std::string key = v->name;
   std::string vid = name_supply_->FreshName(key);
   std::replace(vid.begin(), vid.end(), ':', '_');
   std::replace(vid.begin(), vid.end(), '-', '_');
@@ -67,7 +67,7 @@ std::string CodeGenSourceBase::AllocVarID(const 
tirx::VarNode* v) {
 
 std::string CodeGenSourceBase::GetVarID(const tirx::VarNode* v) const {
   auto it = var_idmap_.find(v);
-  TVM_FFI_ICHECK(it != var_idmap_.end()) << "Find undefined Variable " << 
v->name_hint;
+  TVM_FFI_ICHECK(it != var_idmap_.end()) << "Find undefined Variable " << 
v->name;
   return it->second;
 }
 
diff --git a/src/te/operation/create_primfunc.cc 
b/src/te/operation/create_primfunc.cc
index 926676fbe5..ec485da363 100644
--- a/src/te/operation/create_primfunc.cc
+++ b/src/te/operation/create_primfunc.cc
@@ -499,8 +499,8 @@ Stmt GenerateStmtFromCompute(const te::ComputeOp& 
compute_op, CreateFuncInfo* in
       bool first_times_define =
           std::find(axes_levels[i].begin(), axes_levels[i].end(), axis) != 
axes_levels[i].end();
       if (first_times_define) {
-        Var loop_var = Var(axis->var->name_hint, index_type);
-        Var block_var("v_" + axis->var->name_hint, index_type);
+        Var loop_var = Var(axis->var->name, index_type);
+        Var block_var("v_" + axis->var->name, index_type);
         PrimExpr min = axis->dom->min;
         PrimExpr extent = axis->dom->extent;
         if (i > 0) {
@@ -518,7 +518,7 @@ Stmt GenerateStmtFromCompute(const te::ComputeOp& 
compute_op, CreateFuncInfo* in
         TVM_FFI_ICHECK_GT(i, 0);
         TVM_FFI_ICHECK(scopes[i - 1].axes_remap.count(axis->var));
         PrimExpr prev_binding = scopes[i - 1].axes_remap.at(axis->var);
-        Var block_var("v_" + axis->var->name_hint, index_type);
+        Var block_var("v_" + axis->var->name, index_type);
         Range dom = Range::FromMinExtent(prev_binding, MakeConst(index_type, 
1));
         IterVar new_block_iter(dom, block_var.as_or_throw<PrimVar>(), 
axis->iter_type,
                                axis->thread_tag, axis->span);
diff --git a/src/tirx/analysis/var_use_def_analysis.cc 
b/src/tirx/analysis/var_use_def_analysis.cc
index ab8c66dba3..12e5e451a6 100644
--- a/src/tirx/analysis/var_use_def_analysis.cc
+++ b/src/tirx/analysis/var_use_def_analysis.cc
@@ -150,9 +150,9 @@ void VarUseDefAnalyzer::VisitBuffer(const Buffer& buffer) {
 void VarUseDefAnalyzer::HandleDef(const Var& var) {
   auto v = var.get();
   TVM_FFI_ICHECK(!def_count_.count(v))
-      << "variable " << v->name_hint << " has already been defined, the Stmt 
is not SSA";
+      << "variable " << v->name << " has already been defined, the Stmt is not 
SSA";
   TVM_FFI_ICHECK(!use_count_.count(v))
-      << "variable " << v->name_hint << " has been used before definition!";
+      << "variable " << v->name << " has been used before definition!";
   use_count_[v] = 0;
   def_count_[v] = 1;
 }
diff --git a/src/tirx/analysis/verify_well_formed.cc 
b/src/tirx/analysis/verify_well_formed.cc
index 8603d01eb8..59e79d6f4b 100644
--- a/src/tirx/analysis/verify_well_formed.cc
+++ b/src/tirx/analysis/verify_well_formed.cc
@@ -77,13 +77,13 @@ class BlockVarAccessVerifier : public StmtExprVisitor {
         if (it->second == 0) {
           TVM_FFI_THROW(InternalError)
               << "Well-formedness check failed: "
-              << "Loop iterator var " << op->name_hint << " is defined outside 
of any block, "
+              << "Loop iterator var " << op->name << " is defined outside of 
any block, "
               << "but is used inside the non-opaque current block \""
               << block_stack_.back()->name_hint << "\".";
         } else {
           TVM_FFI_THROW(InternalError)
               << "Well-formedness check failed: "
-              << "Loop iterator var " << op->name_hint << " is defined in 
block \""
+              << "Loop iterator var " << op->name << " is defined in block \""
               << block_stack_[it->second - 1]->name_hint << "\", "
               << "but is used inside the non-opaque current block \""
               << block_stack_.back()->name_hint << "\".";
@@ -184,7 +184,7 @@ class UndefinedVarVerifier : public 
Verifier<UndefinedVarVerifier> {
       auto verify = Verify(it == currently_defined_.end() || 
redefine_is_allowed);
       verify << "ValueError: "
              << "TIR is ill-formed, "
-             << "due to multiple nested definitions of variable " << 
var->name_hint << ".";
+             << "due to multiple nested definitions of variable " << var->name 
<< ".";
       if (it != currently_defined_.end()) {
         verify << " It was first defined at " << it->second << ", and was 
re-defined at " << path;
       }
@@ -195,7 +195,7 @@ class UndefinedVarVerifier : public 
Verifier<UndefinedVarVerifier> {
       auto verify = Verify(it == previously_defined_.end() || 
redefine_is_allowed);
       verify << "ValueError: "
              << "TIR is ill-formed, "
-             << "due to multiple definitions of variable " << var->name_hint 
<< ".";
+             << "due to multiple definitions of variable " << var->name << ".";
       if (it != previously_defined_.end()) {
         verify << " It was first defined at " << it->second << ", and was 
later re-defined at "
                << path;
@@ -218,7 +218,7 @@ class UndefinedVarVerifier : public 
Verifier<UndefinedVarVerifier> {
     auto active_def = currently_defined_.find(var);
     auto verify = Verify(active_def != currently_defined_.end());
     verify << "ValueError: "
-           << "Invalid use of undefined variable " << var->name_hint << " at " 
<< path << ".";
+           << "Invalid use of undefined variable " << var->name << " at " << 
path << ".";
 
     // Check if there was a previous definition, and append the
     // location to the error message if there was.  This is to aid in
@@ -339,8 +339,8 @@ class SingleEnvThreadVerifier : public 
Verifier<SingleEnvThreadVerifier> {
             << "While multiple tirx::AttrStmt may define the same environment 
thread, "
             << "all definitions within a single PrimFunc must share the same 
tirx::Var.  "
             << "Binding of environment thread \"" << iter_var->thread_tag
-            << "\" to the TIR variable " << iter_var->var->name_hint << " at " 
<< path
-            << " conflicts with the previous binding to the TIR variable " << 
prev_var->name_hint
+            << "\" to the TIR variable " << iter_var->var->name << " at " << 
path
+            << " conflicts with the previous binding to the TIR variable " << 
prev_var->name
             << " at " << path;
       } else {
         env_thread_vars_.insert({iter_var->thread_tag, {iter_var->var, path}});
diff --git a/src/tirx/ir/buffer.cc b/src/tirx/ir/buffer.cc
index 6374c53aac..3d52c94d86 100644
--- a/src/tirx/ir/buffer.cc
+++ b/src/tirx/ir/buffer.cc
@@ -604,11 +604,11 @@ Buffer::Buffer(Var data, PrimType dtype, 
ffi::Array<PrimExpr> shape, ffi::Array<
   // pointer.  Should be done alongside extensions to StmtExprMutator
   // to more easily handle buffer/buffer_var updates.
   TVM_FFI_ICHECK(!data->ty.IsMissing())
-      << "Variable " << data->name_hint << " is missing a type annotation.";
+      << "Variable " << data->name << " is missing a type annotation.";
   TVM_FFI_ICHECK(data->ty.as<PointerTypeNode>())
-      << "Variable " << data->name_hint << " is not a pointer.";
+      << "Variable " << data->name << " is not a pointer.";
   
TVM_FFI_ICHECK(data->ty.as<PointerTypeNode>()->element_type.as<PrimTypeNode>())
-      << "Variable " << data->name_hint << " does not point to a primitive.";
+      << "Variable " << data->name << " does not point to a primitive.";
 
   ValidateAxisSeparators(axis_separators, shape.size());
 
diff --git a/src/tirx/ir/index_map.cc b/src/tirx/ir/index_map.cc
index 5ddd6defa9..e4e473990d 100644
--- a/src/tirx/ir/index_map.cc
+++ b/src/tirx/ir/index_map.cc
@@ -87,7 +87,7 @@ std::pair<IndexMap, PrimExpr> IndexMapInverseImpl(const 
IndexMap& self,
     // input index as (X.outer, X.inner).
     std::string name;
     if (auto var = index.as<PrimVar>()) {
-      name = var.value()->name_hint;
+      name = var.value()->name;
     } else {
       name = "axis" + std::to_string(i);
     }
@@ -387,9 +387,8 @@ IndexMap IndexMap::RenameVariables(
       // The name of the variable is pre-defined.
       continue;
     }
-    ffi::String unique_name =
-        name_supply->FreshName(initial_index->name_hint, /*add_prefix=*/false);
-    if (unique_name != initial_index->name_hint) {
+    ffi::String unique_name = name_supply->FreshName(initial_index->name, 
/*add_prefix=*/false);
+    if (unique_name != initial_index->name) {
       var_remap.Set(initial_index, PrimVar(unique_name));
     }
   }
@@ -419,7 +418,7 @@ std::string IndexMap2PythonLambdaExpr(const 
ffi::Array<PrimVar>& initial_indices
   std::ostringstream oss;
   auto print_expr = [&oss](const PrimExpr& expr) {
     if (auto var = expr.as<PrimVar>()) {
-      oss << var.value()->name_hint;
+      oss << var.value()->name;
     } else {
       oss << expr;
     }
@@ -429,7 +428,7 @@ std::string IndexMap2PythonLambdaExpr(const 
ffi::Array<PrimVar>& initial_indices
     if (i != 0) {
       oss << ", ";
     }
-    oss << initial_indices[i]->name_hint;
+    oss << initial_indices[i]->name;
   }
   oss << ": (";
   for (size_t i = 0; i < final_indices.size(); ++i) {
diff --git a/src/tirx/script/builder/ir.cc b/src/tirx/script/builder/ir.cc
index 911eaf5d71..a3af8da702 100644
--- a/src/tirx/script/builder/ir.cc
+++ b/src/tirx/script/builder/ir.cc
@@ -628,8 +628,8 @@ LaunchThreadFrame LaunchThread(Var var, PrimExpr extent) {
     if (ffi::Optional<IterVar> opt_iter_var = 
opt_frame.value()->env_threads.Get(var)) {
       iter_var = opt_iter_var.value();
     } else {
-      TVM_FFI_THROW(InternalError) << "ValueError: " << var->name_hint
-                                   << " is not an env_thread created using 
T.env_thread.";
+      TVM_FFI_THROW(InternalError)
+          << "ValueError: " << var->name << " is not an env_thread created 
using T.env_thread.";
     }
   } else {
     TVM_FFI_THROW(InternalError) << "LaunchThread can only be used inside a 
PrimFunc";
diff --git a/src/tirx/script/printer/buffer.cc 
b/src/tirx/script/printer/buffer.cc
index 14bcba4d64..3a43f6fdd4 100644
--- a/src/tirx/script/printer/buffer.cc
+++ b/src/tirx/script/printer/buffer.cc
@@ -132,7 +132,7 @@ ffi::Map<ffi::String, ExprDoc> BufferAttrs(tirx::Buffer 
buffer, const AccessPath
               return d->AsDoc<ExprDoc>(buffer, buffer_p)
                   ->Attr("strides")[{LiteralDoc::Int(i, std::nullopt)}];
             })) {
-          results.push_back(LiteralDoc::Str(e.as_or_throw<Var>()->name_hint, 
e_p));
+          results.push_back(LiteralDoc::Str(e.as_or_throw<Var>()->name, e_p));
           continue;
         }
       }
diff --git a/src/tirx/script/printer/expr.cc b/src/tirx/script/printer/expr.cc
index f5577e8adc..9beb59799e 100644
--- a/src/tirx/script/printer/expr.cc
+++ b/src/tirx/script/printer/expr.cc
@@ -74,14 +74,14 @@ Doc PrintVar(const tirx::Var& var, const AccessPath& var_p, 
const IRDocsifier& d
       ExprDoc rhs = PrintVarCreation(var, var_p, d);
       opt_f.value()->stmts.push_back(AssignDoc(lhs, rhs, std::nullopt));
     } else {
-      LOG(WARNING) << "Didn't find variable definition for: " << 
var->name_hint;
+      LOG(WARNING) << "Didn't find variable definition for: " << var->name;
     }
   }
   if (ffi::Optional<ExprDoc> doc = d->GetVarDoc(var)) {
     return doc.value();
   }
   TVM_FFI_THROW(InternalError) << "IndexError: Variable is not defined in the 
environment: "
-                               << var->name_hint;
+                               << var->name;
   TVM_FFI_UNREACHABLE();
 }
 
@@ -93,7 +93,7 @@ TVM_STATIC_IR_FUNCTOR(IRDocsifier, vtable)  //
       if (!d->IsVarDefined(var)) {
         ExprDoc ann = d->AsDoc<ExprDoc>(var->ty, p->Attr("ty"));
         Frame f = d->frames.back();
-        ExprDoc lhs = d->Define(var, f, var->name_hint.empty() ? "v" : 
var->name_hint);
+        ExprDoc lhs = d->Define(var, f, var->name.empty() ? "v" : var->name);
         f->stmts.push_back(AssignDoc(lhs, std::nullopt, ann));
       }
       return d->GetVarDoc(var).value();
diff --git a/src/tirx/script/printer/stmt.cc b/src/tirx/script/printer/stmt.cc
index cf49aa4972..22e86d44e6 100644
--- a/src/tirx/script/printer/stmt.cc
+++ b/src/tirx/script/printer/stmt.cc
@@ -208,7 +208,7 @@ TVM_STATIC_IR_FUNCTOR(IRDocsifier, vtable)
     .set_dispatch<tirx::Bind>("", [](tirx::Bind stmt, AccessPath p, 
IRDocsifier d) -> Doc {
       // Step 1. Type annotation
       TVM_FFI_ICHECK(!stmt->var->ty.IsMissing())
-          << "Type annotation is required for variable: " << 
stmt->var->name_hint;
+          << "Type annotation is required for variable: " << stmt->var->name;
       ffi::Optional<ExprDoc> type_doc = d->AsDoc<ExprDoc>(stmt->var->ty,  //
                                                           
p->Attr("var")->Attr("ty"));
       if (const auto* tuple_type = stmt->var->ty.as<TupleTypeNode>()) {
diff --git a/src/tirx/script/printer/utils.h b/src/tirx/script/printer/utils.h
index 940577d666..b6e07ffd67 100644
--- a/src/tirx/script/printer/utils.h
+++ b/src/tirx/script/printer/utils.h
@@ -91,7 +91,7 @@ inline ExprDoc DefineVar(const tirx::Var& var, const Frame& 
frame, const IRDocsi
   if (ffi::Optional<ExprDoc> doc = d->GetVarDoc(var)) {
     return doc.value();
   }
-  return d->Define(var, frame, var->name_hint.empty() ? "v" : var->name_hint);
+  return d->Define(var, frame, var->name.empty() ? "v" : var->name);
 }
 
 /*!
diff --git a/src/tirx/transform/ir_utils.cc b/src/tirx/transform/ir_utils.cc
index 020b5913e6..5ced08b335 100644
--- a/src/tirx/transform/ir_utils.cc
+++ b/src/tirx/transform/ir_utils.cc
@@ -455,7 +455,7 @@ class IRConvertSSA final : public StmtExprMutator {
           it != function_scope_var_remap_.end()) {
         var = it->second;
       } else if (defined_.count(var.get())) {
-        Var new_var(var->name_hint, var->ty);
+        Var new_var(var->name, var->ty);
 
         function_scope_var_remap_.insert({var.get(), new_var});
         var = new_var;
@@ -527,7 +527,7 @@ class IRConvertSSA final : public StmtExprMutator {
   };
 
   /*! \brief Create a new variable with the same name and type as the 
original. */
-  static Var MakeNewVar(const Var& old_var) { return Var(old_var->name_hint, 
old_var->ty); }
+  static Var MakeNewVar(const Var& old_var) { return Var(old_var->name, 
old_var->ty); }
 
   /*! \brief Push a variable remap to the current scope and the var_remap_ 
stack. */
   void PushVarRemap(const Var& old_var, const Var& new_var) {
diff --git a/src/tirx/transform/ir_utils.h b/src/tirx/transform/ir_utils.h
index ed8a95ca0e..1313fe8918 100644
--- a/src/tirx/transform/ir_utils.h
+++ b/src/tirx/transform/ir_utils.h
@@ -114,7 +114,7 @@ inline PrimExpr TVMStructGet(PrimType type, Var handle, int 
index,
 inline Call AddressOffset(Var handle, PrimType dtype, int offset) {
   PrimExpr offset_expr = IntImm::Int32(offset * dtype.lanes());
   ffi::Array<PrimExpr> shape = {offset_expr + 1};
-  Buffer dummy_buf(handle, dtype, shape, {}, 0, handle->name_hint, 0, 0, 
kDefault, {}, Span(),
+  Buffer dummy_buf(handle, dtype, shape, {}, 0, handle->name, 0, 0, kDefault, 
{}, Span(),
                    std::nullopt);
   BufferLoad buf_load(dummy_buf, {offset_expr});
 
@@ -135,7 +135,7 @@ inline Call AddressOffset(Var handle, PrimType dtype, 
PrimExpr offset) {
   }
 
   ffi::Array<PrimExpr> shape = {offset + 1};
-  Buffer dummy_buf(handle, dtype.WithLanes(1), shape, {}, 0, 
handle->name_hint, 0, 0, kDefault, {},
+  Buffer dummy_buf(handle, dtype.WithLanes(1), shape, {}, 0, handle->name, 0, 
0, kDefault, {},
                    Span(), std::nullopt);
   BufferLoad buf_load(dummy_buf, {offset});
 
diff --git a/src/tirx/transform/lower_intrin.cc 
b/src/tirx/transform/lower_intrin.cc
index 6809024e21..f08bf49ddd 100644
--- a/src/tirx/transform/lower_intrin.cc
+++ b/src/tirx/transform/lower_intrin.cc
@@ -76,7 +76,7 @@ static Expr LowerAccessPtr(const CallNode* call) {
     offset = offset * IntImm(offset_ty, dtype.lanes());
     offset = Ramp(offset, IntImm(offset_ty, 1), dtype.lanes());
   }
-  Buffer dummy_buf(buffer_var, dtype.WithLanes(1), {offset + 1}, {}, 0, 
buffer_var->name_hint, 0, 0,
+  Buffer dummy_buf(buffer_var, dtype.WithLanes(1), {offset + 1}, {}, 0, 
buffer_var->name, 0, 0,
                    kDefault);
   BufferLoad buf_load(dummy_buf, {offset});
   return Call(call->ty, builtin::address_of(), {buf_load});
diff --git a/src/tirx/transform/lower_warp_memory.cc 
b/src/tirx/transform/lower_warp_memory.cc
index 2e553b26fb..62eb5f4798 100644
--- a/src/tirx/transform/lower_warp_memory.cc
+++ b/src/tirx/transform/lower_warp_memory.cc
@@ -279,7 +279,7 @@ class WarpAccessRewriter : protected StmtExprMutator {
     alloc_size = warp_group_ * factor;
 
     Buffer new_buf(op->buffer->data, op->buffer->dtype, 
{IntImm::Int32(alloc_size / width_)}, {},
-                   PrimExpr(), op->buffer->data->name_hint, 0, 0, 
BufferType::kDefault);
+                   PrimExpr(), op->buffer->data->name, 0, 0, 
BufferType::kDefault);
     Stmt rewritten_body = this->VisitStmt(body);
     return SeqStmt::Flatten(AllocBuffer(new_buf, op->annotations), 
rewritten_body);
   }
diff --git a/src/tirx/transform/narrow_datatype.cc 
b/src/tirx/transform/narrow_datatype.cc
index 4b58c1d838..fdcc2eac67 100644
--- a/src/tirx/transform/narrow_datatype.cc
+++ b/src/tirx/transform/narrow_datatype.cc
@@ -245,7 +245,7 @@ class NarrowDataTypeRewriter : public IndexDataTypeRewriter 
{
 
   Expr VisitExpr_(const VarNode* op) final {
     if (auto it = visitor_.vmap.find(op); !var_remap_.count(op) && it != 
visitor_.vmap.end()) {
-      var_remap_[op] = Var(op->name_hint, it->second);
+      var_remap_[op] = Var(op->name, it->second);
     }
     return Parent::VisitExpr_(op);
   }
diff --git a/src/tirx/transform/split_host_device.cc 
b/src/tirx/transform/split_host_device.cc
index a73ed07cb7..a54bc3e0fd 100644
--- a/src/tirx/transform/split_host_device.cc
+++ b/src/tirx/transform/split_host_device.cc
@@ -143,7 +143,7 @@ class HostDeviceSplitter : public StmtMutator {
             bool is_handle = var->ty.as<PointerTypeNode>() != nullptr;
             return std::tuple{
                 !is_handle,
-                var->name_hint,
+                var->name,
             };
           };
           return sort_key(a) < sort_key(b);
@@ -330,7 +330,7 @@ class DeviceInfoCollector : public StmtVisitor {
         thread_tag = iv.value()->thread_tag;
         TVM_FFI_ICHECK_NE(thread_tag.length(), 0U);
       } else if (auto var = op->node.as<Var>()) {
-        thread_tag = var.value()->name_hint;
+        thread_tag = var.value()->name;
       } else {
         TVM_FFI_THROW(TypeError) << "thread_extent node must be an IterVar or 
Var, but was "
                                  << op->node.GetTypeKey();
diff --git a/src/tirx/transform/storage_rewrite.cc 
b/src/tirx/transform/storage_rewrite.cc
index ef17566f37..0b0697446b 100644
--- a/src/tirx/transform/storage_rewrite.cc
+++ b/src/tirx/transform/storage_rewrite.cc
@@ -183,7 +183,7 @@ class LinearAccessPatternFinder final : public 
StmtExprVisitor {
     // Directly reference to the variable count as a read.
     auto it = alloc_info_.find(buf);
     if (it != alloc_info_.end() && it->second.alloc) {
-      TVM_FFI_ICHECK_LT(it->second.level, scope_.size()) << " buf=" << 
buf->name_hint;
+      TVM_FFI_ICHECK_LT(it->second.level, scope_.size()) << " buf=" << 
buf->name;
       scope_[it->second.level].touched.push_back(buf);
     }
   }
@@ -377,7 +377,7 @@ class InplaceOpVerifier : public StmtExprVisitor {
         return;
       }
       TVM_FFI_ICHECK_EQ(store_->indices.size(), op->indices.size())
-          << "Store/Load occur to the same buffer " << buf->name_hint
+          << "Store/Load occur to the same buffer " << buf->name
           << " with differing number of indices";
       for (size_t i = 0; i < store_->indices.size(); i++) {
         if (!tirx::ExprDeepEqual()(store_->indices[i], op->indices[i])) {
@@ -461,15 +461,15 @@ class StoragePlanRewriter : public StmtExprMutator {
     if (it != buffer_remap_.end()) {
       TVM_FFI_ICHECK_EQ(it->second->data.get(), new_backing_array.get())
           << "Cannot remap buffer " << buf->name << " to use backing array "
-          << new_backing_array->name_hint << ", previously used backing array "
-          << it->second->data->name_hint;
+          << new_backing_array->name << ", previously used backing array "
+          << it->second->data->name;
       return it->second;
     }
 
     Buffer remapped =
         Buffer(new_backing_array, buf->dtype, buf->shape, buf->strides, 
buf->elem_offset,
-               new_backing_array->name_hint, buf->data_alignment, 
buf->offset_factor,
-               buf->buffer_type, buf->axis_separators, buf->span, buf->layout, 
buf->allocated_addr);
+               new_backing_array->name, buf->data_alignment, 
buf->offset_factor, buf->buffer_type,
+               buf->axis_separators, buf->span, buf->layout, 
buf->allocated_addr);
     buffer_remap_[key] = remapped;
     return remapped;
   }
@@ -741,7 +741,7 @@ class StoragePlanRewriter : public StmtExprMutator {
           PrimExpr combo_size;
           for (const AllocBufferNode* op : e->allocs) {
             TVM_FFI_ICHECK_EQ(op->buffer->shape.size(), 1)
-                << "Buffer var " << op->buffer->data->name_hint
+                << "Buffer var " << op->buffer->data->name
                 << " was identified as a re-usable allocation, but has " << 
op->buffer->shape.size()
                 << " physical dimensions.  "
                 << "Currently, only flat 1-d memory spaces should be 
identified as re-usable "
@@ -774,8 +774,8 @@ class StoragePlanRewriter : public StmtExprMutator {
             combo_size = combo_size + IntImm::Int32(1);
           }
           combo_size = analyzer_->Simplify(combo_size);
-          Buffer buf(e->alloc_var, alloc_type, {combo_size}, {}, PrimExpr(),
-                     e->alloc_var->name_hint, 0, 0, BufferType::kDefault);
+          Buffer buf(e->alloc_var, alloc_type, {combo_size}, {}, PrimExpr(), 
e->alloc_var->name, 0,
+                     0, BufferType::kDefault);
           ffi::Map<ffi::String, ffi::Any> annotations;
           if (e->is_volatile) {
             annotations.Set(attr::kVolatile, true);
@@ -812,8 +812,8 @@ class StoragePlanRewriter : public StmtExprMutator {
     uint64_t type_bits = e->elem_type.bits() * e->elem_type.lanes();
     PrimExpr alloc_size =
         MakeConst(e->allocs[0]->buffer->shape[0].ty(), (total_bits + type_bits 
- 1) / type_bits);
-    Buffer buf(e->alloc_var, e->elem_type, {alloc_size}, {}, PrimExpr(), 
e->alloc_var->name_hint, 0,
-               0, BufferType::kDefault);
+    Buffer buf(e->alloc_var, e->elem_type, {alloc_size}, {}, PrimExpr(), 
e->alloc_var->name, 0, 0,
+               BufferType::kDefault);
     bool any_volatile = e->is_volatile;
     for (StorageEntry* child : e->merged_children) {
       if (child->is_volatile) any_volatile = true;
@@ -1327,7 +1327,7 @@ class VectorTypeAccessChecker : public StmtExprVisitor {
   void OnArrayDeclaration(Var buffer, PrimType element_dtype, PrimExpr extent,
                           BufferVarInfo::DeclarationLocation 
declaration_location) {
     TVM_FFI_ICHECK(info_map_.find(buffer.get()) == info_map_.end())
-        << "Array declaration of " << buffer->name_hint << " occurred multiple 
times.";
+        << "Array declaration of " << buffer->name << " occurred multiple 
times.";
 
     if (element_dtype.MatchesCode(DLDataTypeCode::kDLBool)) {
       element_dtype = PrimType::Int(8, element_dtype.lanes());
@@ -1350,7 +1350,7 @@ class VectorTypeAccessChecker : public StmtExprVisitor {
   void OnArrayAccess(PrimType value_dtype, const VarNode* buffer,
                      const ffi::Array<PrimExpr>& indices, bool is_buffer_load) 
{
     auto it = info_map_.find(buffer);
-    TVM_FFI_ICHECK(it != info_map_.end()) << "Load/Store of buffer " << 
buffer->name_hint << " ("
+    TVM_FFI_ICHECK(it != info_map_.end()) << "Load/Store of buffer " << 
buffer->name << " ("
                                           << buffer << ") occurred before its 
declaration.";
 
     if (value_dtype.IsScalableVector()) {
@@ -1367,8 +1367,7 @@ class VectorTypeAccessChecker : public StmtExprVisitor {
 
     if (var_info.element_dtype.IsVoid()) {
       TVM_FFI_ICHECK(allow_untyped_pointers_)
-          << "Variable " << buffer->name_hint
-          << " was missing a type annotation in its declaration";
+          << "Variable " << buffer->name << " was missing a type annotation in 
its declaration";
       var_info.element_dtype = value_dtype.WithLanes(1);
     }
 
@@ -1516,7 +1515,7 @@ class VectorTypeRewriter : public StmtExprMutator {
       PrimType preferred = var_info.get_preferred_dtype();
       if (preferred != var_info.element_dtype && (rewrite_mask & 
var_info.declaration_location)) {
         Var old_buffer_var = var_info.var;
-        Var new_buffer_var(old_buffer_var->name_hint,
+        Var new_buffer_var(old_buffer_var->name,
                            PointerType(preferred, 
GetPtrStorageScope(old_buffer_var)),
                            old_buffer_var->span);
 
diff --git a/src/tirx/transform/tile_primitive_dispatch.cc 
b/src/tirx/transform/tile_primitive_dispatch.cc
index 06c522c254..de80b9cfd3 100644
--- a/src/tirx/transform/tile_primitive_dispatch.cc
+++ b/src/tirx/transform/tile_primitive_dispatch.cc
@@ -643,7 +643,7 @@ class TilePrimitiveDispatcher : public StmtExprMutator {
     ScopeIdDefVerifier verifier;
     TVM_FFI_ICHECK(verifier.Verify(defs)) << "Inconsistent ScopeIdDef";
 
-    auto is_implicit = [](const Var& v) { return v->name_hint.empty(); };
+    auto is_implicit = [](const Var& v) { return v->name.empty(); };
     for (const auto& g : gathered) {
       ScopeIdDef def = g.def;
       // Deferred extents: resolved via closure into verifier.id_set.
diff --git a/src/tirx/transform/tvm_ffi_binder.cc 
b/src/tirx/transform/tvm_ffi_binder.cc
index 26fe4a193d..8c487c842f 100644
--- a/src/tirx/transform/tvm_ffi_binder.cc
+++ b/src/tirx/transform/tvm_ffi_binder.cc
@@ -67,7 +67,7 @@ TVMFFIABIBuilder::TVMFFIABIBuilder(const ffi::String& 
func_name, const ffi::Arra
         if (j > 0) os << ", ";
         std::ostringstream shape_os;
         if (auto var = buf->shape[j].as<PrimVar>()) {
-          shape_os << ((*var)->name_hint.empty() ? "v" : 
(*var)->name_hint.c_str());
+          shape_os << ((*var)->name.empty() ? "v" : (*var)->name.c_str());
         } else {
           shape_os << buf->shape[j];
         }
@@ -76,13 +76,13 @@ TVMFFIABIBuilder::TVMFFIABIBuilder(const ffi::String& 
func_name, const ffi::Arra
       os << "], " << buf->dtype->dtype << ")";
       param_names_[static_cast<int>(i)] = buf_name;
     } else {
-      os << param->name_hint << ": ";
+      os << param->name << ": ";
       if (const auto* prim_type = param->ty.as<PrimTypeNode>()) {
         os << prim_type->dtype;
       } else {
         os << param->ty;
       }
-      param_names_[static_cast<int>(i)] = param->name_hint;
+      param_names_[static_cast<int>(i)] = param->name;
     }
   }
   os << ")";
@@ -275,7 +275,7 @@ bool TVMFFIABIBuilder::BindPointer(const Var& arg, const 
Expr& value,
  * names.
  *
  * Uses ExprFunctor for generic dispatch over all expression types.
- * The default TIR printer sanitizes Var name_hints (e.g. "B.shape[0]" -> 
"B_shape_0_")
+ * The default TIR printer sanitizes Var names (e.g. "B.shape[0]" -> 
"B_shape_0_")
  * and adds type annotations (e.g. T.int64(1)). This functor preserves 
original path
  * names and uses plain integer formatting for human-readable error messages.
  */
@@ -332,7 +332,7 @@ void TVMFFIABIBuilder::RenderPendingAsserts() {
       ffi::String path = RenderAccessPath(it->second.first_def_path);
       if (!path.empty()) return std::string(path);
     }
-    return std::string(v->name_hint);
+    return std::string(v->name);
   });
 
   for (auto& pending : pending_const_asserts_) {
@@ -549,7 +549,7 @@ void TVMFFIABIBuilder::DecodeParam(int param_index) {
   Var param = params_[param_index];
 
   // Extract type_index from packed_args
-  Var type_index(param->name_hint + ".type_index", PrimType::Int(32));
+  Var type_index(param->name + ".type_index", PrimType::Int(32));
   init_nest_.push_back(Bind(type_index, Call(PrimType::Int(32), 
builtin::tvm_struct_get(),
                                              {v_packed_args_, 
IntImm::Int32(param_index),
                                               
IntImm::Int32(builtin::kTVMFFIAnyTypeIndex)})
@@ -603,8 +603,8 @@ void TVMFFIABIBuilder::DecodeAllParams() {
       ffi::reflection::AccessPath param_path = 
ffi::reflection::AccessPath::Root()
                                                    
->Extend(AccessStep::ArrayItem(i))
                                                    
->Attr(ffi::String(buffer->name));
-      DecodeParamDLTensor(buffer, device_type_, device_id_, param,
-                          func_name_ + "." + param->name_hint, param_path);
+      DecodeParamDLTensor(buffer, device_type_, device_id_, param, func_name_ 
+ "." + param->name,
+                          param_path);
       decl_buffers_.push_back(DeclBuffer(buffer));
     }
   }
diff --git a/src/tirx/transform/unsupported_dtype_legalize.cc 
b/src/tirx/transform/unsupported_dtype_legalize.cc
index 2d2e8ed74a..8da543e8f9 100644
--- a/src/tirx/transform/unsupported_dtype_legalize.cc
+++ b/src/tirx/transform/unsupported_dtype_legalize.cc
@@ -119,7 +119,7 @@ class ComputeLegalizePlanner : public StmtExprVisitor {
       if (auto* ptr_type = op->buffer->data->ty.as<PointerTypeNode>()) {
         storage_scope = ptr_type->storage_scope;
       }
-      Var buffer_var = Var(op->buffer->data->name_hint, PointerType(dtype, 
storage_scope));
+      Var buffer_var = Var(op->buffer->data->name, PointerType(dtype, 
storage_scope));
       (*var_remap_)[op->buffer->data] = buffer_var;
     }
     return StmtExprVisitor::VisitStmt_(op);
@@ -583,7 +583,7 @@ class StorageLegalizer : public StmtExprMutator {
       if (auto* ptr_type = buf->data->ty.as<PointerTypeNode>()) {
         storage_scope = ptr_type->storage_scope;
       }
-      Var new_data = Var(buf->data->name_hint, PointerType(new_dtype, 
storage_scope));
+      Var new_data = Var(buf->data->name, PointerType(new_dtype, 
storage_scope));
       var_remap_[buf->data] = new_data;
       buf = Buffer(new_data, new_dtype, buf->shape, buf->strides, 
buf->elem_offset, buf->name,
                    buf->data_alignment, buf->offset_factor, buf->buffer_type, 
buf->axis_separators,
@@ -747,8 +747,8 @@ class StorageLegalizer : public StmtExprMutator {
       if (auto* elem_type = ptr_type->element_type.as<PrimTypeNode>()) {
         PrimType elem_prim_type = ffi::GetRef<PrimType>(elem_type);
         if (MatchType(elem_prim_type)) {
-          Var new_var = Var(var->name_hint, 
PointerType(GetStorageUIntDType(elem_prim_type),
-                                                        
ptr_type->storage_scope));
+          Var new_var = Var(
+              var->name, PointerType(GetStorageUIntDType(elem_prim_type), 
ptr_type->storage_scope));
           var_remap_[var] = new_var;
           return new_var;
         }
diff --git a/src/tirx/transform/update_pointer_storage_scope.cc 
b/src/tirx/transform/update_pointer_storage_scope.cc
index e19df95561..0c796ff364 100644
--- a/src/tirx/transform/update_pointer_storage_scope.cc
+++ b/src/tirx/transform/update_pointer_storage_scope.cc
@@ -41,7 +41,7 @@ namespace tirx {
 Var WithStorageScope(const VarNode* buffer_var, ffi::String storage_scope) {
   auto* ptr_type = buffer_var->ty.as<PointerTypeNode>();
   TVM_FFI_ICHECK(ptr_type) << "The provided variable is not of pointer type";
-  return Var(buffer_var->name_hint, PointerType(ptr_type->element_type, 
storage_scope),
+  return Var(buffer_var->name, PointerType(ptr_type->element_type, 
storage_scope),
              buffer_var->span);
 }
 
diff --git a/src/tirx/transform/vectorize_loop.cc 
b/src/tirx/transform/vectorize_loop.cc
index 996bac3464..9872a8c462 100644
--- a/src/tirx/transform/vectorize_loop.cc
+++ b/src/tirx/transform/vectorize_loop.cc
@@ -748,7 +748,7 @@ class Vectorizer : public StmtMutator, public 
ExprFunctor<Expr(const Expr&)> {
           << "Let cannot bind the same var to two different values";
     }
     if (GetLanesOrVScaleFactor(value.ty()) != 
GetLanesOrVScaleFactor(op->value.ty())) {
-      Var new_var(op->var->name_hint, value.ty());
+      Var new_var(op->var->name, value.ty());
       let_binding_[op->var] = new_var.as_or_throw<PrimExpr>();
       return Let(new_var, value, this->VisitPrimExpr(op->body));
     } else {
@@ -961,7 +961,7 @@ class Vectorizer : public StmtMutator, public 
ExprFunctor<Expr(const Expr&)> {
     let_binding_[op->var] = value;
 
     if (GetLanesOrVScaleFactor(value.ty()) != 
GetLanesOrVScaleFactor(prim_value.value().ty())) {
-      Var new_var(op->var->name_hint, value.ty());
+      Var new_var(op->var->name, value.ty());
       let_binding_[op->var] = new_var.as_or_throw<PrimExpr>();
       return Bind(new_var, value);
     } else {
@@ -979,7 +979,7 @@ class Vectorizer : public StmtMutator, public 
ExprFunctor<Expr(const Expr&)> {
   // scalarize the statment
   Stmt Scalarize(Stmt stmt) {
     PrimType var_ty = var_->ty.as_or_throw<PrimType>();
-    Var idx(var_->name_hint + ".s", var_ty);
+    Var idx(var_->name + ".s", var_ty);
     stmt = Substitute(stmt, ffi::Map<Var, Expr>{{var_, idx}});
     return For(idx.as_or_throw<PrimVar>(), IntImm(var_ty, 0), var_lanes_, 
ForKind::kSerial, stmt);
   }
@@ -1157,8 +1157,8 @@ class LoopVectorizer : public StmtMutator {
     }
     PrimExpr num_chunks = ceildiv(fixed_extent, scalable_lanes_index);
 
-    PrimVar outer(op->loop_var->name_hint + ".vla.o", index_dtype);
-    PrimVar inner(op->loop_var->name_hint + ".vla.i", lane_dtype);
+    PrimVar outer(op->loop_var->name + ".vla.o", index_dtype);
+    PrimVar inner(op->loop_var->name + ".vla.i", lane_dtype);
     PrimExpr inner_index = inner;
     if (inner_index.ty() != index_dtype) {
       inner_index = Cast(index_dtype, inner_index);
diff --git a/tests/cpp/expr_test.cc b/tests/cpp/expr_test.cc
index 6ad0f81191..1b4dca87e7 100644
--- a/tests/cpp/expr_test.cc
+++ b/tests/cpp/expr_test.cc
@@ -59,14 +59,14 @@ TEST(Expr, VarCopyHelpers) {
 
   Var renamed = var.CopyWithName("y");
   EXPECT_FALSE(renamed.same_as(var));
-  EXPECT_EQ(renamed->name_hint, "y");
+  EXPECT_EQ(renamed->name, "y");
   EXPECT_TRUE(renamed->ty.same_as(pointer_type));
   EXPECT_TRUE(renamed->span.same_as(span));
 
   PrimType dtype = PrimType::Int(64);
   Var retyped = var.CopyWithDType(dtype);
   EXPECT_FALSE(retyped.same_as(var));
-  EXPECT_EQ(retyped->name_hint, "x");
+  EXPECT_EQ(retyped->name, "x");
   EXPECT_TRUE(retyped->ty.same_as(dtype));
   EXPECT_TRUE(retyped->span.same_as(span));
 
@@ -75,7 +75,7 @@ TEST(Expr, VarCopyHelpers) {
   PrimType prim_dtype = PrimType::Float(32);
   PrimVar retyped_prim_var = prim_var.CopyWithDType(prim_dtype);
   EXPECT_FALSE(retyped_prim_var.same_as(prim_var));
-  EXPECT_EQ(retyped_prim_var->name_hint, "i");
+  EXPECT_EQ(retyped_prim_var->name, "i");
   EXPECT_TRUE(retyped_prim_var.ty().same_as(prim_dtype));
   EXPECT_TRUE(retyped_prim_var->span.same_as(span));
 }
diff --git a/tests/python/ir/test_node_reflection.py 
b/tests/python/ir/test_node_reflection.py
index d5c260c783..29e222c6db 100644
--- a/tests/python/ir/test_node_reflection.py
+++ b/tests/python/ir/test_node_reflection.py
@@ -80,23 +80,37 @@ _LEGACY_TIRX_VAR_JSON = """{
 }"""
 
 
+def _make_pre_name_field_json(type_key):
+    graph = json.loads(_LEGACY_TIRX_VAR_JSON)
+    graph["root_index"] = 5
+    var = graph["nodes"][5]
+    var["type"] = type_key
+    var["data"]["name_hint"] = var["data"].pop("name")
+    return json.dumps(graph)
+
+
+_PRE_NAME_FIELD_IR_VAR_JSON = _make_pre_name_field_json("ir.Var")
+_PRE_NAME_FIELD_DATAFLOW_VAR_JSON = 
_make_pre_name_field_json("relax.expr.DataflowVar")
+
+
 @pytest.mark.parametrize(
-    ("legacy_json", "legacy_type", "var_index"),
+    ("legacy_json", "expected_type", "var_index"),
     [
-        (_LEGACY_RELAX_VAR_JSON, "relax.expr.Var", 7),
-        (_LEGACY_TIRX_VAR_JSON, "tirx.Var", 5),
+        (_LEGACY_RELAX_VAR_JSON, "ir.Var", 7),
+        (_LEGACY_TIRX_VAR_JSON, "ir.Var", 5),
+        (_PRE_NAME_FIELD_IR_VAR_JSON, "ir.Var", 5),
+        (_PRE_NAME_FIELD_DATAFLOW_VAR_JSON, "relax.expr.DataflowVar", 5),
     ],
 )
-def test_var_exact_base_legacy_json_graph_rewrite(legacy_json, legacy_type, 
var_index):
+def test_var_name_legacy_json_graph_rewrite(legacy_json, expected_type, 
var_index):
     from tvm.ir.json_compact import upgrade_json
 
     original = json.loads(legacy_json)
     expected = copy.deepcopy(original)
-    expected["nodes"][var_index]["type"] = "ir.Var"
-    if legacy_type == "tirx.Var":
-        expected["nodes"][var_index]["data"]["name_hint"] = 
expected["nodes"][var_index][
-            "data"
-        ].pop("name")
+    expected["nodes"][var_index]["type"] = expected_type
+    fields = expected["nodes"][var_index]["data"]
+    if "name_hint" in fields:
+        fields["name"] = fields.pop("name_hint")
 
     upgraded = json.loads(upgrade_json(legacy_json))
     assert upgraded == expected
@@ -104,8 +118,10 @@ def 
test_var_exact_base_legacy_json_graph_rewrite(legacy_json, legacy_type, var_
     assert len(upgraded["nodes"]) == len(original["nodes"])
 
 
-def _check_legacy_var(var, source_name, line, end_line, column, end_column):
-    assert type(var) is tvm.ir.Var
+def _check_legacy_var(
+    var, source_name, line, end_line, column, end_column, 
expected_type=tvm.ir.Var
+):
+    assert type(var) is expected_type
     assert var.name == "legacy"
     assert var.ty == tvm.ir.PrimType("int64")
     assert var.span.source_name.name == source_name
@@ -137,6 +153,22 @@ def test_var_exact_base_legacy_tirx_json_load():
     )
 
 
[email protected](
+    ("legacy_json", "expected_type"),
+    [
+        (_PRE_NAME_FIELD_IR_VAR_JSON, tvm.ir.Var),
+        (_PRE_NAME_FIELD_DATAFLOW_VAR_JSON, tvm.relax.DataflowVar),
+    ],
+)
+def test_var_name_legacy_json_load(legacy_json, expected_type):
+    restored = tvm.ir.load_json(legacy_json)
+    _check_legacy_var(restored, "legacy_tirx.py", 7, 9, 2, 14, expected_type)
+    graph = json.loads(tvm.ir.save_json(restored))
+    fields = graph["nodes"][graph["root_index"]]["data"]
+    assert "name" in fields
+    assert "name_hint" not in fields
+
+
 def test_dataflow_var_json_is_not_migrated_to_canonical_var():
     dataflow_var = tvm.relax.DataflowVar("value", tvm.ir.PrimType("int64"))
     graph = json.loads(tvm.ir.save_json(dataflow_var))
diff --git a/tests/python/relax/test_expr.py b/tests/python/relax/test_expr.py
index 52b4e9ba16..5a43477702 100644
--- a/tests/python/relax/test_expr.py
+++ b/tests/python/relax/test_expr.py
@@ -60,8 +60,12 @@ def test_var() -> None:
 
 
 def test_var_name_keyword_compatibility() -> None:
-    assert tvm.ir.Var(name="primary").name == "primary"
-    assert tvm.ir.Var(name_hint="legacy").name == "legacy"
+    primary = tvm.ir.Var(name="primary")
+    legacy = tvm.ir.Var(name_hint="legacy")
+    assert primary.name == "primary"
+    assert legacy.name == "legacy"
+    assert not hasattr(primary, "name_hint")
+    assert not hasattr(legacy, "name_hint")
     with pytest.raises(TypeError, match="Specify either name or name_hint, not 
both"):
         tvm.ir.Var(name="primary", name_hint="legacy")
 
@@ -102,8 +106,12 @@ def test_dataflow_var() -> None:
 
 
 def test_dataflow_var_name_keyword_compatibility() -> None:
-    assert rx.DataflowVar(name="primary").name == "primary"
-    assert rx.DataflowVar(name_hint="legacy").name == "legacy"
+    primary = rx.DataflowVar(name="primary")
+    legacy = rx.DataflowVar(name_hint="legacy")
+    assert primary.name == "primary"
+    assert legacy.name == "legacy"
+    assert not hasattr(primary, "name_hint")
+    assert not hasattr(legacy, "name_hint")
     with pytest.raises(TypeError, match="Specify either name or name_hint, not 
both"):
         rx.DataflowVar(name="primary", name_hint="legacy")
 


Reply via email to