From 2a64ed683a2ffd06acd6d3342fa9340eb3f4b50b Mon Sep 17 00:00:00 2001 From: Adam Szalkowski Date: Thu, 3 Aug 2006 08:11:48 +0000 Subject: [PATCH] =?utf8?q?option=20added=20for=20only=20using=20remats=20?= =?utf8?q?=C3=A1=20la=20Briggs?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- ir/be/bespillremat.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index 6c3624728..4e59f0837 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -53,13 +53,12 @@ #include "bechordal_t.h" -#define BIGM 100000.0 - #define DUMP_SOLUTION #define DUMP_ILP //#define KEEPALIVE /* keep alive all inserted remats and dump graph with remats */ #define COLLECT_REMATS /* enable rematerialization */ #define COLLECT_INVERSE_REMATS /* enable placement of inverse remats */ +//#define ONLY_BRIGGS_REMATS /* only remats without parameters (or only with ignored params) */ #define REMAT_WHILE_LIVE /* only remat values that are live */ //#define NO_ENLARGE_L1V3N355 /* do not remat after the death of some operand */ //#define EXECFREQ_LOOPDEPH /* compute execution frequency from loop depth only */ @@ -506,6 +505,7 @@ add_remat(const spill_ilp_t * si, const remat_t * remat) } } +#ifdef NO_SINGLE_USE_REMATS static int get_irn_n_nonremat_edges(const spill_ilp_t * si, const ir_node * irn) { @@ -521,6 +521,22 @@ get_irn_n_nonremat_edges(const spill_ilp_t * si, const ir_node * irn) return i; } +#endif + +#ifdef ONLY_BRIGGS_REMATS +static int +get_irn_n_nonignore_args(const spill_ilp_t * si, const ir_node * irn) +{ + int n; + unsigned int ret = 0; + + for(n=get_irn_arity(irn)-1; n>=0; --n) { + if(has_reg_class(si, irn)) ++ret; + } + + return ret; +} +#endif static INLINE void get_remats_from_op(spill_ilp_t * si, const ir_node * op) @@ -528,18 +544,21 @@ get_remats_from_op(spill_ilp_t * si, const ir_node * op) int n; remat_t *remat; + if( has_reg_class(si, op) #ifdef NO_SINGLE_USE_REMATS - if(has_reg_class(si, op) && (get_irn_n_nonremat_edges(si, op) > 1)) { -#else - if(has_reg_class(si, op)) { + && (get_irn_n_nonremat_edges(si, op) > 1) +#endif +#ifdef ONLY_BRIGGS_REMATS + && (get_irn_n_nonignore_args(si, op) == 0) #endif + ) { remat = get_remat_from_op(si, op, op); if(remat) { add_remat(si, remat); } } -#ifdef COLLECT_INVERSE_REMATS +#if defined(COLLECT_INVERSE_REMATS) && !defined(ONLY_BRIGGS_REMATS) /* repeat the whole stuff for each remat retrieved by get_remat_from_op(op, arg) for each arg */ for (n = get_irn_arity(op)-1; n>=0; --n) { -- 2.20.1