re PR middle-end/5877 (negative offset to array index leads to inefficient code)
authorJakub Jelinek <jakub@redhat.com>
Sat, 9 Mar 2002 13:23:44 +0000 (14:23 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 9 Mar 2002 13:23:44 +0000 (14:23 +0100)
PR middle-end/5877
* expr.c (highest_pow2_factor): Check TREE_INT_CST_LOW
even for non-representable constants.

From-SVN: r50495

gcc/ChangeLog
gcc/expr.c

index 559ab4f4fb1b1177c845399b3d6f1df7164f4d5c..9f329be7ede43a49c3be217eb07fa4b9d4cec8d8 100644 (file)
@@ -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.
index caf5a75f8ea246fcab4b8530ae4f758ab157dd8a..ac756432f20be533d25cbf55f0973ca3fcdfc8a4 100644 (file)
@@ -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;