From 30080af12b11add6144c4da009956ddcb855934f Mon Sep 17 00:00:00 2001 From: Sebastian Hack Date: Wed, 5 Jan 2005 14:05:15 +0000 Subject: [PATCH] Fixed constant placement walker --- ir/be/beutil.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/ir/be/beutil.c b/ir/be/beutil.c index 10745a2a4..a50cb9dce 100644 --- a/ir/be/beutil.c +++ b/ir/be/beutil.c @@ -3,6 +3,9 @@ #include "irgraph.h" #include "irgwalk.h" +#include "ircons.h" +#include "iropt.h" +#include "irgopt.h" #include "irprintf.h" #include "beutil.h" @@ -60,3 +63,30 @@ void dump_allocated_irg(ir_graph *irg) fclose(f); } } + +static void localize_const_walker(ir_node *irn, void *data) +{ + if(!is_Block(irn)) { + int i, n; + + for(i = 0, n = get_irn_arity(irn); i < n; ++i) { + ir_node *op = get_irn_n(irn, i); + if(get_irn_opcode(op) == iro_Const) { + /* + * We have to create the const node by ourselves, since the + * firmcons implementation always places it in the start block. + */ + ir_node *cnst = new_ir_node(NULL, get_irn_irg(irn), + get_nodes_block(irn), op_Const, get_irn_mode(op), 0, NULL); + cnst->attr.con.tv = get_Const_tarval(op); + set_irn_n(irn, i, cnst); + } + } + } +} + +void localize_consts(ir_graph *irg) +{ + irg_walk_graph(irg, localize_const_walker, NULL, NULL); + dead_node_elimination(irg); +} -- 2.20.1