You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by sy...@apache.org on 2023/10/11 09:17:18 UTC

[tvm] branch unity updated: [Unity] Improve FuseOps error messages (#15899)

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

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


The following commit(s) were added to refs/heads/unity by this push:
     new f154026db1 [Unity] Improve FuseOps error messages (#15899)
f154026db1 is described below

commit f154026db1282cfb97a6d19cca60181910e2ad9e
Author: Eric Lunderberg <Lu...@users.noreply.github.com>
AuthorDate: Wed Oct 11 04:17:09 2023 -0500

    [Unity] Improve FuseOps error messages (#15899)
    
    This commit adds debugging information to checks in the `FuseOps`
    pass.  While the existing checks indicate where an error occurred in
    the `FuseOps` code, this adds information on the relax expressions
    that caused the error.
---
 src/relax/transform/fuse_ops.cc | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/relax/transform/fuse_ops.cc b/src/relax/transform/fuse_ops.cc
index 8a76935e9b..5cabfc40ca 100644
--- a/src/relax/transform/fuse_ops.cc
+++ b/src/relax/transform/fuse_ops.cc
@@ -209,7 +209,10 @@ class GraphCreator : public ExprVisitor {
     SetNodePattern(binding_var_node, pattern);
     // Visit all call args
     for (const Expr& arg : args) {
-      ICHECK(IsLeafOrTuple(arg));
+      ICHECK(IsLeafOrTuple(arg))
+          << "FuseOps expects all relax::Call nodes to have non-nested arguments, "
+          << "but " << GetRef<Expr>(call) << " has argument " << arg
+          << ", which is neither a leaf node nor a relax::Tuple";
       VisitLeaf(arg, binding_var_node, pattern);
     }
   }
@@ -281,7 +284,7 @@ class GraphCreator : public ExprVisitor {
    */
   IndexedForwardGraph::Node* CreateNode(const Object* key) {
     ICHECK(graph_.node_map.find(key) == graph_.node_map.end())
-        << "The node corresponding to the input key is not supposed to be created before";
+        << "The object " << GetRef<ObjectRef>(key) << " appears at multiple definition sites.";
     auto* node = arena_->make<IndexedForwardGraph::Node>();
     graph_.node_map[key] = node;
     return node;
@@ -296,12 +299,14 @@ class GraphCreator : public ExprVisitor {
   void AddToPostDFSOrder(IndexedForwardGraph::Node* node, const Object* key) {
     auto it = graph_.node_map.find(key);
     ICHECK(it != graph_.node_map.end() && it->second == node)
-        << "The node must have been created before adding to the post-dfs order";
+        << "Cannot add node " << GetRef<ObjectRef>(key) << " to the post-DFS order, "
+        << "because the node for this object has not yet been created.";
 
     // We only set the reference of the node when adding it to the post-dfs order. Thus, if the
     // reference of a node is already set, it must have been appended to the post-dfs order.
-    ICHECK(node->ref == nullptr)
-        << "The node is not supposed to be added into the post-dfs order before";
+    ICHECK(node->ref == nullptr) << "Cannot add node " << GetRef<ObjectRef>(key)
+                                 << " to the post-DFS order, "
+                                 << "because it has already been added.";
 
     node->ref = key;
     node->index = graph_.post_dfs_order.size();
@@ -336,7 +341,8 @@ class GraphCreator : public ExprVisitor {
    */
   void SetNodePattern(IndexedForwardGraph::Node* node, OpPatternKind pattern) {
     ICHECK(initialized_nodes_.find(node) == initialized_nodes_.end())
-        << "The input node is supposed to be set pattern for only once";
+        << "The input node " << GetRef<ObjectRef>(node->ref)
+        << " cannot have have its OpPatternKind set more than once.";
     initialized_nodes_.insert(node);
     node->pattern = pattern;
   }
@@ -915,7 +921,8 @@ class OperatorFusor : public ExprMutator {
    */
   Group* GetGroupFromVar(const Var& var) {
     const auto& it_group = obj2group_.find(var.get());
-    ICHECK(it_group != obj2group_.end());
+    ICHECK(it_group != obj2group_.end())
+        << "Variable " << var << " could not be found in any group";
     Group* group = it_group->second;
     return group->FindRoot();
   }