This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[wide-int] A few assorted simplifications
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: zadeck at naturalbridge dot com, mikestump at comcast dot net
- Date: Sat, 09 Nov 2013 10:03:42 +0000
- Subject: [wide-int] A few assorted simplifications
- Authentication-results: sourceware.org; auth=none
These changes don't have much in common except being simplifications.
Note that "len == 0" isn't possible now that we've eliminated the
0-precision case. "val = val" should be redundant.
Tested on powerpc64-linux-gnu and by rerunning the assembly comparison.
OK to install?
Richard
Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c 2013-11-09 09:39:17.841740772 +0000
+++ gcc/expmed.c 2013-11-09 09:39:27.370805176 +0000
@@ -3652,7 +3652,7 @@ expand_smod_pow2 (enum machine_mode mode
modulus. By including the signbit in the operation, many targets
can avoid an explicit compare operation in the following comparison
against zero. */
- wide_int mask = wi::mask (logd, false, GET_MODE_PRECISION (mode));
+ wide_int mask = wi::mask (logd, false, prec);
mask = wi::set_bit (mask, prec - 1);
temp = expand_binop (mode, and_optab, op0,
@@ -3667,7 +3667,7 @@ expand_smod_pow2 (enum machine_mode mode
temp = expand_binop (mode, sub_optab, result, const1_rtx, result,
0, OPTAB_LIB_WIDEN);
- mask = wi::mask (logd, true, GET_MODE_PRECISION (mode));
+ mask = wi::mask (logd, true, prec);
temp = expand_binop (mode, ior_optab, temp,
immed_wide_int_const (mask, mode),
result, 1, OPTAB_LIB_WIDEN);
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c 2013-11-09 09:39:26.729800844 +0000
+++ gcc/fold-const.c 2013-11-09 09:39:27.373805197 +0000
@@ -7175,8 +7175,7 @@ fold_plusminus_mult_expr (location_t loc
arg10 = build_one_cst (type);
/* As we canonicalize A - 2 to A + -2 get rid of that sign for
the purpose of this canonicalization. */
- if (TYPE_SIGN (TREE_TYPE (arg1)) == SIGNED
- && wi::neg_p (arg1)
+ if (wi::neg_p (arg1, TYPE_SIGN (TREE_TYPE (arg1)))
&& negate_expr_p (arg1)
&& code == PLUS_EXPR)
{
Index: gcc/real.c
===================================================================
--- gcc/real.c 2013-11-09 09:39:26.732800864 +0000
+++ gcc/real.c 2013-11-09 09:39:27.373805197 +0000
@@ -1422,7 +1422,7 @@ real_to_integer (const REAL_VALUE_TYPE *
words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
- for (int i = 0; i < 2 * MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT; i++)
+ for (unsigned int i = 0; i < ARRAY_SIZE (val); i++)
val[i] = 0;
#if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
@@ -2205,16 +2205,11 @@ real_from_integer (REAL_VALUE_TYPE *r, e
r->cl = rvc_normal;
r->sign = wi::neg_p (val_in, sgn);
- if (len == 0)
- len = 1;
-
/* We have to ensure we can negate the largest negative number. */
wide_int val = wide_int::from (val_in, maxbitlen, sgn);
if (r->sign)
val = -val;
- else
- val = val;
/* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
won't work with precisions that are not a multiple of