| UpstreamStatus: Pending |
| |
| When LONG_MIN is passed to val, -val is undefined. This patch fixes |
| it. See for details: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50066 |
| |
| Received this patch from H.J. Lu <hjl.tools@gmail.com> |
| |
| Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com> 2011/12/01 |
| |
| --- gmp-4.3.2/mpf/iset_si.c.ll 2010-01-07 12:09:03.000000000 -0800 |
| +++ gmp-4.3.2/mpf/iset_si.c 2011-11-30 16:42:35.827944358 -0800 |
| @@ -31,7 +31,7 @@ mpf_init_set_si (mpf_ptr r, long int val |
| r->_mp_prec = prec; |
| r->_mp_d = (mp_ptr) (*__gmp_allocate_func) ((prec + 1) * BYTES_PER_MP_LIMB); |
| |
| - vl = (mp_limb_t) (unsigned long int) (val >= 0 ? val : -val); |
| + vl = (mp_limb_t) (val >= 0 ? (unsigned long int) val : -(unsigned long int) val); |
| |
| r->_mp_d[0] = vl & GMP_NUMB_MASK; |
| size = vl != 0; |
| --- gmp-4.3.2/mpf/set_si.c.ll 2010-01-07 12:09:03.000000000 -0800 |
| +++ gmp-4.3.2/mpf/set_si.c 2011-11-30 16:42:47.823878367 -0800 |
| @@ -27,7 +27,7 @@ mpf_set_si (mpf_ptr dest, long val) |
| mp_size_t size; |
| mp_limb_t vl; |
| |
| - vl = (mp_limb_t) (unsigned long int) (val >= 0 ? val : -val); |
| + vl = (mp_limb_t) (val >= 0 ? (unsigned long int) val : -(unsigned long int) val); |
| |
| dest->_mp_d[0] = vl & GMP_NUMB_MASK; |
| size = vl != 0; |
| --- gmp-4.3.2/mpz/cmp_si.c.ll 2010-01-07 12:09:03.000000000 -0800 |
| +++ gmp-4.3.2/mpz/cmp_si.c 2011-11-30 13:44:25.923319700 -0800 |
| @@ -27,7 +27,7 @@ _mpz_cmp_si (mpz_srcptr u, signed long i |
| { |
| mp_size_t usize = u->_mp_size; |
| mp_size_t vsize; |
| - mp_limb_t u_digit; |
| + mp_limb_t u_digit, vl_digit; |
| |
| #if GMP_NAIL_BITS != 0 |
| /* FIXME. This isn't very pretty. */ |
| @@ -41,11 +41,14 @@ _mpz_cmp_si (mpz_srcptr u, signed long i |
| |
| vsize = 0; |
| if (v_digit > 0) |
| - vsize = 1; |
| + { |
| + vsize = 1; |
| + vl_digit = (mp_limb_t) (unsigned long) v_digit; |
| + } |
| else if (v_digit < 0) |
| { |
| vsize = -1; |
| - v_digit = -v_digit; |
| + vl_digit = (mp_limb_t) -(unsigned long) v_digit; |
| } |
| |
| if (usize != vsize) |
| @@ -56,10 +59,10 @@ _mpz_cmp_si (mpz_srcptr u, signed long i |
| |
| u_digit = u->_mp_d[0]; |
| |
| - if (u_digit == (mp_limb_t) (unsigned long) v_digit) |
| + if (u_digit == vl_digit) |
| return 0; |
| |
| - if (u_digit > (mp_limb_t) (unsigned long) v_digit) |
| + if (u_digit > vl_digit) |
| return usize; |
| else |
| return -usize; |
| --- gmp-4.3.2/mpz/iset_si.c.ll 2010-01-07 12:09:03.000000000 -0800 |
| +++ gmp-4.3.2/mpz/iset_si.c 2011-11-30 13:44:25.924319695 -0800 |
| @@ -31,7 +31,7 @@ mpz_init_set_si (mpz_ptr dest, signed lo |
| dest->_mp_alloc = 1; |
| dest->_mp_d = (mp_ptr) (*__gmp_allocate_func) (BYTES_PER_MP_LIMB); |
| |
| - vl = (mp_limb_t) (unsigned long int) (val >= 0 ? val : -val); |
| + vl = (mp_limb_t) (val >= 0 ? (unsigned long int) val : -(unsigned long int) val); |
| |
| dest->_mp_d[0] = vl & GMP_NUMB_MASK; |
| size = vl != 0; |
| --- gmp-4.3.2/mpz/set_si.c.ll 2010-01-07 12:09:03.000000000 -0800 |
| +++ gmp-4.3.2/mpz/set_si.c 2011-11-30 13:44:25.947319574 -0800 |
| @@ -27,7 +27,7 @@ mpz_set_si (mpz_ptr dest, signed long in |
| mp_size_t size; |
| mp_limb_t vl; |
| |
| - vl = (mp_limb_t) (unsigned long int) (val >= 0 ? val : -val); |
| + vl = (mp_limb_t) (val >= 0 ? (unsigned long int) val : -(unsigned long int) val); |
| |
| dest->_mp_d[0] = vl & GMP_NUMB_MASK; |
| size = vl != 0; |