X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbepeephole.h;h=a7f36fc4f244d9337cf2e8284e54564045c95ffa;hb=ccdf802c598f7adc5e35fff42fed029c59f48a57;hp=1fe1ed5e05136d91e07565c42e2a8d39f0f4d850;hpb=f2062b3d40c421fdb69804343bce89dd289fb307;p=libfirm diff --git a/ir/be/bepeephole.h b/ir/be/bepeephole.h index 1fe1ed5e0..a7f36fc4f 100644 --- a/ir/be/bepeephole.h +++ b/ir/be/bepeephole.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -32,13 +32,13 @@ extern ir_node ***register_values; -static inline ir_node *be_peephole_get_value(unsigned regclass_idx, +static INLINE ir_node *be_peephole_get_value(unsigned regclass_idx, unsigned register_idx) { return register_values[regclass_idx][register_idx]; } -static inline ir_node *be_peephole_get_reg_value(const arch_register_t *reg) +static INLINE ir_node *be_peephole_get_reg_value(const arch_register_t *reg) { unsigned regclass_idx = arch_register_class_index(arch_register_get_class(reg)); unsigned register_idx = arch_register_get_index(reg); @@ -47,17 +47,37 @@ static inline ir_node *be_peephole_get_reg_value(const arch_register_t *reg) } /** - * Datatype of the generic op handler for optimisation. If it exchanged node - * with something else, then it must return the new node, otherwise NULL. + * Datatype of the generic op handler for optimisation. */ -typedef ir_node*(*peephole_opt_func) (ir_node *node); +typedef void (*peephole_opt_func) (ir_node *node); + +/** + * Notify the peephole phase about a newly added node, so it can update its + * internal state. This is not needed for the new node, when + * be_peephole_exchange() is used. */ +void be_peephole_new_node(ir_node *nw); + +/** + * When doing peephole optimisation use this function instead of plain + * exchange(), so it can update its internal state. */ +void be_peephole_exchange(ir_node *old, ir_node *nw); + +/** + * Tries to optimize a beIncSp node with it's previous IncSP node. + * Must be run from a be_peephole_opt() context. + * + * @param node a be_IncSP node + * + * @return the new IncSP node or node itself + */ +ir_node *be_peephole_IncSP_IncSP(ir_node *node); /** * Do peephole optimisations. It traverses the schedule of all blocks in * backward direction. The register_values variable indicates which (live) * values are stored in which register. * The generic op handler is called for each node if it exists. That's where - * backedn specific optimisations should be performed based on the + * backend specific optimisations should be performed based on the * register-liveness information. */ void be_peephole_opt(be_irg_t *birg);