Added deep recursion warning to AST simplify
authorClifford Wolf <clifford@clifford.at>
Fri, 20 Feb 2015 09:33:20 +0000 (10:33 +0100)
committerClifford Wolf <clifford@clifford.at>
Fri, 20 Feb 2015 09:33:20 +0000 (10:33 +0100)
frontends/ast/simplify.cc

index ed767514b174e9d8d90b561f9fad66e6475e9a4b..404dab4e86e7a773fb33235fd439100b17fec384 100644 (file)
@@ -51,7 +51,12 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
 {
        static int recursion_counter = 0;
        static pair<string, int> last_blocking_assignment_warn;
-       recursion_counter++;
+       static bool deep_recursion_warning = false;
+
+       if (recursion_counter++ == 1000 && deep_recursion_warning) {
+               log_warning("Deep recursion in AST simplifier.\nDoes this design contain insanely long expressions?\n");
+               deep_recursion_warning = false;
+       }
 
        AstNode *newNode = NULL;
        bool did_something = false;
@@ -69,6 +74,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                log_assert(type == AST_MODULE);
                last_blocking_assignment_warn = pair<string, int>();
 
+               deep_recursion_warning = true;
                while (simplify(const_fold, at_zero, in_lvalue, 1, width_hint, sign_hint, in_param)) { }
 
                if (!flag_nomem2reg && !get_bool_attribute("\\nomem2reg"))