On Nov 4, 2015, at 4:15 AM, Richard Biener <[email protected]> wrote:
> I wonder if we'll manage to to get mode_for_size return BLKmode
> in case of an original mode that was not of a size multiple of
> HOST_BITS_PER_WIDE_INT (and that's host dependent even…).
> We probably should use smallest_mode_for_size on a precision
> derived from the value
Once we want to go stomping around the value, we might as well just do
everything. I prefer this version over one that has a call to assert. I
thought about creating a helper function, but since there is only 1 client for
it, and since it was only 4 lines, I didn’t create one. I’d propose deferring
creation until we have more clients. The generated dwarf remains fixed, as
expected.
> Please use gcc_checking_assert here.
Done. My test suite run with the assert did finish, and on x86_64 linux, it
was never hit.
Any other issues you can spot?
Index: dwarf2out.c
===================================================================
--- dwarf2out.c (revision 229720)
+++ dwarf2out.c (working copy)
@@ -15593,8 +15593,13 @@
return true;
case CONST_WIDE_INT:
- add_AT_wide (die, DW_AT_const_value,
- std::make_pair (rtl, GET_MODE (rtl)));
+ {
+ wide_int w1 = std::make_pair (rtl, MAX_MODE_INT);
+ int prec = MIN (wi::min_precision (w1, UNSIGNED),
+ (unsigned int)CONST_WIDE_INT_NUNITS (rtl) *
HOST_BITS_PER_WIDE_INT);
+ wide_int w = wide_int::from (w1, prec, UNSIGNED);
+ add_AT_wide (die, DW_AT_const_value, w);
+ }
return true;
case CONST_DOUBLE:
Index: rtl.h
===================================================================
--- rtl.h (revision 229720)
+++ rtl.h (working copy)
@@ -2086,6 +2086,7 @@
inline unsigned int
wi::int_traits <rtx_mode_t>::get_precision (const rtx_mode_t &x)
{
+ gcc_checking_assert (x.second != BLKmode && x.second != VOIDmode);
return GET_MODE_PRECISION (x.second);
}