From 0b3cd5a76675b8c26079edf1244e4e7c01fc36b7 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Wed, 12 Nov 2008 14:17:50 +0000 Subject: [PATCH] Handle more general case: The right hand side of an And does not need to be an Immediate to guarantee the upper bits are clean. Any "clean" node on the left or right side will do. [r23589] --- ir/be/ia32/ia32_transform.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index b6ff94ac1..bfd6abe99 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -2674,21 +2674,11 @@ static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode) } case iro_ia32_And: - if (mode_is_signed(mode)) { + if (mode_is_signed(mode)) return false; /* TODO handle signed modes */ - } else { - ir_node *right = get_irn_n(transformed_node, n_ia32_And_right); - if (is_ia32_Immediate(right) || is_ia32_Const(right)) { - const ia32_immediate_attr_t *attr = - get_ia32_immediate_attr_const(right); - if (attr->symconst == 0 && - (unsigned)attr->offset >> get_mode_size_bits(mode) == 0) { - return true; - } - } - /* TODO recurse? */ - return false; - } + return + upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_right), mode) || + upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_left), mode); case iro_ia32_Const: case iro_ia32_Immediate: { -- 2.20.1