From 577e990a5c85673d69ff5eee46d438be2bf50f44 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 4 Sep 2008 08:42:11 +0000 Subject: [PATCH] fix the reload folding mode stuff in a more correct way [r21685] --- ir/be/ia32/bearch_ia32.c | 18 ++++++++++++++++-- ir/be/ia32/ia32_new_nodes.c | 13 +++++++++++++ ir/be/ia32/ia32_new_nodes.h | 3 +++ ir/be/ia32/ia32_nodes_attr.h | 1 + 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 5923ae9a9..1db15bf5b 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -839,6 +839,9 @@ static int ia32_possible_memory_operand(const ir_node *irn, unsigned int i) { static void ia32_perform_memory_operand(ir_node *irn, ir_node *spill, unsigned int i) { + ir_mode *load_mode; + ir_mode *dest_op_mode; + ia32_code_gen_t *cg = ia32_current_cg; assert(ia32_possible_memory_operand(irn, i) && "Cannot perform memory operand change"); @@ -848,13 +851,19 @@ static void ia32_perform_memory_operand(ir_node *irn, ir_node *spill, } set_ia32_op_type(irn, ia32_AddrModeS); - set_ia32_ls_mode(irn, get_irn_mode(get_irn_n(irn, i))); + + load_mode = get_irn_mode(get_irn_n(irn, i)); + dest_op_mode = get_ia32_ls_mode(irn); + if (get_mode_size_bits(load_mode) <= get_mode_size_bits(dest_op_mode)) { + set_ia32_ls_mode(irn, load_mode); + } set_ia32_use_frame(irn); set_ia32_need_stackent(irn); set_irn_n(irn, n_ia32_base, get_irg_frame(get_irn_irg(irn))); set_irn_n(irn, n_ia32_binary_right, ia32_get_admissible_noreg(cg, irn, n_ia32_binary_right)); set_irn_n(irn, n_ia32_mem, spill); + set_ia32_is_reload(irn); /* immediates are only allowed on the right side */ if (i == n_ia32_binary_left && is_ia32_Immediate(get_irn_n(irn, n_ia32_binary_left))) { @@ -1425,7 +1434,11 @@ static void ia32_collect_frame_entity_nodes(ir_node *node, void *data) if (is_ia32_need_stackent(node) || is_ia32_Load(node)) { const ir_mode *mode = get_ia32_ls_mode(node); const ia32_attr_t *attr = get_ia32_attr_const(node); - int align = get_mode_size_bytes(mode); + int align; + + if (is_ia32_is_reload(node)) { + mode = get_spill_mode_mode(mode); + } if(attr->data.need_64bit_stackent) { mode = mode_Ls; @@ -1433,6 +1446,7 @@ static void ia32_collect_frame_entity_nodes(ir_node *node, void *data) if(attr->data.need_32bit_stackent) { mode = mode_Is; } + align = get_mode_size_bytes(mode); be_node_needs_frame_entity(env, node, mode, align); } else if (is_ia32_vfild(node) || is_ia32_xLoad(node) || is_ia32_vfld(node)) { diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index ba8546f23..27caa2ffa 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -310,6 +310,9 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { /* need stackent */ fprintf(F, "need stackent = %d\n", is_ia32_need_stackent(n)); + /* need stackent */ + fprintf(F, "is reload = %d\n", is_ia32_is_reload(n)); + /* dump latency */ fprintf(F, "latency = %d\n", get_ia32_latency(n)); @@ -660,6 +663,16 @@ int is_ia32_need_stackent(const ir_node *node) { return attr->data.need_stackent; } +void set_ia32_is_reload(ir_node *node) { + ia32_attr_t *attr = get_ia32_attr(node); + attr->data.is_reload = 1; +} + +int is_ia32_is_reload(const ir_node *node) { + const ia32_attr_t *attr = get_ia32_attr_const(node); + return attr->data.is_reload; +} + /** * Gets the mode of the stored/loaded value (only set for Store/Load) */ diff --git a/ir/be/ia32/ia32_new_nodes.h b/ir/be/ia32/ia32_new_nodes.h index 44758a2c4..f29327455 100644 --- a/ir/be/ia32/ia32_new_nodes.h +++ b/ir/be/ia32/ia32_new_nodes.h @@ -212,6 +212,9 @@ void clear_ia32_need_stackent(ir_node *node); */ int is_ia32_need_stackent(const ir_node *node); +void set_ia32_is_reload(ir_node *node); +int is_ia32_is_reload(const ir_node *node); + /** * Gets the mode of the stored/loaded value (only set for Store/Load) */ diff --git a/ir/be/ia32/ia32_nodes_attr.h b/ir/be/ia32/ia32_nodes_attr.h index 199af9a8c..04a6a4c22 100644 --- a/ir/be/ia32/ia32_nodes_attr.h +++ b/ir/be/ia32/ia32_nodes_attr.h @@ -117,6 +117,7 @@ struct ia32_attr_t { unsigned ins_permuted : 1; /**< inputs of node have been permuted (for commutative nodes) */ unsigned cmp_unsigned : 1; /**< compare should be unsigned */ + unsigned is_reload : 1; /**< node performs a reload */ } data; int *out_flags; /**< flags for each produced value */ -- 2.20.1