Fixed async proc detection in mem2reg

This commit is contained in:
Clifford Wolf 2013-11-21 21:26:56 +01:00
parent 09471846c5
commit 95c94a02fc
1 changed files with 9 additions and 5 deletions

View 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) if (memflags & AstNode::MEM2REG_FL_EQ2)
goto verbose_activate; 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)) if ((memflags & AstNode::MEM2REG_FL_SET_INIT) && (memflags & AstNode::MEM2REG_FL_SET_ELSE))
goto verbose_activate; goto verbose_activate;
// log("Note: Not replacing memory %s with list of registers (flags=0x%08lx).\n", mem->str.c_str(), long(memflags));
continue; continue;
verbose_activate: verbose_activate:
@ -94,6 +98,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
} }
silent_activate: 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); 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; std::map<AstNode*, uint32_t> *proc_flags_p = NULL;
if (type == AST_ALWAYS) { if (type == AST_ALWAYS) {
bool sync_proc = false; int count_edge_events = 0;
for (auto child : children) { for (auto child : children)
if (child->type == AST_POSEDGE || child->type == AST_NEGEDGE) if (child->type == AST_POSEDGE || child->type == AST_NEGEDGE)
sync_proc = true; count_edge_events++;
} if (count_edge_events != 1)
if (!sync_proc)
children_flags |= AstNode::MEM2REG_FL_ASYNC; children_flags |= AstNode::MEM2REG_FL_ASYNC;
proc_flags_p = new std::map<AstNode*, uint32_t>; proc_flags_p = new std::map<AstNode*, uint32_t>;
} }