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

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


The following commit(s) were added to refs/heads/main by this push:
     new 51bf3d6fe9 [FFI] Cleanup visit_attrs attribute after refactor (#18112)
51bf3d6fe9 is described below

commit 51bf3d6fe99d3f5b59ea0ffee3825c998f9cb46a
Author: Tianqi Chen <[email protected]>
AuthorDate: Fri Jul 4 10:19:26 2025 -0400

    [FFI] Cleanup visit_attrs attribute after refactor (#18112)
    
    This PR is a cleanup pr after we removed VisitAttrs, the attribute is no 
longer
    necessary
---
 include/tvm/arith/analyzer.h                       |  4 ---
 include/tvm/arith/iter_affine_map.h                |  9 ------
 include/tvm/ir/attrs.h                             |  2 +-
 include/tvm/ir/diagnostic.h                        |  6 ----
 include/tvm/ir/env_func.h                          |  2 --
 include/tvm/ir/global_info.h                       |  4 ---
 include/tvm/ir/global_var_supply.h                 |  2 --
 include/tvm/ir/instrument.h                        |  2 --
 include/tvm/ir/module.h                            |  2 --
 include/tvm/ir/name_supply.h                       |  2 --
 include/tvm/ir/op.h                                |  2 --
 include/tvm/ir/source_map.h                        | 10 ------
 include/tvm/ir/transform.h                         |  8 -----
 include/tvm/ir/type.h                              | 10 ------
 include/tvm/meta_schedule/arg_info.h               |  2 --
 include/tvm/meta_schedule/builder.h                |  6 ----
 include/tvm/meta_schedule/cost_model.h             |  3 --
 include/tvm/meta_schedule/task_scheduler.h         |  6 ----
 include/tvm/node/script_printer.h                  |  2 --
 include/tvm/relax/binding_rewrite.h                |  2 --
 include/tvm/relax/dataflow_pattern.h               | 31 ------------------
 include/tvm/relax/distributed/global_info.h        |  2 --
 include/tvm/relax/distributed/struct_info.h        |  8 -----
 include/tvm/relax/exec_builder.h                   |  2 --
 include/tvm/relax/expr.h                           | 37 ----------------------
 include/tvm/relax/struct_info.h                    | 12 -------
 include/tvm/relax/tir_pattern.h                    |  2 --
 include/tvm/relax/transform.h                      |  4 ---
 include/tvm/relax/type.h                           |  8 -----
 include/tvm/script/ir_builder/base.h               |  4 ---
 include/tvm/script/ir_builder/ir/frame.h           |  2 --
 include/tvm/script/ir_builder/relax/frame.h        | 14 --------
 include/tvm/script/ir_builder/tir/frame.h          | 34 --------------------
 include/tvm/tir/block_dependence_info.h            |  2 --
 include/tvm/tir/block_scope.h                      |  6 ----
 include/tvm/tir/buffer.h                           |  2 --
 include/tvm/tir/data_layout.h                      |  4 ---
 include/tvm/tir/function.h                         |  4 ---
 include/tvm/tir/index_map.h                        |  2 --
 include/tvm/tir/schedule/instruction.h             |  4 ---
 include/tvm/tir/schedule/schedule.h                |  4 ---
 include/tvm/tir/schedule/state.h                   |  2 --
 include/tvm/tir/schedule/trace.h                   |  2 --
 include/tvm/tir/stmt.h                             | 34 --------------------
 src/arith/interval_set.h                           |  2 --
 src/arith/presburger_set.h                         |  4 ---
 src/arith/rewrite_simplify.h                       |  2 --
 src/contrib/msc/core/ir/graph.h                    | 16 ----------
 src/contrib/msc/core/ir/plugin.h                   |  8 -----
 src/contrib/msc/core/printer/msc_doc.h             | 14 --------
 src/ir/transform.cc                                |  2 --
 src/meta_schedule/database/json_database.cc        |  1 -
 src/meta_schedule/database/memory_database.cc      |  2 +-
 .../database/ordered_union_database.cc             |  2 +-
 src/meta_schedule/database/schedule_fn_database.cc |  2 +-
 src/meta_schedule/database/union_database.cc       |  2 +-
 .../feature_extractor/per_store_feature.cc         |  1 -
 .../mutator/mutate_compute_location.cc             |  2 --
 src/meta_schedule/mutator/mutate_parallel.cc       |  2 +-
 src/meta_schedule/mutator/mutate_thread_binding.cc |  2 --
 src/meta_schedule/mutator/mutate_tile_size.cc      |  2 --
 src/meta_schedule/mutator/mutate_unroll.cc         |  2 --
 .../postproc/rewrite_cooperative_fetch.cc          |  1 -
 .../postproc/rewrite_reduction_block.cc            |  1 -
 src/meta_schedule/postproc/rewrite_tensorize.cc    |  1 -
 .../postproc/rewrite_unbound_block.cc              |  1 -
 src/meta_schedule/schedule_rule/add_rfactor.cc     |  1 -
 .../schedule_rule/apply_custom_rule.cc             |  2 +-
 src/meta_schedule/schedule_rule/auto_bind.cc       |  2 +-
 src/meta_schedule/schedule_rule/auto_inline.cc     |  3 +-
 .../schedule_rule/cross_thread_reduction.cc        |  2 +-
 .../schedule_rule/multi_level_tiling.h             |  2 --
 .../schedule_rule/parallel_vectorize_unroll.cc     |  1 -
 .../schedule_rule/random_compute_location.cc       |  2 +-
 .../search_strategy/evolutionary_search.cc         |  2 --
 src/meta_schedule/task_scheduler/gradient_based.cc |  2 --
 src/meta_schedule/task_scheduler/round_robin.cc    |  2 --
 src/relax/backend/contrib/cutlass/codegen.cc       |  2 --
 src/relax/ir/dataflow_block_rewriter.cc            |  2 --
 src/relax/ir/dataflow_rewriter.h                   |  8 -----
 src/relax/ir/emit_te.h                             |  2 --
 src/relax/ir/py_expr_functor.cc                    |  4 ---
 src/relax/ir/transform.cc                          |  4 ---
 src/relax/transform/dataflow_inplace.cc            |  2 --
 src/relax/transform/infer_layout_utils.h           |  4 ---
 src/script/printer/ir/utils.h                      |  2 --
 src/script/printer/relax/utils.h                   |  2 --
 src/script/printer/tir/utils.h                     |  2 --
 src/tir/ir/py_functor.cc                           |  4 ---
 src/tir/ir/transform.cc                            |  2 --
 src/tir/schedule/analysis.h                        |  4 ---
 src/tir/schedule/concrete_schedule.h               |  2 --
 src/tir/schedule/traced_schedule.h                 |  2 --
 93 files changed, 11 insertions(+), 442 deletions(-)

diff --git a/include/tvm/arith/analyzer.h b/include/tvm/arith/analyzer.h
index 84e5fd94f8..2be573942e 100644
--- a/include/tvm/arith/analyzer.h
+++ b/include/tvm/arith/analyzer.h
@@ -94,8 +94,6 @@ class ConstIntBoundNode : public Object {
         .def_ro("max_value", &ConstIntBoundNode::max_value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ConstIntBoundNode* other, SEqualReducer equal) const 
{
     return equal(min_value, other->min_value) && equal(max_value, 
other->max_value);
   }
@@ -220,8 +218,6 @@ class ModularSetNode : public Object {
         .def_ro("base", &ModularSetNode::base);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ModularSetNode* other, SEqualReducer equal) const {
     return equal(coeff, other->coeff) && equal(base, other->base);
   }
diff --git a/include/tvm/arith/iter_affine_map.h 
b/include/tvm/arith/iter_affine_map.h
index 3e62262785..5ac1bed4a7 100644
--- a/include/tvm/arith/iter_affine_map.h
+++ b/include/tvm/arith/iter_affine_map.h
@@ -66,7 +66,6 @@ namespace arith {
  */
 class IterMapExprNode : public PrimExprNode {
  public:
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "arith.IterMapExpr";
   static constexpr const uint32_t _type_child_slots = 2;
   TVM_DECLARE_BASE_OBJECT_INFO(IterMapExprNode, PrimExprNode);
@@ -106,8 +105,6 @@ class IterMarkNode : public Object {
         .def_ro("extent", &IterMarkNode::extent);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IterMarkNode* other, SEqualReducer equal) const {
     equal->MarkGraphNode();
     return equal(source, other->source) && equal(extent, other->extent);
@@ -167,8 +164,6 @@ class IterSplitExprNode : public IterMapExprNode {
         .def_ro("scale", &IterSplitExprNode::scale);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IterSplitExprNode* other, SEqualReducer equal) const 
{
     return equal(source, other->source) && equal(lower_factor, 
other->lower_factor) &&
            equal(extent, other->extent) && equal(scale, other->scale);
@@ -235,8 +230,6 @@ class IterSumExprNode : public IterMapExprNode {
         .def_ro("base", &IterSumExprNode::base);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IterSumExprNode* other, SEqualReducer equal) const {
     return equal(args, other->args) && equal(base, other->base);
   }
@@ -307,8 +300,6 @@ class IterMapResultNode : public Object {
         .def_ro("padding_predicate", &IterMapResultNode::padding_predicate);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "arith.IterMapResult";
   TVM_DECLARE_FINAL_OBJECT_INFO(IterMapResultNode, Object);
 };
diff --git a/include/tvm/ir/attrs.h b/include/tvm/ir/attrs.h
index 8715643d70..bd27f50dbd 100644
--- a/include/tvm/ir/attrs.h
+++ b/include/tvm/ir/attrs.h
@@ -82,7 +82,7 @@ class AttrFieldInfoNode : public Object {
   }
 
   static constexpr const char* _type_key = "ir.AttrFieldInfo";
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr bool _type_has_method_sequal_reduce = false;
   static constexpr bool _type_has_method_shash_reduce = false;
   TVM_DECLARE_FINAL_OBJECT_INFO(AttrFieldInfoNode, Object);
diff --git a/include/tvm/ir/diagnostic.h b/include/tvm/ir/diagnostic.h
index 29fd49384c..06d3efc5bd 100644
--- a/include/tvm/ir/diagnostic.h
+++ b/include/tvm/ir/diagnostic.h
@@ -74,8 +74,6 @@ class DiagnosticNode : public Object {
         .def_ro("message", &DiagnosticNode::message);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DiagnosticNode* other, SEqualReducer equal) const {
     return equal(this->level, other->level) && equal(this->span, other->span) 
&&
            equal(this->message, other->message);
@@ -174,8 +172,6 @@ class DiagnosticRendererNode : public Object {
     refl::ObjectDef<DiagnosticRendererNode>().def_ro("renderer", 
&DiagnosticRendererNode::renderer);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "DiagnosticRenderer";
   TVM_DECLARE_FINAL_OBJECT_INFO(DiagnosticRendererNode, Object);
 };
@@ -214,8 +210,6 @@ class DiagnosticContextNode : public Object {
         .def_ro("diagnostics", &DiagnosticContextNode::diagnostics);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DiagnosticContextNode* other, SEqualReducer equal) 
const {
     return equal(module, other->module) && equal(diagnostics, 
other->diagnostics);
   }
diff --git a/include/tvm/ir/env_func.h b/include/tvm/ir/env_func.h
index aac4595e06..095bb6d439 100644
--- a/include/tvm/ir/env_func.h
+++ b/include/tvm/ir/env_func.h
@@ -54,8 +54,6 @@ class EnvFuncNode : public Object {
     refl::ObjectDef<EnvFuncNode>().def_ro("name", &EnvFuncNode::name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const EnvFuncNode* other, SEqualReducer equal) const {
     // name uniquely identifies the env function.
     return name == other->name;
diff --git a/include/tvm/ir/global_info.h b/include/tvm/ir/global_info.h
index 4583b858c7..8c199b3e9b 100644
--- a/include/tvm/ir/global_info.h
+++ b/include/tvm/ir/global_info.h
@@ -78,8 +78,6 @@ class VDeviceNode : public GlobalInfoNode {
         .def_ro("memory_scope", &VDeviceNode::memory_scope);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   TVM_DLL bool SEqualReduce(const VDeviceNode* other, SEqualReducer equal) 
const {
     return equal(target, other->target) && equal(vdevice_id, 
other->vdevice_id) &&
            equal(memory_scope, other->memory_scope);
@@ -114,8 +112,6 @@ class DummyGlobalInfoNode : public GlobalInfoNode {
     refl::ObjectDef<DummyGlobalInfoNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "ir.DummyGlobalInfo";
 
   TVM_DLL bool SEqualReduce(const DummyGlobalInfoNode* other, SEqualReducer 
equal) const {
diff --git a/include/tvm/ir/global_var_supply.h 
b/include/tvm/ir/global_var_supply.h
index 29be4482c8..35b429a725 100644
--- a/include/tvm/ir/global_var_supply.h
+++ b/include/tvm/ir/global_var_supply.h
@@ -81,8 +81,6 @@ class GlobalVarSupplyNode : public Object {
     refl::ObjectDef<GlobalVarSupplyNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*! \brief The NameSupply used to generate unique name hints to GlobalVars. 
*/
   NameSupply name_supply_;
 
diff --git a/include/tvm/ir/instrument.h b/include/tvm/ir/instrument.h
index c571c09777..64bc78ff4a 100644
--- a/include/tvm/ir/instrument.h
+++ b/include/tvm/ir/instrument.h
@@ -142,8 +142,6 @@ class PassInstrumentNode : public Object {
     refl::ObjectDef<PassInstrumentNode>().def_ro("name", 
&PassInstrumentNode::name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "instrument.PassInstrument";
   TVM_DECLARE_BASE_OBJECT_INFO(PassInstrumentNode, Object);
 };
diff --git a/include/tvm/ir/module.h b/include/tvm/ir/module.h
index fa4086327e..0d33b9308d 100644
--- a/include/tvm/ir/module.h
+++ b/include/tvm/ir/module.h
@@ -140,8 +140,6 @@ class IRModuleNode : public Object {
         .def_ro("global_infos", &IRModuleNode::global_infos);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   TVM_DLL bool SEqualReduce(const IRModuleNode* other, SEqualReducer equal) 
const;
 
   TVM_DLL void SHashReduce(SHashReducer hash_reduce) const;
diff --git a/include/tvm/ir/name_supply.h b/include/tvm/ir/name_supply.h
index ad95c3171e..853bd8eb53 100644
--- a/include/tvm/ir/name_supply.h
+++ b/include/tvm/ir/name_supply.h
@@ -81,8 +81,6 @@ class NameSupplyNode : public Object {
    */
   bool ContainsName(const String& name, bool add_prefix = true);
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   // Prefix for all GlobalVar names. It can be empty.
   std::string prefix_;
 
diff --git a/include/tvm/ir/op.h b/include/tvm/ir/op.h
index eaf639a5a4..6d488cb9df 100644
--- a/include/tvm/ir/op.h
+++ b/include/tvm/ir/op.h
@@ -103,8 +103,6 @@ class OpNode : public RelaxExprNode {
         .def_ro("support_level", &OpNode::support_level);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const OpNode* other, SEqualReducer equal) const {
     // pointer equality is fine as there is only one op with the same name.
     return this == other;
diff --git a/include/tvm/ir/source_map.h b/include/tvm/ir/source_map.h
index f888b67623..86a8a4decd 100644
--- a/include/tvm/ir/source_map.h
+++ b/include/tvm/ir/source_map.h
@@ -53,8 +53,6 @@ class SourceNameNode : public Object {
     refl::ObjectDef<SourceNameNode>().def_ro("name", &SourceNameNode::name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr bool _type_has_method_sequal_reduce = true;
 
   bool SEqualReduce(const SourceNameNode* other, SEqualReducer equal) const {
@@ -112,8 +110,6 @@ class SpanNode : public Object {
         .def_ro("end_column", &SpanNode::end_column);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr bool _type_has_method_sequal_reduce = true;
 
   bool SEqualReduce(const SpanNode* other, SEqualReducer equal) const {
@@ -149,8 +145,6 @@ class SequentialSpanNode : public SpanNode {
     refl::ObjectDef<SequentialSpanNode>().def_ro("spans", 
&SequentialSpanNode::spans);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "ir.SequentialSpan";
   TVM_DECLARE_FINAL_OBJECT_INFO(SequentialSpanNode, SpanNode);
 
@@ -206,8 +200,6 @@ class SourceNode : public Object {
         .def_ro("source", &SourceNode::source);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "ir.Source";
   TVM_DECLARE_FINAL_OBJECT_INFO(SourceNode, Object);
 };
@@ -237,8 +229,6 @@ class SourceMapObj : public Object {
     refl::ObjectDef<SourceMapObj>().def_ro("source_map", 
&SourceMapObj::source_map);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const SourceMapObj* other, SEqualReducer equal) const {
     return equal(source_map, other->source_map);
   }
diff --git a/include/tvm/ir/transform.h b/include/tvm/ir/transform.h
index 353f0a69cb..d5a3321407 100644
--- a/include/tvm/ir/transform.h
+++ b/include/tvm/ir/transform.h
@@ -134,8 +134,6 @@ class PassContextNode : public Object {
         .def_ro("diag_ctx", &PassContextNode::diag_ctx);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "transform.PassContext";
   static constexpr bool _type_has_method_sequal_reduce = false;
   TVM_DECLARE_FINAL_OBJECT_INFO(PassContextNode, Object);
@@ -325,8 +323,6 @@ class PassInfoNode : public Object {
         .def_ro("traceable", &PassInfoNode::traceable);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "transform.PassInfo";
   static constexpr bool _type_has_method_sequal_reduce = false;
   TVM_DECLARE_FINAL_OBJECT_INFO(PassInfoNode, Object);
@@ -383,8 +379,6 @@ class PassNode : public Object {
    */
   virtual IRModule operator()(IRModule mod, const PassContext& pass_ctx) const 
= 0;
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "transform.Pass";
   TVM_DECLARE_BASE_OBJECT_INFO(PassNode, Object);
 };
@@ -448,8 +442,6 @@ class SequentialNode : public PassNode {
         .def_ro("passes", &SequentialNode::passes);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Get the pass information/meta data.
    */
diff --git a/include/tvm/ir/type.h b/include/tvm/ir/type.h
index a07cdd5b9e..87a1174c93 100644
--- a/include/tvm/ir/type.h
+++ b/include/tvm/ir/type.h
@@ -116,8 +116,6 @@ class PrimTypeNode : public TypeNode {
     refl::ObjectDef<PrimTypeNode>().def_ro("dtype", &PrimTypeNode::dtype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PrimTypeNode* other, SEqualReducer equal) const {
     return equal(dtype, other->dtype);
   }
@@ -172,8 +170,6 @@ class PointerTypeNode : public TypeNode {
         .def_ro("storage_scope", &PointerTypeNode::storage_scope);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PointerTypeNode* other, SEqualReducer equal) const {
     // Make "global" equal to ""
     String lhs_scope = storage_scope.empty() ? "global" : storage_scope;
@@ -225,8 +221,6 @@ class TupleTypeNode : public TypeNode {
         .def_ro("span", &TupleTypeNode::span);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TupleTypeNode* other, SEqualReducer equal) const {
     return equal(fields, other->fields);
   }
@@ -296,8 +290,6 @@ class FuncTypeNode : public TypeNode {
         .def_ro("span", &FuncTypeNode::span);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const FuncTypeNode* other, SEqualReducer equal) const {
     // type params first as they defines type vars.
     return equal(arg_types, other->arg_types) && equal(ret_type, 
other->ret_type);
@@ -341,8 +333,6 @@ class TensorMapTypeNode : public TypeNode {
     refl::ObjectDef<TensorMapTypeNode>().def_ro("span", 
&TensorMapTypeNode::span);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TensorMapTypeNode* other, SEqualReducer equal) const 
{
     return equal(span, other->span);
   }
diff --git a/include/tvm/meta_schedule/arg_info.h 
b/include/tvm/meta_schedule/arg_info.h
index aa10bdf5e2..538fdc9d6c 100644
--- a/include/tvm/meta_schedule/arg_info.h
+++ b/include/tvm/meta_schedule/arg_info.h
@@ -91,8 +91,6 @@ class TensorInfoNode : public ArgInfoNode {
         .def_ro("shape", &TensorInfoNode::shape);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.TensorInfo";
   TVM_DECLARE_FINAL_OBJECT_INFO(TensorInfoNode, ArgInfoNode);
 
diff --git a/include/tvm/meta_schedule/builder.h 
b/include/tvm/meta_schedule/builder.h
index a603aed158..712cbbbe6e 100644
--- a/include/tvm/meta_schedule/builder.h
+++ b/include/tvm/meta_schedule/builder.h
@@ -52,8 +52,6 @@ class BuilderInputNode : public runtime::Object {
         .def_ro("params", &BuilderInputNode::params);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.BuilderInput";
   TVM_DECLARE_FINAL_OBJECT_INFO(BuilderInputNode, runtime::Object);
 };
@@ -90,8 +88,6 @@ class BuilderResultNode : public runtime::Object {
         .def_ro("error_msg", &BuilderResultNode::error_msg);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.BuilderResult";
   TVM_DECLARE_FINAL_OBJECT_INFO(BuilderResultNode, runtime::Object);
 };
@@ -159,8 +155,6 @@ class PyBuilderNode : public BuilderNode {
     refl::ObjectDef<PyBuilderNode>().def_ro("f_build", 
&PyBuilderNode::f_build);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   Array<BuilderResult> Build(const Array<BuilderInput>& build_inputs) final {
     ICHECK(f_build != nullptr) << "PyBuilder's Build method not implemented!";
     return f_build(build_inputs);
diff --git a/include/tvm/meta_schedule/cost_model.h 
b/include/tvm/meta_schedule/cost_model.h
index 5e9a622740..32a6d441b4 100644
--- a/include/tvm/meta_schedule/cost_model.h
+++ b/include/tvm/meta_schedule/cost_model.h
@@ -74,7 +74,6 @@ class CostModelNode : public runtime::Object {
   virtual std::vector<double> Predict(const TuneContext& context,
                                       const Array<MeasureCandidate>& 
candidates) = 0;
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "meta_schedule.CostModel";
   TVM_DECLARE_BASE_OBJECT_INFO(CostModelNode, Object);
 };
@@ -133,8 +132,6 @@ class PyCostModelNode : public CostModelNode {
   std::vector<double> Predict(const TuneContext& context,
                               const Array<MeasureCandidate>& candidates);
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.PyCostModel";
   TVM_DECLARE_FINAL_OBJECT_INFO(PyCostModelNode, CostModelNode);
 };
diff --git a/include/tvm/meta_schedule/task_scheduler.h 
b/include/tvm/meta_schedule/task_scheduler.h
index d88a2cc00c..75529e835d 100644
--- a/include/tvm/meta_schedule/task_scheduler.h
+++ b/include/tvm/meta_schedule/task_scheduler.h
@@ -75,8 +75,6 @@ class TaskRecordNode : public runtime::Object {
         .def_ro("runner_futures", &TaskRecordNode::runner_futures);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.TaskRecord";
   TVM_DECLARE_FINAL_OBJECT_INFO(TaskRecordNode, Object);
 };
@@ -157,8 +155,6 @@ class TaskSchedulerNode : public runtime::Object {
         .def_ro("remaining_tasks_", &TaskSchedulerNode::remaining_tasks_);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Fetch the next task id.
    * \return The next task id.
@@ -249,8 +245,6 @@ class PyTaskSchedulerNode : public TaskSchedulerNode {
     refl::ObjectDef<PyTaskSchedulerNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   int NextTaskId() final;
   Array<RunnerResult> JoinRunningTask(int task_id) final;
   void Tune(Array<TuneContext> tasks, Array<FloatImm> task_weights, int 
max_trials_global,
diff --git a/include/tvm/node/script_printer.h 
b/include/tvm/node/script_printer.h
index 5fa54c5c81..af1e015d7b 100644
--- a/include/tvm/node/script_printer.h
+++ b/include/tvm/node/script_printer.h
@@ -147,8 +147,6 @@ class PrinterConfigNode : public Object {
         .def_ro("obj_to_annotate", &PrinterConfigNode::obj_to_annotate);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   Array<String> GetBuiltinKeywords();
 
   static constexpr const char* _type_key = "script.PrinterConfig";
diff --git a/include/tvm/relax/binding_rewrite.h 
b/include/tvm/relax/binding_rewrite.h
index 6c017ccc34..a5f476eb70 100644
--- a/include/tvm/relax/binding_rewrite.h
+++ b/include/tvm/relax/binding_rewrite.h
@@ -75,8 +75,6 @@ class DataflowBlockRewriteNode : public Object {
         .def_ro("root_fn", &DataflowBlockRewriteNode::root_fn_);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.DataflowBlockRewrite";
   TVM_DECLARE_FINAL_OBJECT_INFO(DataflowBlockRewriteNode, Object);
 
diff --git a/include/tvm/relax/dataflow_pattern.h 
b/include/tvm/relax/dataflow_pattern.h
index 5e4a002467..57049e7042 100644
--- a/include/tvm/relax/dataflow_pattern.h
+++ b/include/tvm/relax/dataflow_pattern.h
@@ -221,7 +221,6 @@ class PatternSeqNode final : public Object {
     refl::ObjectDef<PatternSeqNode>().def_ro("patterns", 
&PatternSeqNode::patterns);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.PatternSeq";
   TVM_DECLARE_BASE_OBJECT_INFO(PatternSeqNode, Object);
 };
@@ -354,7 +353,6 @@ class ExprPatternNode : public DFPatternNode {
     refl::ObjectDef<ExprPatternNode>().def_ro("expr", &ExprPatternNode::expr);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.ExprPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(ExprPatternNode, DFPatternNode);
 };
@@ -384,7 +382,6 @@ class VarPatternNode : public DFPatternNode {
     refl::ObjectDef<VarPatternNode>().def_ro("name", &VarPatternNode::name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.VarPattern";
   static constexpr const uint32_t _type_child_slots = 1;
   TVM_DECLARE_BASE_OBJECT_INFO(VarPatternNode, DFPatternNode);
@@ -462,7 +459,6 @@ class ConstantPatternNode : public DFPatternNode {
     refl::ObjectDef<ConstantPatternNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.ConstantPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(ConstantPatternNode, DFPatternNode);
 };
@@ -506,8 +502,6 @@ class CallPatternNode : public DFPatternNode {
         .def_ro("args", &CallPatternNode::args);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.CallPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(CallPatternNode, DFPatternNode);
 };
@@ -532,7 +526,6 @@ class PrimArrPatternNode : public DFPatternNode {
     refl::ObjectDef<PrimArrPatternNode>().def_ro("fields", 
&PrimArrPatternNode::fields);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.PrimArrPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(PrimArrPatternNode, DFPatternNode);
 };
@@ -570,8 +563,6 @@ class FunctionPatternNode : public DFPatternNode {
         .def_ro("body", &FunctionPatternNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.FunctionPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(FunctionPatternNode, DFPatternNode);
 };
@@ -605,7 +596,6 @@ class TuplePatternNode : public DFPatternNode {
     refl::ObjectDef<TuplePatternNode>().def_ro("fields", 
&TuplePatternNode::fields);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.TuplePattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(TuplePatternNode, DFPatternNode);
 };
@@ -634,7 +624,6 @@ class UnorderedTuplePatternNode : public DFPatternNode {
                                                         
&UnorderedTuplePatternNode::fields);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.UnorderedTuplePattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(UnorderedTuplePatternNode, DFPatternNode);
 };
@@ -666,7 +655,6 @@ class TupleGetItemPatternNode : public DFPatternNode {
         .def_ro("index", &TupleGetItemPatternNode::index);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.TupleGetItemPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(TupleGetItemPatternNode, DFPatternNode);
 };
@@ -697,8 +685,6 @@ class AndPatternNode : public DFPatternNode {
         .def_ro("right", &AndPatternNode::right);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.AndPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(AndPatternNode, DFPatternNode);
 };
@@ -729,8 +715,6 @@ class OrPatternNode : public DFPatternNode {
         .def_ro("right", &OrPatternNode::right);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.OrPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(OrPatternNode, DFPatternNode);
 };
@@ -758,8 +742,6 @@ class NotPatternNode : public DFPatternNode {
     refl::ObjectDef<NotPatternNode>().def_ro("reject", 
&NotPatternNode::reject);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.NotPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(NotPatternNode, DFPatternNode);
 };
@@ -785,7 +767,6 @@ class WildcardPatternNode : public DFPatternNode {
     refl::ObjectDef<WildcardPatternNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = "relax.dpl.WildcardPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(WildcardPatternNode, DFPatternNode);
 };
@@ -822,8 +803,6 @@ class StructInfoPatternNode : public DFPatternNode {
         .def_ro("struct_info", &StructInfoPatternNode::struct_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.StructInfoPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(StructInfoPatternNode, DFPatternNode);
 };
@@ -850,8 +829,6 @@ class ShapePatternNode : public DFPatternNode {
         .def_ro("shape", &ShapePatternNode::shape);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.ShapePattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(ShapePatternNode, DFPatternNode);
 };
@@ -884,8 +861,6 @@ class SameShapeConstraintNode : public DFConstraintNode {
     refl::ObjectDef<SameShapeConstraintNode>().def_ro("args", 
&SameShapeConstraintNode::args);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.SameShapeConstraint";
   TVM_DECLARE_FINAL_OBJECT_INFO(SameShapeConstraintNode, DFConstraintNode);
 };
@@ -916,8 +891,6 @@ class DataTypePatternNode : public DFPatternNode {
         .def_ro("dtype", &DataTypePatternNode::dtype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.DataTypePattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(DataTypePatternNode, DFPatternNode);
 };
@@ -948,8 +921,6 @@ class AttrPatternNode : public DFPatternNode {
         .def_ro("attrs", &AttrPatternNode::attrs);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.AttrPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(AttrPatternNode, DFPatternNode);
 };
@@ -982,8 +953,6 @@ class ExternFuncPatternNode : public DFPatternNode {
                                                     
&ExternFuncPatternNode::global_symbol_);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.ExternFuncPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(ExternFuncPatternNode, DFPatternNode);
 };
diff --git a/include/tvm/relax/distributed/global_info.h 
b/include/tvm/relax/distributed/global_info.h
index 3b9663d04b..89cdec14b0 100644
--- a/include/tvm/relax/distributed/global_info.h
+++ b/include/tvm/relax/distributed/global_info.h
@@ -53,8 +53,6 @@ class DeviceMeshNode : public GlobalInfoNode {
         .def_ro("device_range", &DeviceMeshNode::device_range);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.distributed.DeviceMesh";
 
   bool SEqualReduce(const DeviceMeshNode* other, SEqualReducer equal) const {
diff --git a/include/tvm/relax/distributed/struct_info.h 
b/include/tvm/relax/distributed/struct_info.h
index f1dba23122..3b4a4a0d1d 100644
--- a/include/tvm/relax/distributed/struct_info.h
+++ b/include/tvm/relax/distributed/struct_info.h
@@ -51,8 +51,6 @@ class PlacementSpecNode : public Object {
         .def_ro("kind", &PlacementSpecNode::kind);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PlacementSpecNode* other, SEqualReducer equal) const 
{
     return equal(axis, other->axis) && equal(kind, other->kind);
   }
@@ -91,8 +89,6 @@ class ShardingNode : public PlacementSpecNode {
     refl::ObjectDef<ShardingNode>().def_ro("sharding_dim", 
&ShardingNode::sharding_dim);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ShardingNode* other, SEqualReducer equal) const {
     return equal(sharding_dim, other->sharding_dim);
   }
@@ -115,8 +111,6 @@ class PlacementNode : public Object {
     refl::ObjectDef<PlacementNode>().def_ro("dim_specs", 
&PlacementNode::dim_specs);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PlacementNode* other, SEqualReducer equal) const {
     return equal(dim_specs, other->dim_specs);
   }
@@ -167,8 +161,6 @@ class DTensorStructInfoNode : public StructInfoNode {
         .def_ro("tensor_sinfo", &DTensorStructInfoNode::tensor_sinfo);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DTensorStructInfoNode* other, SEqualReducer equal) 
const {
     return equal(tensor_sinfo, other->tensor_sinfo) && equal(device_mesh, 
other->device_mesh) &&
            equal(placement, other->placement);
diff --git a/include/tvm/relax/exec_builder.h b/include/tvm/relax/exec_builder.h
index 616982e787..92664f572e 100644
--- a/include/tvm/relax/exec_builder.h
+++ b/include/tvm/relax/exec_builder.h
@@ -143,8 +143,6 @@ class ExecBuilderNode : public Object {
     refl::ObjectDef<ExecBuilderNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.ExecBuilder";
   TVM_DECLARE_FINAL_OBJECT_INFO(ExecBuilderNode, Object);
 
diff --git a/include/tvm/relax/expr.h b/include/tvm/relax/expr.h
index df51218669..20d899925d 100644
--- a/include/tvm/relax/expr.h
+++ b/include/tvm/relax/expr.h
@@ -60,8 +60,6 @@ class IdNode : public Object {
     refl::ObjectDef<IdNode>().def_ro("name_hint", &IdNode::name_hint);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IdNode* other, SEqualReducer equal) const {
     return equal.FreeVarEqualImpl(this, other);
   }
@@ -175,8 +173,6 @@ class CallNode : public ExprNode {
         .def_ro("sinfo_args", &CallNode::sinfo_args);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const CallNode* other, SEqualReducer equal) const {
     // skip sinfo_args check for primitive ops.
     return equal(op, other->op) && equal(args, other->args) && equal(attrs, 
other->attrs) &&
@@ -234,8 +230,6 @@ class TupleNode : public ExprNode {
     refl::ObjectDef<TupleNode>().def_ro("fields", &TupleNode::fields);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TupleNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from fields.
     return equal(fields, other->fields);
@@ -301,8 +295,6 @@ class TupleGetItemNode : public ExprNode {
         .def_ro("index", &TupleGetItemNode::index);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TupleGetItemNode* other, SEqualReducer equal) const {
     // struct info can be deterministically tuple and index.
     return equal(tuple, other->tuple) && equal(index, other->index);
@@ -372,8 +364,6 @@ class ShapeExprNode : public LeafExprNode {
     refl::ObjectDef<ShapeExprNode>().def_ro("values", &ShapeExprNode::values);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ShapeExprNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from values.
     return equal(values, other->values);
@@ -409,8 +399,6 @@ class VarNode : public LeafExprNode {
     refl::ObjectDef<VarNode>().def_ro("vid", &VarNode::vid);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const VarNode* other, SEqualReducer equal) const {
     equal->MarkGraphNode();
     return equal(vid, other->vid) && equal(struct_info_, other->struct_info_);
@@ -450,8 +438,6 @@ class DataflowVarNode : public VarNode {
     refl::ObjectDef<DataflowVarNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DataflowVarNode* other, SEqualReducer equal) const {
     equal->MarkGraphNode();
     return equal(vid, other->vid) && equal(struct_info_, other->struct_info_);
@@ -502,8 +488,6 @@ class ConstantNode : public LeafExprNode {
     refl::ObjectDef<ConstantNode>().def_ro("data", &ConstantNode::data);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ConstantNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from data.
     return equal(data, other->data) && equal(struct_info_, 
other->struct_info_);
@@ -550,8 +534,6 @@ class PrimValueNode : public LeafExprNode {
     refl::ObjectDef<PrimValueNode>().def_ro("value", &PrimValueNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PrimValueNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from data.
     return equal(value, other->value);
@@ -601,8 +583,6 @@ class StringImmNode : public LeafExprNode {
     refl::ObjectDef<StringImmNode>().def_ro("value", &StringImmNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const StringImmNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from data.
     return equal(value, other->value);
@@ -644,8 +624,6 @@ class DataTypeImmNode : public LeafExprNode {
     refl::ObjectDef<DataTypeImmNode>().def_ro("value", 
&DataTypeImmNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DataTypeImmNode* other, SEqualReducer equal) const {
     // struct info can be deterministically derived from data.
     return equal(value, other->value);
@@ -687,7 +665,6 @@ class BindingNode : public Object {
         .def_ro("var", &BindingNode::var)
         .def_ro("span", &BindingNode::span);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   static constexpr const char* _type_key = "relax.expr.Binding";
   static constexpr const bool _type_has_method_sequal_reduce = true;
@@ -729,8 +706,6 @@ class MatchCastNode : public BindingNode {
         .def_ro("struct_info", &MatchCastNode::struct_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MatchCastNode* other, SEqualReducer equal) const;
   void SHashReduce(SHashReducer hash_reduce) const;
 
@@ -764,8 +739,6 @@ class VarBindingNode : public BindingNode {
         .def_ro("value", &VarBindingNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const VarBindingNode* other, SEqualReducer equal) const;
   void SHashReduce(SHashReducer hash_reduce) const;
 
@@ -792,8 +765,6 @@ class BindingBlockNode : public Object {
     refl::ObjectDef<BindingBlockNode>().def_ro("bindings", 
&BindingBlockNode::bindings);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BindingBlockNode* other, SEqualReducer equal) const {
     return equal(bindings, other->bindings);
   }
@@ -856,8 +827,6 @@ class SeqExprNode : public ExprNode {
         .def_ro("body", &SeqExprNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const SeqExprNode* other, SEqualReducer equal) const {
     return equal(blocks, other->blocks) && equal(body, other->body) &&
            equal(struct_info_, other->struct_info_);
@@ -923,8 +892,6 @@ class IfNode : public ExprNode {
         .def_ro("false_branch", &IfNode::false_branch);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IfNode* other, SEqualReducer equal) const {
     equal->MarkGraphNode();
     return equal(cond, other->cond) && equal(true_branch, other->true_branch) 
&&
@@ -999,8 +966,6 @@ class FunctionNode : public BaseFuncNode {
         .def_ro("is_pure", &FunctionNode::is_pure);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const FunctionNode* other, SEqualReducer equal) const {
     equal->MarkGraphNode();
     return equal.DefEqual(params, other->params) && equal(body, other->body) &&
@@ -1104,8 +1069,6 @@ class ExternFuncNode : public BaseFuncNode {
     refl::ObjectDef<ExternFuncNode>().def_ro("global_symbol", 
&ExternFuncNode::global_symbol);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ExternFuncNode* other, SEqualReducer equal) const {
     return equal(global_symbol, other->global_symbol) && equal(struct_info_, 
other->struct_info_);
   }
diff --git a/include/tvm/relax/struct_info.h b/include/tvm/relax/struct_info.h
index 6895868380..acb4ff51e9 100644
--- a/include/tvm/relax/struct_info.h
+++ b/include/tvm/relax/struct_info.h
@@ -40,8 +40,6 @@ class ObjectStructInfoNode : public StructInfoNode {
     refl::ObjectDef<ObjectStructInfoNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ObjectStructInfoNode* other, SEqualReducer equal) 
const { return true; }
 
   void SHashReduce(SHashReducer hash_reduce) const { hash_reduce(0); }
@@ -79,8 +77,6 @@ class PrimStructInfoNode : public StructInfoNode {
         .def_ro("dtype", &PrimStructInfoNode::dtype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PrimStructInfoNode* other, SEqualReducer equal) 
const {
     return equal(value, other->value) && equal(dtype, other->dtype);
   }
@@ -132,8 +128,6 @@ class ShapeStructInfoNode : public StructInfoNode {
         .def_ro("ndim", &ShapeStructInfoNode::ndim);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ShapeStructInfoNode* other, SEqualReducer equal) 
const {
     return equal(values, other->values) && equal(ndim, other->ndim);
   }
@@ -213,8 +207,6 @@ class TensorStructInfoNode : public StructInfoNode {
         .def_ro("ndim", &TensorStructInfoNode::ndim);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TensorStructInfoNode* other, SEqualReducer equal) 
const {
     return equal(shape, other->shape) && equal(ndim, other->ndim) &&
            equal(vdevice, other->vdevice) && equal(dtype, other->dtype);
@@ -275,8 +267,6 @@ class TupleStructInfoNode : public StructInfoNode {
     refl::ObjectDef<TupleStructInfoNode>().def_ro("fields", 
&TupleStructInfoNode::fields);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TupleStructInfoNode* other, SEqualReducer equal) 
const {
     return equal(fields, other->fields);
   }
@@ -357,8 +347,6 @@ class FuncStructInfoNode : public StructInfoNode {
         .def_ro("purity", &FuncStructInfoNode::purity);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const FuncStructInfoNode* other, SEqualReducer equal) 
const {
     return equal.DefEqual(params, other->params) && equal(ret, other->ret) &&
            equal(purity, other->purity) && equal(derive_func, 
other->derive_func);
diff --git a/include/tvm/relax/tir_pattern.h b/include/tvm/relax/tir_pattern.h
index d39dcc2f00..f3a0bdc543 100644
--- a/include/tvm/relax/tir_pattern.h
+++ b/include/tvm/relax/tir_pattern.h
@@ -53,8 +53,6 @@ class MatchResultNode : public Object {
         .def_ro("matched_buffers", &MatchResultNode::matched_buffers);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.MatchResult";
   TVM_DECLARE_FINAL_OBJECT_INFO(MatchResultNode, Object);
 };
diff --git a/include/tvm/relax/transform.h b/include/tvm/relax/transform.h
index 27f2260428..dd3e2c350e 100644
--- a/include/tvm/relax/transform.h
+++ b/include/tvm/relax/transform.h
@@ -405,8 +405,6 @@ class FusionPatternNode : public Object {
         .def_ro("attrs_getter", &FusionPatternNode::attrs_getter);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.transform.FusionPattern";
   TVM_DECLARE_FINAL_OBJECT_INFO(FusionPatternNode, Object);
 };
@@ -466,8 +464,6 @@ class PatternCheckContextNode : public Object {
         .def_ro("value_to_bound_var", 
&PatternCheckContextNode::value_to_bound_var);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"relax.transform.PatternCheckContext";
   TVM_DECLARE_FINAL_OBJECT_INFO(PatternCheckContextNode, Object);
 };
diff --git a/include/tvm/relax/type.h b/include/tvm/relax/type.h
index 753330caf1..39350ef797 100644
--- a/include/tvm/relax/type.h
+++ b/include/tvm/relax/type.h
@@ -49,8 +49,6 @@ class ShapeTypeNode : public TypeNode {
     refl::ObjectDef<ShapeTypeNode>().def_ro("ndim", &ShapeTypeNode::ndim);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ShapeTypeNode* other, SEqualReducer equal) const {
     return equal(ndim, other->ndim);
   }
@@ -91,8 +89,6 @@ class TensorTypeNode : public TypeNode {
         .def_ro("dtype", &TensorTypeNode::dtype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const TensorTypeNode* other, SEqualReducer equal) const {
     return equal(ndim, other->ndim) && equal(dtype, other->dtype);
   }
@@ -142,8 +138,6 @@ class ObjectTypeNode : public TypeNode {
     refl::ObjectDef<ObjectTypeNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ObjectTypeNode* other, SEqualReducer equal) const { 
return true; }
 
   void SHashReduce(SHashReducer hash_reduce) const { hash_reduce(0); }
@@ -166,8 +160,6 @@ class PackedFuncTypeNode : public TypeNode {
     refl::ObjectDef<PackedFuncTypeNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PackedFuncTypeNode* other, SEqualReducer equal) 
const { return true; }
 
   void SHashReduce(SHashReducer hash_reduce) const { hash_reduce(0); }
diff --git a/include/tvm/script/ir_builder/base.h 
b/include/tvm/script/ir_builder/base.h
index 4fe5c519ee..e16aa2237d 100644
--- a/include/tvm/script/ir_builder/base.h
+++ b/include/tvm/script/ir_builder/base.h
@@ -73,8 +73,6 @@ class IRBuilderFrameNode : public runtime::Object {
     // `callbacks` is not registered as it's not visited.
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.IRBuilderFrame";
   TVM_DECLARE_BASE_OBJECT_INFO(IRBuilderFrameNode, runtime::Object);
 
@@ -170,8 +168,6 @@ class IRBuilderNode : public runtime::Object {
         .def_ro("result", &IRBuilderNode::result);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.IRBuilder";
   TVM_DECLARE_FINAL_OBJECT_INFO(IRBuilderNode, runtime::Object);
 
diff --git a/include/tvm/script/ir_builder/ir/frame.h 
b/include/tvm/script/ir_builder/ir/frame.h
index 764ff0507b..5f92f209a5 100644
--- a/include/tvm/script/ir_builder/ir/frame.h
+++ b/include/tvm/script/ir_builder/ir/frame.h
@@ -61,8 +61,6 @@ class IRModuleFrameNode : public IRBuilderFrameNode {
         .def_ro("global_infos", &IRModuleFrameNode::global_infos);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.IRModuleFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(IRModuleFrameNode, IRBuilderFrameNode);
 
diff --git a/include/tvm/script/ir_builder/relax/frame.h 
b/include/tvm/script/ir_builder/relax/frame.h
index a56e530553..12e59d3140 100644
--- a/include/tvm/script/ir_builder/relax/frame.h
+++ b/include/tvm/script/ir_builder/relax/frame.h
@@ -39,8 +39,6 @@ class RelaxFrameNode : public IRBuilderFrameNode {
     refl::ObjectDef<RelaxFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.relax.RelaxFrame";
   TVM_DECLARE_BASE_OBJECT_INFO(RelaxFrameNode, IRBuilderFrameNode);
 };
@@ -70,8 +68,6 @@ class SeqExprFrameNode : public RelaxFrameNode {
         .def_ro("output", &SeqExprFrameNode::output);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.relax.SeqExprFrame";
   TVM_DECLARE_BASE_OBJECT_INFO(SeqExprFrameNode, RelaxFrameNode);
 
@@ -128,8 +124,6 @@ class FunctionFrameNode : public SeqExprFrameNode {
     // `block_builder` is not registered as it's not visited.
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.relax.FunctionFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(FunctionFrameNode, SeqExprFrameNode);
 
@@ -171,8 +165,6 @@ class BlockFrameNode : public RelaxFrameNode {
     // `block_ended` is not registered as it's not visited.
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.relax.BlockFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockFrameNode, RelaxFrameNode);
 
@@ -214,8 +206,6 @@ class IfFrameNode : public RelaxFrameNode {
         .def_ro("var_name", &IfFrameNode::var_name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.relax.IfFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(IfFrameNode, RelaxFrameNode);
 
@@ -254,8 +244,6 @@ class ThenFrameNode : public SeqExprFrameNode {
     refl::ObjectDef<ThenFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.relax.ThenFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(ThenFrameNode, SeqExprFrameNode);
 
@@ -294,8 +282,6 @@ class ElseFrameNode : public SeqExprFrameNode {
     refl::ObjectDef<ElseFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.relax.ElseFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(ElseFrameNode, SeqExprFrameNode);
 
diff --git a/include/tvm/script/ir_builder/tir/frame.h 
b/include/tvm/script/ir_builder/tir/frame.h
index c3d3d46e7f..e9087588ff 100644
--- a/include/tvm/script/ir_builder/tir/frame.h
+++ b/include/tvm/script/ir_builder/tir/frame.h
@@ -43,8 +43,6 @@ class TIRFrameNode : public IRBuilderFrameNode {
     refl::ObjectDef<TIRFrameNode>().def_ro("stmts", &TIRFrameNode::stmts);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.TIRFrame";
   TVM_DECLARE_BASE_OBJECT_INFO(TIRFrameNode, IRBuilderFrameNode);
 };
@@ -99,8 +97,6 @@ class PrimFuncFrameNode : public TIRFrameNode {
         .def_ro("root_alloc_buffers", &PrimFuncFrameNode::root_alloc_buffers);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.PrimFuncFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(PrimFuncFrameNode, TIRFrameNode);
 
@@ -171,8 +167,6 @@ class BlockFrameNode : public TIRFrameNode {
         .def_ro("no_realize", &BlockFrameNode::no_realize);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.BlockFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockFrameNode, TIRFrameNode);
 
@@ -207,8 +201,6 @@ class BlockInitFrameNode : public TIRFrameNode {
     refl::ObjectDef<BlockInitFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.BlockInitFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockInitFrameNode, TIRFrameNode);
 
@@ -266,8 +258,6 @@ class ForFrameNode : public TIRFrameNode {
     // `f_make_for_loop` is not registered as it's not visited.
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.ForFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(ForFrameNode, TIRFrameNode);
 
@@ -309,8 +299,6 @@ class AssertFrameNode : public TIRFrameNode {
         .def_ro("message", &AssertFrameNode::message);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.AssertFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(AssertFrameNode, TIRFrameNode);
 
@@ -351,8 +339,6 @@ class LetFrameNode : public TIRFrameNode {
         .def_ro("value", &LetFrameNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.LetFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(LetFrameNode, TIRFrameNode);
 
@@ -395,8 +381,6 @@ class LaunchThreadFrameNode : public TIRFrameNode {
         .def_ro("iter_var", &LaunchThreadFrameNode::iter_var);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.LaunchThreadFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(LaunchThreadFrameNode, TIRFrameNode);
 
@@ -441,8 +425,6 @@ class RealizeFrameNode : public TIRFrameNode {
         .def_ro("condition", &RealizeFrameNode::condition);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.RealizeFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(RealizeFrameNode, TIRFrameNode);
 
@@ -495,8 +477,6 @@ class AllocateFrameNode : public TIRFrameNode {
         .def_ro("buffer_var", &AllocateFrameNode::buffer_var);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.AllocateFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(AllocateFrameNode, TIRFrameNode);
 
@@ -546,8 +526,6 @@ class AllocateConstFrameNode : public TIRFrameNode {
         .def_ro("annotations", &AllocateConstFrameNode::annotations);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.AllocateConstFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(AllocateConstFrameNode, TIRFrameNode);
 
@@ -591,8 +569,6 @@ class AttrFrameNode : public TIRFrameNode {
         .def_ro("value", &AttrFrameNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.AttrFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(AttrFrameNode, TIRFrameNode);
 
@@ -629,8 +605,6 @@ class WhileFrameNode : public TIRFrameNode {
     refl::ObjectDef<WhileFrameNode>().def_ro("condition", 
&WhileFrameNode::condition);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.WhileFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(WhileFrameNode, TIRFrameNode);
 
@@ -674,8 +648,6 @@ class IfFrameNode : public TIRFrameNode {
         .def_ro("else_stmts", &IfFrameNode::else_stmts);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.IfFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(IfFrameNode, TIRFrameNode);
 
@@ -709,8 +681,6 @@ class ThenFrameNode : public TIRFrameNode {
     refl::ObjectDef<ThenFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.ThenFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(ThenFrameNode, TIRFrameNode);
 
@@ -749,8 +719,6 @@ class ElseFrameNode : public TIRFrameNode {
     refl::ObjectDef<ElseFrameNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.ir_builder.tir.ElseFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(ElseFrameNode, TIRFrameNode);
 
@@ -791,8 +759,6 @@ class DeclBufferFrameNode : public TIRFrameNode {
         .def_ro("allocated", &DeclBufferFrameNode::allocated);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"script.ir_builder.tir.DeclBufferFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(DeclBufferFrameNode, TIRFrameNode);
 
diff --git a/include/tvm/tir/block_dependence_info.h 
b/include/tvm/tir/block_dependence_info.h
index c45f095dfe..b4fbf1a593 100644
--- a/include/tvm/tir/block_dependence_info.h
+++ b/include/tvm/tir/block_dependence_info.h
@@ -66,8 +66,6 @@ class BlockDependenceInfoNode : public Object {
     refl::ObjectDef<BlockDependenceInfoNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.BlockDependenceInfo";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockDependenceInfoNode, Object);
 
diff --git a/include/tvm/tir/block_scope.h b/include/tvm/tir/block_scope.h
index 0035a230c1..9ea77d7b9b 100644
--- a/include/tvm/tir/block_scope.h
+++ b/include/tvm/tir/block_scope.h
@@ -72,8 +72,6 @@ class StmtSRefNode : public Object {
     refl::ObjectDef<StmtSRefNode>().def_ro("seq_index", 
&StmtSRefNode::seq_index);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.StmtSRef";
   TVM_DECLARE_FINAL_OBJECT_INFO(StmtSRefNode, Object);
 
@@ -229,8 +227,6 @@ class DependencyNode : public Object {
         .def_ro("kind", &DependencyNode::kind);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.Dependency";
   TVM_DECLARE_FINAL_OBJECT_INFO(DependencyNode, Object);
 };
@@ -276,8 +272,6 @@ class BlockScopeNode : public Object {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.BlockScope";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockScopeNode, Object);
 
diff --git a/include/tvm/tir/buffer.h b/include/tvm/tir/buffer.h
index 12afbc5101..992cb2f2e0 100644
--- a/include/tvm/tir/buffer.h
+++ b/include/tvm/tir/buffer.h
@@ -128,8 +128,6 @@ class BufferNode : public Object {
         .def_ro("span", &BufferNode::span);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BufferNode* other, SEqualReducer equal) const {
     // Use DefEqual as buffer can define variables in its semantics,
     // skip name as name is not important.
diff --git a/include/tvm/tir/data_layout.h b/include/tvm/tir/data_layout.h
index 1643ccb60b..d1c026079c 100644
--- a/include/tvm/tir/data_layout.h
+++ b/include/tvm/tir/data_layout.h
@@ -115,8 +115,6 @@ class LayoutNode : public Object {
         .def_ro("axes", &LayoutNode::axes);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.Layout";
   TVM_DECLARE_FINAL_OBJECT_INFO(LayoutNode, Object);
 };
@@ -326,8 +324,6 @@ class BijectiveLayoutNode : public Object {
         .def_ro("shape_backward_rule", 
&BijectiveLayoutNode::shape_backward_rule);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.BijectiveLayout";
   TVM_DECLARE_FINAL_OBJECT_INFO(BijectiveLayoutNode, Object);
 };
diff --git a/include/tvm/tir/function.h b/include/tvm/tir/function.h
index 6bcb35d38d..ead03e9676 100644
--- a/include/tvm/tir/function.h
+++ b/include/tvm/tir/function.h
@@ -109,8 +109,6 @@ class PrimFuncNode : public BaseFuncNode {
         .def_ro("buffer_map", &PrimFuncNode::buffer_map);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PrimFuncNode* other, SEqualReducer equal) const {
     // visit params and buffer_map first as they contains defs.
     return equal.DefEqual(params, other->params) && equal(buffer_map, 
other->buffer_map) &&
@@ -189,8 +187,6 @@ class TensorIntrinNode : public Object {
         .def_ro("impl", &TensorIntrinNode::impl);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.TensorIntrin";
   TVM_DECLARE_FINAL_OBJECT_INFO(TensorIntrinNode, Object);
 };
diff --git a/include/tvm/tir/index_map.h b/include/tvm/tir/index_map.h
index 45c0c50a4b..1cc6fa950a 100644
--- a/include/tvm/tir/index_map.h
+++ b/include/tvm/tir/index_map.h
@@ -159,8 +159,6 @@ class IndexMapNode : public Object {
         .def_ro("inverse_index_map", &IndexMapNode::inverse_index_map);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IndexMapNode* other, SEqualReducer equal) const {
     return equal.DefEqual(initial_indices, other->initial_indices) &&
            equal(final_indices, other->final_indices);
diff --git a/include/tvm/tir/schedule/instruction.h 
b/include/tvm/tir/schedule/instruction.h
index bf96f6e036..5becf40a2c 100644
--- a/include/tvm/tir/schedule/instruction.h
+++ b/include/tvm/tir/schedule/instruction.h
@@ -119,8 +119,6 @@ class InstructionKindNode : public runtime::Object {
         .def_ro("_is_pure", &InstructionKindNode::is_pure);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*! \brief Checks if the instruction kind is EnterPostproc */
   bool IsPostproc() const;
 
@@ -183,8 +181,6 @@ class InstructionNode : public runtime::Object {
         .def_ro("outputs", &InstructionNode::outputs);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.Instruction";
   TVM_DECLARE_FINAL_OBJECT_INFO(InstructionNode, runtime::Object);
 };
diff --git a/include/tvm/tir/schedule/schedule.h 
b/include/tvm/tir/schedule/schedule.h
index 6a303f6a47..9fbb9981e5 100644
--- a/include/tvm/tir/schedule/schedule.h
+++ b/include/tvm/tir/schedule/schedule.h
@@ -54,8 +54,6 @@ class BlockRVNode : public runtime::Object {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.BlockRV";
   TVM_DECLARE_FINAL_OBJECT_INFO(BlockRVNode, runtime::Object);
 };
@@ -80,8 +78,6 @@ class LoopRVNode : public runtime::Object {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.LoopRV";
   TVM_DECLARE_FINAL_OBJECT_INFO(LoopRVNode, runtime::Object);
 };
diff --git a/include/tvm/tir/schedule/state.h b/include/tvm/tir/schedule/state.h
index 6a551d9923..ec843148ae 100644
--- a/include/tvm/tir/schedule/state.h
+++ b/include/tvm/tir/schedule/state.h
@@ -127,8 +127,6 @@ class ScheduleStateNode : public Object {
         .def_ro("enable_check", &ScheduleStateNode::enable_check);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Replace the part of the AST, as being pointed to by `src_sref`,
    * with a specific statement `tgt_stmt`, and maintain the sref tree 
accordingly.
diff --git a/include/tvm/tir/schedule/trace.h b/include/tvm/tir/schedule/trace.h
index c5858842a0..6e3dd29551 100644
--- a/include/tvm/tir/schedule/trace.h
+++ b/include/tvm/tir/schedule/trace.h
@@ -69,8 +69,6 @@ class TraceNode : public runtime::Object {
         .def_ro("decisions", &TraceNode::decisions);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.Trace";
   TVM_DECLARE_FINAL_OBJECT_INFO(TraceNode, runtime::Object);
 
diff --git a/include/tvm/tir/stmt.h b/include/tvm/tir/stmt.h
index ff8ff12e23..7586a77f51 100644
--- a/include/tvm/tir/stmt.h
+++ b/include/tvm/tir/stmt.h
@@ -86,8 +86,6 @@ class LetStmtNode : public StmtNode {
         .def_ro("body", &LetStmtNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const LetStmtNode* other, SEqualReducer equal) const {
     return equal.DefEqual(var, other->var) && equal(value, other->value) &&
            equal(body, other->body);
@@ -145,8 +143,6 @@ class AttrStmtNode : public StmtNode {
         .def_ro("body", &AttrStmtNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const AttrStmtNode* other, SEqualReducer equal) const {
     return equal(node, other->node) && equal(attr_key, other->attr_key) &&
            equal(value, other->value) && equal(body, other->body);
@@ -198,8 +194,6 @@ class AssertStmtNode : public StmtNode {
         .def_ro("body", &AssertStmtNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const AssertStmtNode* other, SEqualReducer equal) const {
     return equal(condition, other->condition) && equal(message, 
other->message) &&
            equal(body, other->body);
@@ -257,8 +251,6 @@ class BufferStoreNode : public StmtNode {
         .def_ro("predicate", &BufferStoreNode::predicate);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BufferStoreNode* other, SEqualReducer equal) const {
     return equal(buffer, other->buffer) && equal(value, other->value) &&
            equal(indices, other->indices);
@@ -319,8 +311,6 @@ class BufferRealizeNode : public StmtNode {
         .def_ro("body", &BufferRealizeNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BufferRealizeNode* other, SEqualReducer equal) const 
{
     return equal(buffer, other->buffer) && equal(bounds, other->bounds) &&
            equal(condition, other->condition) && equal(body, other->body);
@@ -389,8 +379,6 @@ class AllocateNode : public StmtNode {
         .def_ro("annotations", &AllocateNode::annotations);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const AllocateNode* other, SEqualReducer equal) const {
     return equal.DefEqual(buffer_var, other->buffer_var) && equal(dtype, 
other->dtype) &&
            equal(extents, other->extents) && equal(condition, 
other->condition) &&
@@ -481,8 +469,6 @@ class AllocateConstNode : public StmtNode {
         .def_ro("annotations", &AllocateConstNode::annotations);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const AllocateConstNode* other, SEqualReducer equal) const 
{
     return equal.DefEqual(buffer_var, other->buffer_var) && equal(dtype, 
other->dtype) &&
            equal(extents, other->extents) && equal(data, other->data) && 
equal(body, other->body) &&
@@ -551,8 +537,6 @@ class DeclBufferNode : public StmtNode {
         .def_ro("body", &DeclBufferNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const DeclBufferNode* other, SEqualReducer equal) const {
     return equal(buffer, other->buffer) && equal(body, other->body);
   }
@@ -595,8 +579,6 @@ class SeqStmtNode : public StmtNode {
     refl::ObjectDef<SeqStmtNode>().def_ro("seq", &SeqStmtNode::seq);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const SeqStmtNode* other, SEqualReducer equal) const {
     return equal(seq, other->seq);
   }
@@ -623,8 +605,6 @@ class EvaluateNode : public StmtNode {
     refl::ObjectDef<EvaluateNode>().def_ro("value", &EvaluateNode::value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const EvaluateNode* other, SEqualReducer equal) const {
     return equal(value, other->value);
   }
@@ -820,8 +800,6 @@ class IfThenElseNode : public StmtNode {
         .def_ro("else_case", &IfThenElseNode::else_case);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const IfThenElseNode* other, SEqualReducer equal) const {
     return equal(condition, other->condition) && equal(then_case, 
other->then_case) &&
            equal(else_case, other->else_case);
@@ -927,8 +905,6 @@ class ForNode : public StmtNode {
         .def_ro("annotations", &ForNode::annotations);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const ForNode* other, SEqualReducer equal) const {
     return equal.DefEqual(loop_var, other->loop_var) && equal(min, other->min) 
&&
            equal(extent, other->extent) && equal(kind, other->kind) && 
equal(body, other->body) &&
@@ -987,8 +963,6 @@ class WhileNode : public StmtNode {
         .def_ro("body", &WhileNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const WhileNode* other, SEqualReducer equal) const {
     return equal(condition, other->condition) && equal(body, other->body);
   }
@@ -1031,8 +1005,6 @@ class BufferRegionNode : public PrimExprConvertibleNode {
         .def_ro("region", &BufferRegionNode::region);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BufferRegionNode* other, SEqualReducer equal) const {
     return equal(buffer, other->buffer) && equal(region, other->region);
   }
@@ -1100,8 +1072,6 @@ class MatchBufferRegionNode : public Object {
         .def_ro("source", &MatchBufferRegionNode::source);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MatchBufferRegionNode* other, SEqualReducer equal) 
const {
     return equal(buffer, other->buffer) && equal(source, other->source);
   }
@@ -1191,8 +1161,6 @@ class BlockNode : public StmtNode {
         .def_ro("annotations", &BlockNode::annotations);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BlockNode* other, SEqualReducer equal) const {
     // Need first reduce iter_vars, alloc_buffers and match_buffers to define 
new vars
     return equal.DefEqual(iter_vars, other->iter_vars) &&
@@ -1258,8 +1226,6 @@ class BlockRealizeNode : public StmtNode {
         .def_ro("block", &BlockRealizeNode::block);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BlockRealizeNode* other, SEqualReducer equal) const {
     return equal(iter_values, other->iter_values) && equal(predicate, 
other->predicate) &&
            equal(block, other->block);
diff --git a/src/arith/interval_set.h b/src/arith/interval_set.h
index 80e5b9ce87..6addd30f5a 100644
--- a/src/arith/interval_set.h
+++ b/src/arith/interval_set.h
@@ -57,8 +57,6 @@ class IntervalSetNode : public IntSetNode {
         .def_ro("max_value", &IntervalSetNode::max_value);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*! \return Whether the interval has upper bound. */
   bool HasUpperBound() const { return !is_pos_inf(max_value) && !IsEmpty(); }
   /*! \return Whether the interval has lower bound. */
diff --git a/src/arith/presburger_set.h b/src/arith/presburger_set.h
index 496603b9d8..1f4bc409db 100644
--- a/src/arith/presburger_set.h
+++ b/src/arith/presburger_set.h
@@ -77,8 +77,6 @@ class PresburgerSetNode : public IntSetNode {
     refl::ObjectDef<PresburgerSetNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Do inplace union with given disjunct
    * \param disjunct The given disjunct to be union with
@@ -161,8 +159,6 @@ class PresburgerSetNode : public IntSetNode {
     refl::ObjectDef<PresburgerSetNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "arith.PresburgerSet";
   TVM_DECLARE_FINAL_OBJECT_INFO(PresburgerSetNode, IntSetNode);
 };
diff --git a/src/arith/rewrite_simplify.h b/src/arith/rewrite_simplify.h
index f5d5b4c47f..60511ae013 100644
--- a/src/arith/rewrite_simplify.h
+++ b/src/arith/rewrite_simplify.h
@@ -65,8 +65,6 @@ struct RewriteSimplifierStatsNode : Object {
         .def_ro("num_recursive_rewrites", 
&RewriteSimplifierStatsNode::num_recursive_rewrites);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "arith.RewriteSimplifierStats";
   TVM_DECLARE_FINAL_OBJECT_INFO(RewriteSimplifierStatsNode, Object);
 };
diff --git a/src/contrib/msc/core/ir/graph.h b/src/contrib/msc/core/ir/graph.h
index 9f6ba07f0f..92775646b9 100644
--- a/src/contrib/msc/core/ir/graph.h
+++ b/src/contrib/msc/core/ir/graph.h
@@ -387,8 +387,6 @@ class MSCTensorNode : public Object {
         .def_ro("prims", &MSCTensorNode::prims);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MSCTensorNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(dtype, other->dtype) && 
equal(shape, other->shape) &&
            equal(layout, other->layout) && equal(prims, other->prims);
@@ -502,8 +500,6 @@ class BaseJointNode : public Object {
         .def_ro("children", &BaseJointNode::children);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BaseJointNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(shared_ref, other->shared_ref) &&
            equal(attrs, other->attrs) && equal(parents, other->parents) &&
@@ -589,8 +585,6 @@ class MSCJointNode : public BaseJointNode {
         .def_ro("weights", &MSCJointNode::weights);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MSCJointNode* other, SEqualReducer equal) const {
     return BaseJointNode::SEqualReduce(other, equal) && equal(optype, 
other->optype) &&
            equal(scope, other->scope) && equal(inputs, other->inputs) &&
@@ -675,8 +669,6 @@ class MSCPrimNode : public BaseJointNode {
     refl::ObjectDef<MSCPrimNode>().def_ro("optype", &MSCPrimNode::optype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MSCPrimNode* other, SEqualReducer equal) const {
     return BaseJointNode::SEqualReduce(other, equal) && equal(optype, 
other->optype);
   }
@@ -754,8 +746,6 @@ class WeightJointNode : public BaseJointNode {
         .def_ro("friends", &WeightJointNode::friends);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const WeightJointNode* other, SEqualReducer equal) const {
     return BaseJointNode::SEqualReduce(other, equal) && equal(weight_type, 
other->weight_type) &&
            equal(weight, other->weight) && equal(friends, other->friends);
@@ -832,8 +822,6 @@ class BaseGraphNode : public Object {
         .def_ro("node_names", &BaseGraphNode::node_names);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const BaseGraphNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(nodes, other->nodes) &&
            equal(node_names, other->node_names);
@@ -937,8 +925,6 @@ class MSCGraphNode : public BaseGraphNode {
         .def_ro("weight_holders", &MSCGraphNode::weight_holders);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const MSCGraphNode* other, SEqualReducer equal) const {
     return BaseGraphNode::SEqualReduce(other, equal) && equal(prims, 
other->prims) &&
            equal(prim_names, other->prim_names) && equal(input_names, 
other->input_names) &&
@@ -1015,8 +1001,6 @@ class WeightGraphNode : public BaseGraphNode {
     refl::ObjectDef<WeightGraphNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const WeightGraphNode* other, SEqualReducer equal) const {
     return BaseGraphNode::SEqualReduce(other, equal);
   }
diff --git a/src/contrib/msc/core/ir/plugin.h b/src/contrib/msc/core/ir/plugin.h
index 6e2fc5ddce..dd346a905f 100644
--- a/src/contrib/msc/core/ir/plugin.h
+++ b/src/contrib/msc/core/ir/plugin.h
@@ -278,8 +278,6 @@ class PluginAttrNode : public Object {
         .def_ro("describe", &PluginAttrNode::describe);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PluginAttrNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(type, other->type) &&
            equal(default_value, other->default_value) && equal(describe, 
other->describe);
@@ -360,8 +358,6 @@ class PluginTensorNode : public Object {
         .def_ro("describe", &PluginTensorNode::describe);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PluginTensorNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(dtype, other->dtype) && 
equal(ndim, other->ndim) &&
            equal(device, other->device) && equal(describe, other->describe);
@@ -444,8 +440,6 @@ class PluginExternNode : public Object {
         .def_ro("describe", &PluginExternNode::describe);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PluginExternNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(header, other->header) &&
            equal(source, other->source) && equal(lib, other->lib) &&
@@ -549,8 +543,6 @@ class PluginNode : public Object {
         .def_ro("options", &PluginNode::options);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   bool SEqualReduce(const PluginNode* other, SEqualReducer equal) const {
     return equal(name, other->name) && equal(version, other->version) &&
            equal(describe, other->describe) && equal(attrs, other->attrs) &&
diff --git a/src/contrib/msc/core/printer/msc_doc.h 
b/src/contrib/msc/core/printer/msc_doc.h
index 276e88f7aa..d1e9170cff 100644
--- a/src/contrib/msc/core/printer/msc_doc.h
+++ b/src/contrib/msc/core/printer/msc_doc.h
@@ -60,8 +60,6 @@ class DeclareDocNode : public ExprDocNode {
         .def_ro("use_constructor", &DeclareDocNode::use_constructor);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.DeclareDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(DeclareDocNode, ExprDocNode);
 };
@@ -104,8 +102,6 @@ class StrictListDocNode : public ExprDocNode {
         .def_ro("allow_empty", &StrictListDocNode::allow_empty);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.StrictListDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(StrictListDocNode, ExprDocNode);
 };
@@ -141,8 +137,6 @@ class PointerDocNode : public ExprDocNode {
     refl::ObjectDef<PointerDocNode>().def_ro("name", &PointerDocNode::name);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.PointerDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(PointerDocNode, ExprDocNode);
 };
@@ -184,8 +178,6 @@ class StructDocNode : public StmtDocNode {
         .def_ro("body", &StructDocNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.StructDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(StructDocNode, StmtDocNode);
 };
@@ -235,8 +227,6 @@ class ConstructorDocNode : public StmtDocNode {
         .def_ro("body", &ConstructorDocNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.ConstructorDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(ConstructorDocNode, StmtDocNode);
 };
@@ -280,8 +270,6 @@ class SwitchDocNode : public StmtDocNode {
         .def_ro("default_branch", &SwitchDocNode::default_branch);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.SwitchDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(SwitchDocNode, StmtDocNode);
 };
@@ -335,8 +323,6 @@ class LambdaDocNode : public StmtDocNode {
         .def_ro("body", &LambdaDocNode::body);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "msc.script.printer.LambdaDoc";
   TVM_DECLARE_FINAL_OBJECT_INFO(LambdaDocNode, StmtDocNode);
 };
diff --git a/src/ir/transform.cc b/src/ir/transform.cc
index 159c1f2e5a..9e1c95d7f6 100644
--- a/src/ir/transform.cc
+++ b/src/ir/transform.cc
@@ -353,8 +353,6 @@ class ModulePassNode : public PassNode {
     refl::ObjectDef<ModulePassNode>().def_ro("pass_info", 
&ModulePassNode::pass_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Run a module pass on given pass context.
    *
diff --git a/src/meta_schedule/database/json_database.cc 
b/src/meta_schedule/database/json_database.cc
index afaf641126..f8660453e3 100644
--- a/src/meta_schedule/database/json_database.cc
+++ b/src/meta_schedule/database/json_database.cc
@@ -89,7 +89,6 @@ class JSONDatabaseNode : public DatabaseNode {
         .def_ro("path_workload", &JSONDatabaseNode::path_workload)
         .def_ro("path_tuning_record", &JSONDatabaseNode::path_tuning_record);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   static constexpr const char* _type_key = "meta_schedule.JSONDatabase";
   TVM_DECLARE_FINAL_OBJECT_INFO(JSONDatabaseNode, DatabaseNode);
diff --git a/src/meta_schedule/database/memory_database.cc 
b/src/meta_schedule/database/memory_database.cc
index 37cc9aa15a..eb1b0d19d4 100644
--- a/src/meta_schedule/database/memory_database.cc
+++ b/src/meta_schedule/database/memory_database.cc
@@ -37,7 +37,7 @@ class MemoryDatabaseNode : public DatabaseNode {
         .def_ro("records", &MemoryDatabaseNode::records)
         .def_ro("workloads", &MemoryDatabaseNode::workloads);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.MemoryDatabase";
   TVM_DECLARE_FINAL_OBJECT_INFO(MemoryDatabaseNode, DatabaseNode);
 
diff --git a/src/meta_schedule/database/ordered_union_database.cc 
b/src/meta_schedule/database/ordered_union_database.cc
index 6e07c4763d..8f8d2370d9 100644
--- a/src/meta_schedule/database/ordered_union_database.cc
+++ b/src/meta_schedule/database/ordered_union_database.cc
@@ -32,7 +32,7 @@ class OrderedUnionDatabaseNode : public DatabaseNode {
     refl::ObjectDef<OrderedUnionDatabaseNode>().def_ro("databases",
                                                        
&OrderedUnionDatabaseNode::databases);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = 
"meta_schedule.OrderedUnionDatabase";
   TVM_DECLARE_FINAL_OBJECT_INFO(OrderedUnionDatabaseNode, DatabaseNode);
 
diff --git a/src/meta_schedule/database/schedule_fn_database.cc 
b/src/meta_schedule/database/schedule_fn_database.cc
index a037cd861c..10ac141bc3 100644
--- a/src/meta_schedule/database/schedule_fn_database.cc
+++ b/src/meta_schedule/database/schedule_fn_database.cc
@@ -34,7 +34,7 @@ class ScheduleFnDatabaseNode : public DatabaseNode {
     refl::ObjectDef<ScheduleFnDatabaseNode>().def_ro("schedule_fn",
                                                      
&ScheduleFnDatabaseNode::schedule_fn);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.ScheduleFnDatabase";
   TVM_DECLARE_FINAL_OBJECT_INFO(ScheduleFnDatabaseNode, DatabaseNode);
 
diff --git a/src/meta_schedule/database/union_database.cc 
b/src/meta_schedule/database/union_database.cc
index bab6a4ca6f..a275b95721 100644
--- a/src/meta_schedule/database/union_database.cc
+++ b/src/meta_schedule/database/union_database.cc
@@ -31,7 +31,7 @@ class UnionDatabaseNode : public DatabaseNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<UnionDatabaseNode>().def_ro("databases", 
&UnionDatabaseNode::databases);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.UnionDatabase";
   TVM_DECLARE_FINAL_OBJECT_INFO(UnionDatabaseNode, DatabaseNode);
 
diff --git a/src/meta_schedule/feature_extractor/per_store_feature.cc 
b/src/meta_schedule/feature_extractor/per_store_feature.cc
index 1a18d1c700..d74f1c369e 100644
--- a/src/meta_schedule/feature_extractor/per_store_feature.cc
+++ b/src/meta_schedule/feature_extractor/per_store_feature.cc
@@ -1378,7 +1378,6 @@ class PerStoreFeatureNode : public FeatureExtractorNode {
         .def_ro("extract_workload", &PerStoreFeatureNode::extract_workload)
         .def_ro("feature_vector_length", 
&PerStoreFeatureNode::feature_vector_length);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   void ExtractSingle(IRModule mod, bool is_gpu, 
std::vector<std::vector<double>>* results) {
     static transform::Sequential passes = 
tir::transform::PassListForPerStoreFeature();
diff --git a/src/meta_schedule/mutator/mutate_compute_location.cc 
b/src/meta_schedule/mutator/mutate_compute_location.cc
index 276fd89605..c1baa9b26c 100644
--- a/src/meta_schedule/mutator/mutate_compute_location.cc
+++ b/src/meta_schedule/mutator/mutate_compute_location.cc
@@ -38,8 +38,6 @@ class MutateComputeLocationNode : public MutatorNode {
     refl::ObjectDef<MutateComputeLocationNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"meta_schedule.MutateComputeLocation";
   TVM_DECLARE_FINAL_OBJECT_INFO(MutateComputeLocationNode, MutatorNode);
 
diff --git a/src/meta_schedule/mutator/mutate_parallel.cc 
b/src/meta_schedule/mutator/mutate_parallel.cc
index afad83634f..53ba13d139 100644
--- a/src/meta_schedule/mutator/mutate_parallel.cc
+++ b/src/meta_schedule/mutator/mutate_parallel.cc
@@ -176,7 +176,7 @@ class MutateParallelNode : public MutatorNode {
     refl::ObjectDef<MutateParallelNode>().def_ro("max_jobs_per_core",
                                                  
&MutateParallelNode::max_jobs_per_core);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.MutateParallel";
   TVM_DECLARE_FINAL_OBJECT_INFO(MutateParallelNode, MutatorNode);
 
diff --git a/src/meta_schedule/mutator/mutate_thread_binding.cc 
b/src/meta_schedule/mutator/mutate_thread_binding.cc
index ade84fd336..27bf5b334a 100644
--- a/src/meta_schedule/mutator/mutate_thread_binding.cc
+++ b/src/meta_schedule/mutator/mutate_thread_binding.cc
@@ -38,8 +38,6 @@ class MutateThreadBindingNode : public MutatorNode {
     refl::ObjectDef<MutateThreadBindingNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.MutateThreadBinding";
   TVM_DECLARE_FINAL_OBJECT_INFO(MutateThreadBindingNode, MutatorNode);
 
diff --git a/src/meta_schedule/mutator/mutate_tile_size.cc 
b/src/meta_schedule/mutator/mutate_tile_size.cc
index 728a081e28..0157309cb3 100644
--- a/src/meta_schedule/mutator/mutate_tile_size.cc
+++ b/src/meta_schedule/mutator/mutate_tile_size.cc
@@ -61,8 +61,6 @@ class MutateTileSizeNode : public MutatorNode {
     refl::ObjectDef<MutateTileSizeNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.MutateTileSize";
   TVM_DECLARE_FINAL_OBJECT_INFO(MutateTileSizeNode, MutatorNode);
 
diff --git a/src/meta_schedule/mutator/mutate_unroll.cc 
b/src/meta_schedule/mutator/mutate_unroll.cc
index 1948493a0e..71dcd7702b 100644
--- a/src/meta_schedule/mutator/mutate_unroll.cc
+++ b/src/meta_schedule/mutator/mutate_unroll.cc
@@ -57,8 +57,6 @@ class MutateUnrollNode : public MutatorNode {
     refl::ObjectDef<MutateUnrollNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.MutateUnroll";
   TVM_DECLARE_FINAL_OBJECT_INFO(MutateUnrollNode, MutatorNode);
 
diff --git a/src/meta_schedule/postproc/rewrite_cooperative_fetch.cc 
b/src/meta_schedule/postproc/rewrite_cooperative_fetch.cc
index 46a478a1aa..2e0ebf985e 100644
--- a/src/meta_schedule/postproc/rewrite_cooperative_fetch.cc
+++ b/src/meta_schedule/postproc/rewrite_cooperative_fetch.cc
@@ -121,7 +121,6 @@ class RewriteCooperativeFetchNode : public PostprocNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<RewriteCooperativeFetchNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   // Inherited from PostprocNode
   void InitializeWithTuneContext(const TuneContext& context) final {
diff --git a/src/meta_schedule/postproc/rewrite_reduction_block.cc 
b/src/meta_schedule/postproc/rewrite_reduction_block.cc
index f182d710f8..0aa3d640cc 100644
--- a/src/meta_schedule/postproc/rewrite_reduction_block.cc
+++ b/src/meta_schedule/postproc/rewrite_reduction_block.cc
@@ -115,7 +115,6 @@ class RewriteReductionBlockNode : public PostprocNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<RewriteReductionBlockNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   // Inherited from PostprocNode
   void InitializeWithTuneContext(const TuneContext& context) final {}
diff --git a/src/meta_schedule/postproc/rewrite_tensorize.cc 
b/src/meta_schedule/postproc/rewrite_tensorize.cc
index cc1aa1e02c..9456defeed 100644
--- a/src/meta_schedule/postproc/rewrite_tensorize.cc
+++ b/src/meta_schedule/postproc/rewrite_tensorize.cc
@@ -67,7 +67,6 @@ class RewriteTensorizeNode : public PostprocNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<RewriteTensorizeNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   void InitializeWithTuneContext(const TuneContext& context) final {}
 
diff --git a/src/meta_schedule/postproc/rewrite_unbound_block.cc 
b/src/meta_schedule/postproc/rewrite_unbound_block.cc
index 846a74833d..29f9280afa 100644
--- a/src/meta_schedule/postproc/rewrite_unbound_block.cc
+++ b/src/meta_schedule/postproc/rewrite_unbound_block.cc
@@ -114,7 +114,6 @@ class RewriteUnboundBlockNode : public PostprocNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<RewriteUnboundBlockNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   static constexpr const char* _type_key = "meta_schedule.RewriteUnboundBlock";
   TVM_DECLARE_FINAL_OBJECT_INFO(RewriteUnboundBlockNode, PostprocNode);
diff --git a/src/meta_schedule/schedule_rule/add_rfactor.cc 
b/src/meta_schedule/schedule_rule/add_rfactor.cc
index 78f8289d28..190749c09a 100644
--- a/src/meta_schedule/schedule_rule/add_rfactor.cc
+++ b/src/meta_schedule/schedule_rule/add_rfactor.cc
@@ -64,7 +64,6 @@ class AddRFactorNode : public ScheduleRuleNode {
         .def_ro("max_jobs_per_core", &AddRFactorNode::max_jobs_per_core)
         .def_ro("max_innermost_factor", &AddRFactorNode::max_innermost_factor);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   static constexpr const char* _type_key = "meta_schedule.AddRFactor";
   TVM_DECLARE_FINAL_OBJECT_INFO(AddRFactorNode, ScheduleRuleNode);
diff --git a/src/meta_schedule/schedule_rule/apply_custom_rule.cc 
b/src/meta_schedule/schedule_rule/apply_custom_rule.cc
index 28fa488b0e..234b9fd132 100644
--- a/src/meta_schedule/schedule_rule/apply_custom_rule.cc
+++ b/src/meta_schedule/schedule_rule/apply_custom_rule.cc
@@ -77,7 +77,7 @@ class ApplyCustomRuleNode : public ScheduleRuleNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<ApplyCustomRuleNode>().def_ro("target_", 
&ApplyCustomRuleNode::target_);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.ApplyCustomRule";
   TVM_DECLARE_FINAL_OBJECT_INFO(ApplyCustomRuleNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/schedule_rule/auto_bind.cc 
b/src/meta_schedule/schedule_rule/auto_bind.cc
index 7e264da4a9..d2077306f7 100644
--- a/src/meta_schedule/schedule_rule/auto_bind.cc
+++ b/src/meta_schedule/schedule_rule/auto_bind.cc
@@ -60,7 +60,7 @@ class AutoBindNode : public ScheduleRuleNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<AutoBindNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.AutoBind";
   TVM_DECLARE_FINAL_OBJECT_INFO(AutoBindNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/schedule_rule/auto_inline.cc 
b/src/meta_schedule/schedule_rule/auto_inline.cc
index e0e9386ca3..eb7b2e6e20 100644
--- a/src/meta_schedule/schedule_rule/auto_inline.cc
+++ b/src/meta_schedule/schedule_rule/auto_inline.cc
@@ -95,7 +95,7 @@ class AutoInlineNode : public ScheduleRuleNode {
         .def_ro("require_ordered", &AutoInlineNode::require_ordered)
         .def_ro("disallow_op", &AutoInlineNode::disallow_op);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = "meta_schedule.AutoInline";
   TVM_DECLARE_FINAL_OBJECT_INFO(AutoInlineNode, ScheduleRuleNode);
 };
@@ -232,7 +232,6 @@ class InlineConstantScalarsNode : public ScheduleRuleNode {
     refl::ObjectDef<InlineConstantScalarsNode>();
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
   static constexpr const char* _type_key = 
"meta_schedule.InlineConstantScalars";
   TVM_DECLARE_FINAL_OBJECT_INFO(InlineConstantScalarsNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/schedule_rule/cross_thread_reduction.cc 
b/src/meta_schedule/schedule_rule/cross_thread_reduction.cc
index 571a1375a5..df0d190003 100644
--- a/src/meta_schedule/schedule_rule/cross_thread_reduction.cc
+++ b/src/meta_schedule/schedule_rule/cross_thread_reduction.cc
@@ -280,7 +280,7 @@ class CrossThreadReductionNode : public ScheduleRuleNode {
         .def_ro("warp_size", &CrossThreadReductionNode::warp_size)
         .def_ro("thread_extents", &CrossThreadReductionNode::thread_extents);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = 
"meta_schedule.CrossThreadReduction";
   TVM_DECLARE_FINAL_OBJECT_INFO(CrossThreadReductionNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/schedule_rule/multi_level_tiling.h 
b/src/meta_schedule/schedule_rule/multi_level_tiling.h
index a85e88aad6..5589604fd9 100644
--- a/src/meta_schedule/schedule_rule/multi_level_tiling.h
+++ b/src/meta_schedule/schedule_rule/multi_level_tiling.h
@@ -229,8 +229,6 @@ class MultiLevelTilingNode : public ScheduleRuleNode {
         .def_ro("max_innermost_factor", 
&MultiLevelTilingNode::max_innermost_factor);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.MultiLevelTiling";
   TVM_DECLARE_BASE_OBJECT_INFO(MultiLevelTilingNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/schedule_rule/parallel_vectorize_unroll.cc 
b/src/meta_schedule/schedule_rule/parallel_vectorize_unroll.cc
index d123e33e71..48a607f230 100644
--- a/src/meta_schedule/schedule_rule/parallel_vectorize_unroll.cc
+++ b/src/meta_schedule/schedule_rule/parallel_vectorize_unroll.cc
@@ -118,7 +118,6 @@ class ParallelizeVectorizeUnrollNode : public 
ScheduleRuleNode {
         .def_ro("unroll_max_steps", 
&ParallelizeVectorizeUnrollNode::unroll_max_steps)
         .def_ro("unroll_explicit", 
&ParallelizeVectorizeUnrollNode::unroll_explicit);
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
 
   static constexpr const char* _type_key = 
"meta_schedule.ParallelizeVectorizeUnroll";
   TVM_DECLARE_FINAL_OBJECT_INFO(ParallelizeVectorizeUnrollNode, 
ScheduleRuleNode);
diff --git a/src/meta_schedule/schedule_rule/random_compute_location.cc 
b/src/meta_schedule/schedule_rule/random_compute_location.cc
index 27ab8f4ad0..a0e602e657 100644
--- a/src/meta_schedule/schedule_rule/random_compute_location.cc
+++ b/src/meta_schedule/schedule_rule/random_compute_location.cc
@@ -117,7 +117,7 @@ class RandomComputeLocationNode : public ScheduleRuleNode {
     namespace refl = tvm::ffi::reflection;
     refl::ObjectDef<RandomComputeLocationNode>();
   }
-  static constexpr bool _type_has_method_visit_attrs = false;
+
   static constexpr const char* _type_key = 
"meta_schedule.RandomComputeLocation";
   TVM_DECLARE_FINAL_OBJECT_INFO(RandomComputeLocationNode, ScheduleRuleNode);
 };
diff --git a/src/meta_schedule/search_strategy/evolutionary_search.cc 
b/src/meta_schedule/search_strategy/evolutionary_search.cc
index f942d28e52..61ad46172f 100644
--- a/src/meta_schedule/search_strategy/evolutionary_search.cc
+++ b/src/meta_schedule/search_strategy/evolutionary_search.cc
@@ -395,8 +395,6 @@ class EvolutionarySearchNode : public SearchStrategyNode {
         .def_ro("eps_greedy", &EvolutionarySearchNode::eps_greedy);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.EvolutionarySearch";
   TVM_DECLARE_FINAL_OBJECT_INFO(EvolutionarySearchNode, SearchStrategyNode);
 
diff --git a/src/meta_schedule/task_scheduler/gradient_based.cc 
b/src/meta_schedule/task_scheduler/gradient_based.cc
index 207e8b6616..30bfc611cb 100644
--- a/src/meta_schedule/task_scheduler/gradient_based.cc
+++ b/src/meta_schedule/task_scheduler/gradient_based.cc
@@ -40,8 +40,6 @@ class GradientBasedNode final : public TaskSchedulerNode {
         .def_ro("window_size", &GradientBasedNode::window_size);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.GradientBased";
   TVM_DECLARE_FINAL_OBJECT_INFO(GradientBasedNode, TaskSchedulerNode);
 
diff --git a/src/meta_schedule/task_scheduler/round_robin.cc 
b/src/meta_schedule/task_scheduler/round_robin.cc
index 35685bc7f2..e8d16c0cf4 100644
--- a/src/meta_schedule/task_scheduler/round_robin.cc
+++ b/src/meta_schedule/task_scheduler/round_robin.cc
@@ -34,8 +34,6 @@ class RoundRobinNode final : public TaskSchedulerNode {
     refl::ObjectDef<RoundRobinNode>().def_ro("task_id", 
&RoundRobinNode::task_id);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "meta_schedule.RoundRobin";
   TVM_DECLARE_FINAL_OBJECT_INFO(RoundRobinNode, TaskSchedulerNode);
 
diff --git a/src/relax/backend/contrib/cutlass/codegen.cc 
b/src/relax/backend/contrib/cutlass/codegen.cc
index a3b0e8460c..f5a6ead0bd 100644
--- a/src/relax/backend/contrib/cutlass/codegen.cc
+++ b/src/relax/backend/contrib/cutlass/codegen.cc
@@ -87,8 +87,6 @@ class CodegenResultNode : public Object {
         .def_ro("headers", &CodegenResultNode::headers);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "contrib.cutlass.CodegenResult";
   TVM_DECLARE_FINAL_OBJECT_INFO(CodegenResultNode, Object);
 };
diff --git a/src/relax/ir/dataflow_block_rewriter.cc 
b/src/relax/ir/dataflow_block_rewriter.cc
index 284d7eaf0c..cdb97b30c1 100644
--- a/src/relax/ir/dataflow_block_rewriter.cc
+++ b/src/relax/ir/dataflow_block_rewriter.cc
@@ -382,8 +382,6 @@ class PatternContextRewriterNode : public 
PatternMatchingRewriterNode {
         .def_ro("rewriter_func", &PatternContextRewriterNode::rewriter_func);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.PatternContextRewriter";
   TVM_DECLARE_FINAL_OBJECT_INFO(PatternContextRewriterNode, 
PatternMatchingRewriterNode);
 
diff --git a/src/relax/ir/dataflow_rewriter.h b/src/relax/ir/dataflow_rewriter.h
index 87e855fbd9..8e36ebbbc4 100644
--- a/src/relax/ir/dataflow_rewriter.h
+++ b/src/relax/ir/dataflow_rewriter.h
@@ -59,8 +59,6 @@ class PatternMatchingRewriterNode : public 
tvm::transform::PassNode {
     // PatternMatchingRewriterNode has no fields to register
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   IRModule operator()(IRModule mod, const tvm::transform::PassContext& 
pass_ctx) const override;
   tvm::transform::PassInfo Info() const override;
 
@@ -101,8 +99,6 @@ class ExprPatternRewriterNode : public 
PatternMatchingRewriterNode {
         .def_ro("func", &ExprPatternRewriterNode::func);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.ExprPatternRewriter";
   TVM_DECLARE_BASE_OBJECT_INFO(ExprPatternRewriterNode, 
PatternMatchingRewriterNode);
 };
@@ -132,8 +128,6 @@ class OrRewriterNode : public PatternMatchingRewriterNode {
         .def_ro("rhs", &OrRewriterNode::rhs);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.OrRewriter";
   TVM_DECLARE_BASE_OBJECT_INFO(OrRewriterNode, PatternMatchingRewriterNode);
 };
@@ -161,8 +155,6 @@ class TupleRewriterNode : public 
PatternMatchingRewriterNode {
         .def_ro("func", &TupleRewriterNode::func);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "relax.dpl.TupleRewriter";
   TVM_DECLARE_BASE_OBJECT_INFO(TupleRewriterNode, PatternMatchingRewriterNode);
 
diff --git a/src/relax/ir/emit_te.h b/src/relax/ir/emit_te.h
index b5e45bde74..3a58d918c6 100644
--- a/src/relax/ir/emit_te.h
+++ b/src/relax/ir/emit_te.h
@@ -52,8 +52,6 @@ class RXPlaceholderOpNode : public te::PlaceholderOpNode {
         .def_ro("dtype", &RXPlaceholderOpNode::dtype);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "RXPlaceholderOp";
   TVM_DECLARE_FINAL_OBJECT_INFO(RXPlaceholderOpNode, te::PlaceholderOpNode);
 };
diff --git a/src/relax/ir/py_expr_functor.cc b/src/relax/ir/py_expr_functor.cc
index 4fc585b37c..8a60719179 100644
--- a/src/relax/ir/py_expr_functor.cc
+++ b/src/relax/ir/py_expr_functor.cc
@@ -141,8 +141,6 @@ class PyExprVisitorNode : public Object, public ExprVisitor 
{
     // PyExprVisitorNode has no fields to register
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "expr_functor.PyExprVisitor";
   TVM_DECLARE_BASE_OBJECT_INFO(PyExprVisitorNode, Object);
 
@@ -404,8 +402,6 @@ class PyExprMutatorNode : public Object, public ExprMutator 
{
     refl::ObjectDef<PyExprMutatorNode>().def_ro("builder_", 
&PyExprMutatorNode::builder_);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "expr_functor.PyExprMutator";
   TVM_DECLARE_BASE_OBJECT_INFO(PyExprMutatorNode, Object);
 
diff --git a/src/relax/ir/transform.cc b/src/relax/ir/transform.cc
index 382fa62841..73e724b895 100644
--- a/src/relax/ir/transform.cc
+++ b/src/relax/ir/transform.cc
@@ -67,8 +67,6 @@ class FunctionPassNode : public tvm::transform::PassNode {
     refl::ObjectDef<FunctionPassNode>().def_ro("pass_info", 
&FunctionPassNode::pass_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Run a function pass on given pass context.
    *
@@ -216,8 +214,6 @@ class DataflowBlockPassNode : public 
tvm::transform::PassNode {
     refl::ObjectDef<DataflowBlockPassNode>().def_ro("pass_info", 
&DataflowBlockPassNode::pass_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   IRModule operator()(IRModule mod, const PassContext& pass_ctx) const final;
 
   PassInfo Info() const override { return pass_info; }
diff --git a/src/relax/transform/dataflow_inplace.cc 
b/src/relax/transform/dataflow_inplace.cc
index 723118411b..d23cf47f75 100644
--- a/src/relax/transform/dataflow_inplace.cc
+++ b/src/relax/transform/dataflow_inplace.cc
@@ -532,8 +532,6 @@ class InplaceOpportunityNode : public Object {
         .def_ro("arg_idxs", &InplaceOpportunityNode::arg_idxs);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"relax.transform.InplaceOpportunity";
   TVM_DECLARE_BASE_OBJECT_INFO(InplaceOpportunityNode, Object);
 };
diff --git a/src/relax/transform/infer_layout_utils.h 
b/src/relax/transform/infer_layout_utils.h
index f8675b70e8..bf0a992f99 100644
--- a/src/relax/transform/infer_layout_utils.h
+++ b/src/relax/transform/infer_layout_utils.h
@@ -69,8 +69,6 @@ class LayoutDecisionNode : public Object {
         .def_ro("is_unknown_dim", &LayoutDecisionNode::is_unknown_dim);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   TVM_DECLARE_BASE_OBJECT_INFO(LayoutDecisionNode, Object);
 
   static constexpr const char* _type_key = "relax.transform.LayoutDecision";
@@ -121,8 +119,6 @@ class InferLayoutOutputNode : public Object {
         .def_ro("new_args", &InferLayoutOutputNode::new_args);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   TVM_DECLARE_BASE_OBJECT_INFO(InferLayoutOutputNode, Object);
 
   static constexpr const char* _type_key = "relax.transform.InferLayoutOutput";
diff --git a/src/script/printer/ir/utils.h b/src/script/printer/ir/utils.h
index 4d5f711bad..1944732d34 100644
--- a/src/script/printer/ir/utils.h
+++ b/src/script/printer/ir/utils.h
@@ -44,8 +44,6 @@ class IRFrameNode : public FrameNode {
     // global infos is not exposed
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.printer.IRFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(IRFrameNode, FrameNode);
 };
diff --git a/src/script/printer/relax/utils.h b/src/script/printer/relax/utils.h
index f495bcba88..b9a0a849f9 100644
--- a/src/script/printer/relax/utils.h
+++ b/src/script/printer/relax/utils.h
@@ -51,8 +51,6 @@ class RelaxFrameNode : public FrameNode {
         .def_ro("module_alias_printed", &RelaxFrameNode::module_alias_printed);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.printer.RelaxFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(RelaxFrameNode, FrameNode);
 };
diff --git a/src/script/printer/tir/utils.h b/src/script/printer/tir/utils.h
index 6b37ca9550..105dc94d56 100644
--- a/src/script/printer/tir/utils.h
+++ b/src/script/printer/tir/utils.h
@@ -56,8 +56,6 @@ class TIRFrameNode : public FrameNode {
         .def_ro("allow_concise_scoping", &TIRFrameNode::allow_concise_scoping);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "script.printer.TIRFrame";
   TVM_DECLARE_FINAL_OBJECT_INFO(TIRFrameNode, FrameNode);
 };
diff --git a/src/tir/ir/py_functor.cc b/src/tir/ir/py_functor.cc
index 9e65365719..6382a77992 100644
--- a/src/tir/ir/py_functor.cc
+++ b/src/tir/ir/py_functor.cc
@@ -218,8 +218,6 @@ class PyStmtExprVisitorNode : public Object, public 
StmtExprVisitor {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.PyStmtExprVisitor";
   TVM_DECLARE_BASE_OBJECT_INFO(PyStmtExprVisitorNode, Object);
 
@@ -583,8 +581,6 @@ class PyStmtExprMutatorNode : public Object, public 
StmtExprMutator {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.PyStmtExprMutator";
   TVM_DECLARE_BASE_OBJECT_INFO(PyStmtExprMutatorNode, Object);
 
diff --git a/src/tir/ir/transform.cc b/src/tir/ir/transform.cc
index 05684c1bd8..b8a91cfc12 100644
--- a/src/tir/ir/transform.cc
+++ b/src/tir/ir/transform.cc
@@ -68,8 +68,6 @@ class PrimFuncPassNode : public PassNode {
     refl::ObjectDef<PrimFuncPassNode>().def_ro("pass_info", 
&PrimFuncPassNode::pass_info);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   /*!
    * \brief Run a function pass on given pass context.
    *
diff --git a/src/tir/schedule/analysis.h b/src/tir/schedule/analysis.h
index 277b896283..25d09ff931 100644
--- a/src/tir/schedule/analysis.h
+++ b/src/tir/schedule/analysis.h
@@ -749,8 +749,6 @@ class TensorizeInfoNode : public Object {
         .def_ro("block_iter_paddings", 
&TensorizeInfoNode::block_iter_paddings);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = "tir.schedule.TensorizeInfo";
   TVM_DECLARE_FINAL_OBJECT_INFO(TensorizeInfoNode, Object);
 };
@@ -799,8 +797,6 @@ class AutoTensorizeMappingInfoNode : public Object {
         .def_ro("rhs_iters", &AutoTensorizeMappingInfoNode::rhs_iters);
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   static constexpr const char* _type_key = 
"tir.schedule.AutoTensorizeMappingInfo";
   TVM_DECLARE_FINAL_OBJECT_INFO(AutoTensorizeMappingInfoNode, Object);
 };
diff --git a/src/tir/schedule/concrete_schedule.h 
b/src/tir/schedule/concrete_schedule.h
index 60b196d71b..5f3f0c8b61 100644
--- a/src/tir/schedule/concrete_schedule.h
+++ b/src/tir/schedule/concrete_schedule.h
@@ -54,8 +54,6 @@ class ConcreteScheduleNode : public ScheduleNode {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   virtual ~ConcreteScheduleNode() = default;
 
  public:
diff --git a/src/tir/schedule/traced_schedule.h 
b/src/tir/schedule/traced_schedule.h
index 50586d70e6..024c3fb873 100644
--- a/src/tir/schedule/traced_schedule.h
+++ b/src/tir/schedule/traced_schedule.h
@@ -35,8 +35,6 @@ class TracedScheduleNode : public ConcreteScheduleNode {
     // No fields to register as they are not visited
   }
 
-  static constexpr bool _type_has_method_visit_attrs = false;
-
   ~TracedScheduleNode() = default;
 
  public:

Reply via email to