Hello, this avoids an error found with bootstrap-ubsan. Regression tested on x86_64-unknown-linux-gnu. OK for trunk?
Mikael
2015-08-05 Mikael Morin <mik...@gcc.gnu.org> * hwint.h (sext_hwi): Rewrite without undefined behaviour on negative SRC.
diff --git a/gcc/hwint.h b/gcc/hwint.h index 3793986..9c3eda0 100644 --- a/gcc/hwint.h +++ b/gcc/hwint.h @@ -246,8 +246,9 @@ sext_hwi (HOST_WIDE_INT src, unsigned int prec) else { gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT); - int shift = HOST_BITS_PER_WIDE_INT - prec; - return (src << shift) >> shift; + HOST_WIDE_INT sign_mask = HOST_WIDE_INT_1 << (prec - 1); + HOST_WIDE_INT value_mask = (HOST_WIDE_INT_1U << prec) - HOST_WIDE_INT_1U; + return (((src & value_mask) ^ sign_mask) - sign_mask); } }