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 <[email protected]>
* 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);
}
}