diff options
Diffstat (limited to 'gcc/gimple-walker.c')
-rw-r--r-- | gcc/gimple-walker.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/gimple-walker.c b/gcc/gimple-walker.c index 3c9c07c13ad..2755dcdab98 100644 --- a/gcc/gimple-walker.c +++ b/gcc/gimple-walker.c @@ -57,12 +57,16 @@ GimpleWalker::walk() { _walk_globals(); + std::set<tree> fndecls; cgraph_node *node = NULL; FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) { print_function(node); node->get_untransformed_body(); + const bool already_in_set = fndecls.find(node->decl) != fndecls.end(); + if (already_in_set) continue; _walk_cnode(node); + fndecls.insert(node->decl); } } @@ -116,6 +120,7 @@ GimpleWalker::_walk_cnode(cgraph_node *cnode) _walk_bb(cnode); } + void GimpleWalker::_walk_decl(cgraph_node *cnode) { @@ -194,6 +199,12 @@ GimpleWalker::_walk(basic_block bb) first = false; _deleted = false; } + + for (gimple_stmt_iterator gsi = gsi_start_phis(bb); !gsi_end_p(gsi); gsi_next(&gsi)) + { + gimple *stmt = gsi_stmt(gsi); + walk(stmt); + } } void @@ -224,6 +235,7 @@ GimpleWalker::_walk(gimple *stmt) GimpleWalkerWalk(gcall*); GimpleWalkerWalk(glabel*); GimpleWalkerWalk(gswitch*); + GimpleWalkerWalk(gphi*); const enum gimple_code code = gimple_code (stmt); @@ -258,4 +270,5 @@ GimpleWalkerFuncDef(gcond *) GimpleWalkerFuncDef(gcall *) GimpleWalkerFuncDef(glabel *) GimpleWalkerFuncDef(gswitch *) +GimpleWalkerFuncDef(gphi *) |