diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-03-09 14:23:44 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-03-09 14:23:44 +0100 |
commit | e0f1be5c98090d91902b81bc6312826c7f75f1bb (patch) | |
tree | 602734e5c5384bcc6fc202050ea1b94e3e0d3aa6 /gcc | |
parent | 93fe8e9229a808d836553dcbe49104f97bdecb96 (diff) | |
download | gcc-e0f1be5c98090d91902b81bc6312826c7f75f1bb.zip gcc-e0f1be5c98090d91902b81bc6312826c7f75f1bb.tar.gz gcc-e0f1be5c98090d91902b81bc6312826c7f75f1bb.tar.bz2 |
re PR middle-end/5877 (negative offset to array index leads to inefficient code)
PR middle-end/5877
* expr.c (highest_pow2_factor): Check TREE_INT_CST_LOW
even for non-representable constants.
From-SVN: r50495
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 23 |
2 files changed, 18 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 559ab4f..9f329be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-03-09 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/5877 + * expr.c (highest_pow2_factor): Check TREE_INT_CST_LOW + even for non-representable constants. + Sat Mar 9 07:20:01 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * emit-rtl.c (copy_most_rtx): Accept EXPR_LIST for may_share. @@ -5827,20 +5827,21 @@ highest_pow2_factor (exp) switch (TREE_CODE (exp)) { case INTEGER_CST: - /* If the integer is expressable in a HOST_WIDE_INT, we can find the - lowest bit that's a one. If the result is zero, return - BIGGEST_ALIGNMENT. We need to handle this case since we can find it - in a COND_EXPR, a MIN_EXPR, or a MAX_EXPR. If the constant overlows, - we have an erroneous program, so return BIGGEST_ALIGNMENT to avoid any + /* We can find the lowest bit that's a one. If the low + HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT. + We need to handle this case since we can find it in a COND_EXPR, + a MIN_EXPR, or a MAX_EXPR. If the constant overlows, we have an + erroneous program, so return BIGGEST_ALIGNMENT to avoid any later ICE. */ - if (TREE_CONSTANT_OVERFLOW (exp) - || integer_zerop (exp)) + if (TREE_CONSTANT_OVERFLOW (exp)) return BIGGEST_ALIGNMENT; - else if (host_integerp (exp, 0)) + else { - c0 = tree_low_cst (exp, 0); - c0 = c0 < 0 ? - c0 : c0; - return c0 & -c0; + /* Note: tree_low_cst is intentionally not used here, + we don't care about the upper bits. */ + c0 = TREE_INT_CST_LOW (exp); + c0 &= -c0; + return c0 ? c0 : BIGGEST_ALIGNMENT; } break; |