From dbd58c518b3dea3f584764b5cd3d78b3e9f45dfe Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Sat, 17 Sep 2011 13:23:41 +0200 Subject: [PATCH] add missing keeps after rematerializing nodes --- ir/be/beabihelper.c | 10 ++++++++-- ir/be/beabihelper.h | 5 +++++ ir/be/beflags.c | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ir/be/beabihelper.c b/ir/be/beabihelper.c index 15a870954..b9576094a 100644 --- a/ir/be/beabihelper.c +++ b/ir/be/beabihelper.c @@ -411,7 +411,7 @@ static ir_node *add_to_keep(ir_node *last_keep, return last_keep; } -static void add_missing_keep_walker(ir_node *node, void *data) +void be_add_missing_keeps_node(ir_node *node) { int n_outs, i; unsigned *found_projs; @@ -419,7 +419,7 @@ static void add_missing_keep_walker(ir_node *node, void *data) ir_mode *mode = get_irn_mode(node); ir_node *last_keep; ir_node **existing_projs; - (void) data; + if (mode != mode_T) { if (!has_real_user(node)) { const arch_register_req_t *req = arch_get_irn_register_req(node); @@ -483,6 +483,12 @@ static void add_missing_keep_walker(ir_node *node, void *data) } } +static void add_missing_keep_walker(ir_node *node, void *data) +{ + (void)data; + be_add_missing_keeps_node(node); +} + void be_add_missing_keeps(ir_graph *irg) { irg_walk_graph(irg, add_missing_keep_walker, NULL, NULL); diff --git a/ir/be/beabihelper.h b/ir/be/beabihelper.h index b5441eb7c..693e7a13a 100644 --- a/ir/be/beabihelper.h +++ b/ir/be/beabihelper.h @@ -113,6 +113,11 @@ ir_node *be_epilog_create_return(beabi_helper_env_t *env, dbg_info *dbgi, */ void be_add_missing_keeps(ir_graph *irg); +/** + * Make sure all outputs of a node are used, add keeps otherwise + */ +void be_add_missing_keeps_node(ir_node *node); + /** * In the normal firm representation some nodes like pure calls, builtins * have no memory inputs+outputs. However in the backend these sometimes have to diff --git a/ir/be/beflags.c b/ir/be/beflags.c index 4d010ddf7..40282aee6 100644 --- a/ir/be/beflags.c +++ b/ir/be/beflags.c @@ -54,6 +54,7 @@ #include "besched.h" #include "benode.h" #include "belive.h" +#include "beabihelper.h" static const arch_register_class_t *flag_class; static const arch_register_t *flags_reg; @@ -161,6 +162,7 @@ static void rematerialize_or_move(ir_node *flags_needed, ir_node *node, if (get_irn_mode(copy) == mode_T) { ir_mode *mode = flag_class->mode; value = new_rd_Proj(NULL, copy, mode, pn); + be_add_missing_keeps_node(copy); } else { value = copy; } -- 2.20.1