From: Christoph Mallon Date: Wed, 12 Nov 2008 14:17:50 +0000 (+0000) Subject: Handle more general case: The right hand side of an And does not need to be an Immedi... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=0b3cd5a76675b8c26079edf1244e4e7c01fc36b7;p=libfirm 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] --- 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: {