Hi,
On Tue, Apr 15 2025, Jakub Jelinek wrote:
> On Tue, Apr 15, 2025 at 02:17:46PM +0200, Martin Jambor wrote:
>> Hi,
>>
>> On Tue, Apr 15 2025, Jakub Jelinek wrote:
>> > On Mon, Mar 31, 2025 at 03:34:07PM +0200, Martin Jambor wrote:
>> >> This patch just introduces a form of dumping of widest ints that only
>> >> have zeros in the lowest 128 bits so that instead of printing
>> >> thousands of f's the output looks like:
>> >>
>> >> Bits: value = 0xffff, mask = all ones folled by
>> >> 0xffffffffffffffffffffffffffff0000
>> >>
>> >> and then makes sure we use the function not only to print bits but
>> >> also to print masks where values like these can also occur.
>> >
>> > Shouldn't that be followed by instead?
>>
>> Yes, of course.
>>
>> > And the widest_int checks seems to be quite expensive (especially for
>> > large widest_ints), I think for the first one we can just == -1
>> > and for the second one wi::arshift (value, 128) == -1 and the zero
>> > extension
>> > by using wi::zext.
>> >
>> > Anyway, I wonder if it wouldn't be better to use something shorter,
>> > the variant patch uses 0xf..f prefix before the 128-bit hexadecimal
>> > number (maybe we could also special case the even more common bits 64+
>> > are all ones case). Or it could be 0xf*f prefix. Or printing such
>> > numbers as -0x prefixed negative, though that is not a good idea for masks.
>>
>> I was not sure myself what the best way would be and so proposed the
>> simplest variant I could think of. I am fine with anything that does
>> not print thousands of f's which could be the case before.
>>
>> So if you like the second variant more, I and I guess I do as well, by
>> all means go ahead and commit it.
>
> Here is perhaps even better one which doesn't print e.g.
> 0xf..fffffffffffffffffffffffffffff0000
> but just
> 0xf..f0000
> (of course, for say mask of
> 0xf..f0000000000000000000000000000ffff
> it prints it like that, doesn't try to shorten the 0 digits.
> But if the most significant bits aren't set, it will be just
> 0xffff
>
> 2025-04-15 Jakub Jelinek <[email protected]>
>
> * ipa-cp.cc (ipcp_print_widest_int): Print values with all ones in
> bits 128+ with "0xf..f" prefix instead of "all ones folled by ".
> Simplify wide_int check for -1 or all ones above least significant
> 128 bits.
That is great, thank you.
Martin
>
> --- gcc/ipa-cp.cc.jj 2025-04-15 12:22:07.485558525 +0200
> +++ gcc/ipa-cp.cc 2025-04-15 14:12:01.327407951 +0200
> @@ -313,14 +313,24 @@ ipcp_lattice<valtype>::print (FILE * f,
> static void
> ipcp_print_widest_int (FILE *f, const widest_int &value)
> {
> - if (wi::eq_p (wi::bit_not (value), 0))
> + if (value == -1)
> fprintf (f, "-1");
> - else if (wi::eq_p (wi::bit_not (wi::bit_or (value,
> - wi::sub (wi::lshift (1, 128),
> - 1))), 0))
> + else if (wi::arshift (value, 128) == -1)
> {
> - fprintf (f, "all ones folled by ");
> - print_hex (wi::bit_and (value, wi::sub (wi::lshift (1, 128), 1)), f);
> + char buf[35], *p = buf + 2;
> + widest_int v = wi::zext (value, 128);
> + size_t len;
> + print_hex (v, buf);
> + len = strlen (p);
> + if (len == 32)
> + {
> + fprintf (f, "0xf..f");
> + while (*p == 'f')
> + ++p;
> + }
> + else
> + fprintf (f, "0xf..f%0*d", (int) (32 - len), 0);
> + fputs (p, f);
> }
> else
> print_hex (value, f);
>
>
> Jakub