This is the mail archive of the
mailing list for the GCC project.
Re: [wide-int] Fix mode choice in convert_modes
- From: Kenneth Zadeck <zadeck at naturalbridge dot com>
- To: gcc-patches at gcc dot gnu dot org, mikestump at comcast dot net, rdsandiford at googlemail dot com
- Date: Wed, 18 Sep 2013 07:12:27 -0400
- Subject: Re: [wide-int] Fix mode choice in convert_modes
- Authentication-results: sourceware.org; auth=none
- References: <871u4ygmwq dot fsf at talisman dot default> <87a9jaio84 dot fsf at talisman dot default>
this is fine with me.
On 09/18/2013 03:27 AM, Richard Sandiford wrote:
Richard Sandiford <firstname.lastname@example.org> writes:
Enabling the CONST_INT assert showed that this branch-local code was
passing the wrong mode to std::make_pair. The mode of X is OLDMODE,
and we're supposed to be converting it to MODE.
In the case where OLDMODE is VOIDmode, I think we have to assume
that every bit of the input is significant.
Tested on x86_64-linux-gnu. OK to install?
This and the other patches that I just committed to trunk are enough
for a bootstrap and regression test to pass on x86_64-linux-gnu with
the assertion for a canonical CONST_INT enabled. I think it would be
better to leave the assertion out until after the merge though,
so we can deal with any fallout separately.
--- gcc/expr.c 2013-09-09 11:32:33.734617409 +0100
+++ gcc/expr.c 2013-09-09 11:45:27.381001353 +0100
@@ -714,13 +714,14 @@ convert_modes (enum machine_mode mode, e
&& GET_MODE_CLASS (mode) == MODE_INT
&& (oldmode == VOIDmode || GET_MODE_CLASS (oldmode) == MODE_INT))
- wide_int w = std::make_pair (x, mode);
/* If the caller did not tell us the old mode, then there is
- not much to do with respect to canonization. */
- if (oldmode != VOIDmode
- && GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (oldmode))
- w = wi::ext (w, GET_MODE_PRECISION (oldmode),
- unsignedp ? UNSIGNED : SIGNED);
+ not much to do with respect to canonization. We have to assume
+ that all the bits are significant. */
+ if (oldmode == VOIDmode)
+ oldmode = MAX_MODE_INT;
+ wide_int w = wide_int::from (std::make_pair (x, oldmode),
+ GET_MODE_PRECISION (mode),
+ unsignedp ? UNSIGNED : SIGNED);
return immed_wide_int_const (w, mode);