Re: [wide-int] Add more assertions

2014-05-03 Thread Richard Sandiford
Kenneth Zadeck zad...@naturalbridge.com writes:
 These are fine.

Thanks.  I'll hold off applying it until the java fix has been reviewed
(which could be after the merge -- no need to hold it up for this IMO).

Richard


 On 05/02/2014 03:20 PM, Richard Sandiford wrote:
 This patch adds some assertions against sext (.., 0) and zext (..., 0).
 The former is undefined at the sext_hwi level and the latter is disallowed
 for consistency with the former.

 Also, set_bit (rightly IMO) can't handle bit = precision.  For
 precision = HOST_BITS_PER_WIDE_INT it would invoke undefined
 behaviour while for other precisions I think it would crash.
 A case with precision = HOST_BITS_PER_WIDE_INT showed up in java
 (fix posted separately).

 Tested on x86_64-linux-gnu and powerpc64-linux-gnu.  OK to install?

 Thanks,
 Richard


 Index: gcc/wide-int.h
 ===
 --- gcc/wide-int.h   2014-05-02 16:28:09.561842842 +0100
 +++ gcc/wide-int.h   2014-05-02 16:44:04.015463718 +0100
 @@ -2046,6 +2046,8 @@ wi::sext (const T x, unsigned int offse
 unsigned int precision = get_precision (result);
 WIDE_INT_REF_FOR (T) xi (x, precision);
   
 +  gcc_checking_assert (offset != 0);
 +
 if (offset = HOST_BITS_PER_WIDE_INT)
   {
 val[0] = sext_hwi (xi.ulow (), offset);
 @@ -2065,6 +2067,8 @@ wi::zext (const T x, unsigned int offse
 unsigned int precision = get_precision (result);
 WIDE_INT_REF_FOR (T) xi (x, precision);
   
 +  gcc_checking_assert (offset != 0);
 +
 /* This is not just an optimization, it is actually required to
maintain canonization.  */
 if (offset = precision)
 @@ -2102,6 +2106,9 @@ wi::set_bit (const T x, unsigned int bi
 WI_UNARY_RESULT_VAR (result, val, T, x);
 unsigned int precision = get_precision (result);
 WIDE_INT_REF_FOR (T) xi (x, precision);
 +
 +  gcc_checking_assert (bit  precision);
 +
 if (precision = HOST_BITS_PER_WIDE_INT)
   {
 val[0] = xi.ulow () | ((unsigned HOST_WIDE_INT) 1  bit);


Re: [wide-int] Add more assertions

2014-05-02 Thread Kenneth Zadeck

These are fine.

On 05/02/2014 03:20 PM, Richard Sandiford wrote:

This patch adds some assertions against sext (.., 0) and zext (..., 0).
The former is undefined at the sext_hwi level and the latter is disallowed
for consistency with the former.

Also, set_bit (rightly IMO) can't handle bit = precision.  For
precision = HOST_BITS_PER_WIDE_INT it would invoke undefined
behaviour while for other precisions I think it would crash.
A case with precision = HOST_BITS_PER_WIDE_INT showed up in java
(fix posted separately).

Tested on x86_64-linux-gnu and powerpc64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/wide-int.h
===
--- gcc/wide-int.h  2014-05-02 16:28:09.561842842 +0100
+++ gcc/wide-int.h  2014-05-02 16:44:04.015463718 +0100
@@ -2046,6 +2046,8 @@ wi::sext (const T x, unsigned int offse
unsigned int precision = get_precision (result);
WIDE_INT_REF_FOR (T) xi (x, precision);
  
+  gcc_checking_assert (offset != 0);

+
if (offset = HOST_BITS_PER_WIDE_INT)
  {
val[0] = sext_hwi (xi.ulow (), offset);
@@ -2065,6 +2067,8 @@ wi::zext (const T x, unsigned int offse
unsigned int precision = get_precision (result);
WIDE_INT_REF_FOR (T) xi (x, precision);
  
+  gcc_checking_assert (offset != 0);

+
/* This is not just an optimization, it is actually required to
   maintain canonization.  */
if (offset = precision)
@@ -2102,6 +2106,9 @@ wi::set_bit (const T x, unsigned int bi
WI_UNARY_RESULT_VAR (result, val, T, x);
unsigned int precision = get_precision (result);
WIDE_INT_REF_FOR (T) xi (x, precision);
+
+  gcc_checking_assert (bit  precision);
+
if (precision = HOST_BITS_PER_WIDE_INT)
  {
val[0] = xi.ulow () | ((unsigned HOST_WIDE_INT) 1  bit);