re PR tree-optimization/49963 (ICE: in abs_hwi, at hwint.c:108)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 18 Aug 2011 11:30:42 +0000 (11:30 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 18 Aug 2011 11:30:42 +0000 (11:30 +0000)
2011-08-18  Paolo Carlini  <paolo.carlini@oracle.com>
    Joseph Myers  <joseph@codesourcery.com>

PR tree-optimization/49963
* hwint.c (absu_hwi): Define.
* hwint.h (absu_hwi): Declare.
* fold-const.c (fold_plusminus_mult_expr): Use absu_hwi instead
of abs_hwi.
* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Likewise.
* tree-ssa-loop-prefetch.c (prune_ref_by_group_reuse): Likewise.

Co-Authored-By: Joseph Myers <joseph@codesourcery.com>
From-SVN: r177848

gcc/ChangeLog
gcc/fold-const.c
gcc/hwint.c
gcc/hwint.h
gcc/tree-ssa-loop-prefetch.c
gcc/tree-ssa-math-opts.c

index 8e768f8538ab0a3410ed218b4af5671eb5129b75..c46e1ee08b31b794dcd57554a3477d4d0276fd62 100644 (file)
@@ -1,3 +1,14 @@
+2011-08-18  Paolo Carlini  <paolo.carlini@oracle.com>
+           Joseph Myers  <joseph@codesourcery.com>
+
+       PR tree-optimization/49963
+       * hwint.c (absu_hwi): Define.
+       * hwint.h (absu_hwi): Declare.
+       * fold-const.c (fold_plusminus_mult_expr): Use absu_hwi instead
+       of abs_hwi.
+       * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Likewise.
+       * tree-ssa-loop-prefetch.c (prune_ref_by_group_reuse): Likewise.
+
 2011-08-18  Richard Guenther  <rguenther@suse.de>
 
        * expr.c (get_inner_reference): Sign-extend the constant
index a73b1e6a9bafa240a47fd05b2d0f0dfc19a4cc40..dcd6989b285522e50603334e9c6a5fc7eed7ea20 100644 (file)
@@ -7036,7 +7036,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
       int11 = TREE_INT_CST_LOW (arg11);
 
       /* Move min of absolute values to int11.  */
-      if (abs_hwi (int01) < abs_hwi (int11))
+      if (absu_hwi (int01) < absu_hwi (int11))
         {
          tmp = int01, int01 = int11, int11 = tmp;
          alt0 = arg00, arg00 = arg10, arg10 = alt0;
@@ -7046,7 +7046,7 @@ fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
       else
        maybe_same = arg11;
 
-      if (exact_log2 (abs_hwi (int11)) > 0 && int01 % int11 == 0
+      if (exact_log2 (absu_hwi (int11)) > 0 && int01 % int11 == 0
          /* The remainder should not be a constant, otherwise we
             end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
             increased the number of multiplications necessary.  */
index a128dc134f99672ef2d2f378fe4b5bc0873404c6..533133c7b4db10dabf47f60593538a56753716b7 100644 (file)
@@ -109,6 +109,14 @@ abs_hwi (HOST_WIDE_INT x)
   return x >= 0 ? x : -x;
 }
 
+/* Compute the absolute value of X as an unsigned type.  */
+
+unsigned HOST_WIDE_INT
+absu_hwi (HOST_WIDE_INT x)
+{
+  return x >= 0 ? (unsigned HOST_WIDE_INT)x : -(unsigned HOST_WIDE_INT)x;
+}
+
 /* Compute the greatest common divisor of two numbers A and B using
    Euclid's algorithm.  */
 
index fa77b11234958da5d72a998b61f4dba40ace8370..c8b3c31bfb75908bcd7034d54b41919f61e3165a 100644 (file)
@@ -233,6 +233,7 @@ exact_log2 (unsigned HOST_WIDE_INT x)
 #define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))
 
 extern HOST_WIDE_INT abs_hwi (HOST_WIDE_INT);
+extern unsigned HOST_WIDE_INT absu_hwi (HOST_WIDE_INT);
 extern HOST_WIDE_INT gcd (HOST_WIDE_INT, HOST_WIDE_INT);
 extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
 extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
index 82634cce078f36e3b0d77835e0443a07c50e4560..c5ad1c4765f73c21f9cdbeeb37d18e1936b08bc3 100644 (file)
@@ -795,7 +795,7 @@ prune_ref_by_group_reuse (struct mem_ref *ref, struct mem_ref *by,
       prefetch_before = (hit_from - delta_r + step - 1) / step;
 
       /* Do not reduce prefetch_before if we meet beyond cache size.  */
-      if (prefetch_before > (unsigned) abs_hwi (L2_CACHE_SIZE_BYTES / step))
+      if (prefetch_before > absu_hwi (L2_CACHE_SIZE_BYTES / step))
         prefetch_before = PREFETCH_ALL;
       if (prefetch_before < ref->prefetch_before)
        ref->prefetch_before = prefetch_before;
index 63cc175eaddfa0f286c3ecd2aa149d6df713ffd2..db4ec44c3316eb823b01a0456e9691fa5205df9d 100644 (file)
@@ -1231,7 +1231,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
       /* Attempt to fold powi(arg0, abs(n/2)) into multiplies.  If not
          possible or profitable, give up.  Skip the degenerate case when
          n is 1 or -1, where the result is always 1.  */
-      if (abs_hwi (n) != 1)
+      if (absu_hwi (n) != 1)
        {
          powi_x_ndiv2 = gimple_expand_builtin_powi (gsi, loc, arg0,
                                                     abs_hwi (n / 2));
@@ -1243,7 +1243,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
         result of the optimal multiply sequence just calculated.  */
       sqrt_arg0 = build_and_insert_call (gsi, loc, &target, sqrtfn, arg0);
 
-      if (abs_hwi (n) == 1)
+      if (absu_hwi (n) == 1)
        result = sqrt_arg0;
       else
        result = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
@@ -1285,7 +1285,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
       /* Attempt to fold powi(arg0, abs(n/3)) into multiplies.  If not
          possible or profitable, give up.  Skip the degenerate case when
          abs(n) < 3, where the result is always 1.  */
-      if (abs_hwi (n) >= 3)
+      if (absu_hwi (n) >= 3)
        {
          powi_x_ndiv3 = gimple_expand_builtin_powi (gsi, loc, arg0,
                                                     abs_hwi (n / 3));
@@ -1298,14 +1298,14 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
          either cbrt(x) or cbrt(x) * cbrt(x).  */
       cbrt_x = build_and_insert_call (gsi, loc, &target, cbrtfn, arg0);
 
-      if (abs_hwi (n) % 3 == 1)
+      if (absu_hwi (n) % 3 == 1)
        powi_cbrt_x = cbrt_x;
       else
        powi_cbrt_x = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
                                              cbrt_x, cbrt_x);
 
       /* Multiply the two subexpressions, unless powi(x,abs(n)/3) = 1.  */
-      if (abs_hwi (n) < 3)
+      if (absu_hwi (n) < 3)
        result = powi_cbrt_x;
       else
        result = build_and_insert_binop (gsi, loc, target, MULT_EXPR,