The patch goes for (1) but (2) seems better to me, for a few reasons:
* As above, constants coming from rtl are already in the right form,
so if you create a wide_int from an rtx and only query it, no explicit
extension is needed.
* Things like logical operations and right shifts naturally preserve
the sign-extended form, so only a subset of write operations need
to take special measures.
right now the internals of wide-int do not keep the bits above the
precision clean. as you point out this could be fixed by changing
lshift, add, sub, mul, div (and anything else i have forgotten about)
and removing the code that cleans this up on exit. I actually do not
really care which way we go here but if we do go on keeping the bits
clean above the precision inside wide-int, we are going to have to clean
the bits in the constructors from rtl, or fix some/a lot of bugs.
But if you want to go with the stay clean plan you have to start clean,
so at the rtl level this means copying. and it is the not copying trick
that pushed me in the direction we went.
At the tree level, this is not an issue. There are no constructors for
tree-csts that do not have a type and before we copy the rep from the
wide-int to the tree, we clean the top bits. (BTW - If i had to guess
what the bug is with the missing messages on the mips port, it would be
because the front ends HAD a bad habit of creating constants that did
not fit into a type and then later checking to see if there were any
interesting bits above the precision in the int-cst. This now does not
work because we clean out those top bits on construction but it would
not surprise me if we missed the fixed point constant path.) So at the
tree level, we could easily go either way here, but there is a cost at
the rtl level with doing (2).
TBH, I think we should do (2) and fix whatever bugs you saw with invalid
rtx constants.
luckily (or perhaps unluckily) if you try the test it fails pretty
quickly - building gcclib on the x86-64. I have enclosed a patch to
check this. you can try it your self and see if you really think this
is right path.
good luck, i fear you may need it.
on the other hand, if it is just a few quick bugs, then i will agree
that (2) is right path.
kenny
Index: gcc/wide-int.cc
===================================================================
--- gcc/wide-int.cc (revision 201968)
+++ gcc/wide-int.cc (working copy)
@@ -171,6 +171,10 @@ wide_int_ro::from_rtx (const rtx_mode_t
case CONST_INT:
result.val[0] = INTVAL (x);
result.len = 1;
+
+ if (prec != HOST_BITS_PER_WIDE_INT)
+ gcc_assert (result.val[0] == sext_hwi (result.val[0], prec));
+
#ifdef DEBUG_WIDE_INT
debug_wh ("wide_int:: %s = from_rtx ("HOST_WIDE_INT_PRINT_HEX")\n",
result, INTVAL (x));