From 5ddb95b789dd1acbc59e04f6771085a544483545 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 3 May 2010 17:27:13 +0000 Subject: [PATCH] small optimisation: we can still skip unsigned/signed convs in AM matching [r27468] --- ir/be/ia32/ia32_transform.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index dc011d044..11c1fc641 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -722,7 +722,7 @@ static int is_downconv(const ir_node *node) get_mode_size_bits(dest_mode) <= get_mode_size_bits(src_mode); } -/* Skip all Down-Conv's on a given node and return the resulting node. */ +/** Skip all Down-Conv's on a given node and return the resulting node. */ ir_node *ia32_skip_downconv(ir_node *node) { while (is_downconv(node)) @@ -731,6 +731,31 @@ ir_node *ia32_skip_downconv(ir_node *node) return node; } +static bool is_sameconv(ir_node *node) +{ + ir_mode *src_mode; + ir_mode *dest_mode; + + if (!is_Conv(node)) + return 0; + + src_mode = get_irn_mode(get_Conv_op(node)); + dest_mode = get_irn_mode(node); + return + ia32_mode_needs_gp_reg(src_mode) && + ia32_mode_needs_gp_reg(dest_mode) && + get_mode_size_bits(dest_mode) == get_mode_size_bits(src_mode); +} + +/** Skip all signedness convs */ +static ir_node *ia32_skip_sameconv(ir_node *node) +{ + while (is_downconv(node)) + node = get_Conv_op(node); + + return node; +} + static ir_node *create_upconv(ir_node *node, ir_node *orig_node) { ir_mode *mode = get_irn_mode(node); @@ -798,6 +823,11 @@ static void match_arguments(ia32_address_mode_t *am, ir_node *block, if (op1 != NULL) { op1 = ia32_skip_downconv(op1); } + } else { + op2 = ia32_skip_sameconv(op2); + if (op1 != NULL) { + op1 = ia32_skip_sameconv(op1); + } } /* match immediates. firm nodes are normalized: constants are always on the -- 2.20.1