X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_intrinsics.c;h=ba84212674d57622717ec14c7d6453b6b334373d;hb=b84d550997d07bfcc4d828e8fbb5742098e050e4;hp=41d2b0ec556811d2a58d8b70009ba3dea71761dd;hpb=1e78e81405d64f8a8ad2a40e2ffdf9af2e86df8d;p=libfirm diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index 41d2b0ec5..ba8421267 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -27,6 +27,7 @@ #include "irgwalk.h" #include "ircons.h" #include "irgmod.h" +#include "irgopt.h" #include "lower_intrinsics.h" #include "pmap.h" @@ -34,7 +35,7 @@ typedef struct _walker_env { pmap *c_map; /**< The intrinsic call map. */ unsigned nr_of_intrinsics; /**< statistics */ - const i_instr_record **i_map; /**< The intrinsic instruction map. */ + i_instr_record **i_map; /**< The intrinsic instruction map. */ } walker_env_t; /** @@ -66,21 +67,26 @@ static void call_mapper(ir_node *node, void *env) { else { if (0 <= op->code && op->code < ARR_LEN(wenv->i_map)) { const i_instr_record *r = wenv->i_map[op->code]; - if (r) { /* we have a mapper */ - wenv->nr_of_intrinsics += r->i_mapper(node, r->ctx) ? 1 : 0; + /* run all possible mapper */ + while (r) { + if (r->i_mapper(node, r->ctx)) { + ++wenv->nr_of_intrinsics; + break; + } + r = r->link; } } } } /* Go through all graphs and map calls to intrinsic functions. */ -unsigned lower_intrinsics(const i_record *list, int length) { - int i, n_ops = get_irp_n_opcodes(); - ir_graph *irg; - pmap *c_map = pmap_create_ex(length); - const i_instr_record **i_map; - unsigned nr_of_intrinsics = 0; - walker_env_t wenv; +unsigned lower_intrinsics(i_record *list, int length) { + int i, n_ops = get_irp_n_opcodes(); + ir_graph *irg; + pmap *c_map = pmap_create_ex(length); + i_instr_record **i_map; + unsigned nr_of_intrinsics = 0; + walker_env_t wenv; /* we use the ir_op generic pointers here */ NEW_ARR_A(const i_instr_record *, i_map, n_ops); @@ -95,6 +101,7 @@ unsigned lower_intrinsics(const i_record *list, int length) { ir_op *op = list[i].i_instr.op; assert(0 <= op->code && op->code < ARR_LEN(i_map)); + list[i].i_instr.link = i_map[op->code]; i_map[op->code] = &list[i].i_instr; } } @@ -117,6 +124,9 @@ unsigned lower_intrinsics(const i_record *list, int length) { set_irg_doms_inconsistent(irg); set_irg_loopinfo_inconsistent(irg); + /* optimize it, tuple might be created */ + local_optimize_graph(irg); + nr_of_intrinsics += wenv.nr_of_intrinsics; } }