summaryrefslogtreecommitdiff
path: root/gcc/gimple-walker.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gimple-walker.c')
-rw-r--r--gcc/gimple-walker.c13
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 *)