Fixed async proc detection in mem2reg
authorClifford Wolf <clifford@clifford.at>
Thu, 21 Nov 2013 20:26:56 +0000 (21:26 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 21 Nov 2013 20:26:56 +0000 (21:26 +0100)
frontends/ast/simplify.cc

index f1cce397c5fc74b1354b1d29f036eba776a2677d..a3518ff03ed0e8611e64edd410c949a687f9e74a 100644 (file)
@@ -77,9 +77,13 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                if (memflags & AstNode::MEM2REG_FL_EQ2)
                                        goto verbose_activate;
 
+                               if (memflags & AstNode::MEM2REG_FL_SET_ASYNC)
+                                       goto verbose_activate;
+
                                if ((memflags & AstNode::MEM2REG_FL_SET_INIT) && (memflags & AstNode::MEM2REG_FL_SET_ELSE))
                                        goto verbose_activate;
 
+                               // log("Note: Not replacing memory %s with list of registers (flags=0x%08lx).\n", mem->str.c_str(), long(memflags));
                                continue;
 
                        verbose_activate:
@@ -94,6 +98,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                }
 
                        silent_activate:
+                               // log("Note: Replacing memory %s with list of registers (flags=0x%08lx).\n", mem->str.c_str(), long(memflags));
                                mem2reg_set.insert(mem);
                        }
 
@@ -1349,12 +1354,11 @@ void AstNode::mem2reg_as_needed_pass1(std::map<AstNode*, std::set<std::string>>
        std::map<AstNode*, uint32_t> *proc_flags_p = NULL;
 
        if (type == AST_ALWAYS) {
-               bool sync_proc = false;
-               for (auto child : children) {
+               int count_edge_events = 0;
+               for (auto child : children)
                        if (child->type == AST_POSEDGE || child->type == AST_NEGEDGE)
-                               sync_proc = true;
-               }
-               if (!sync_proc)
+                               count_edge_events++;
+               if (count_edge_events != 1)
                        children_flags |= AstNode::MEM2REG_FL_ASYNC;
                proc_flags_p = new std::map<AstNode*, uint32_t>;
        }