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 <ja...@redhat.com> > > * 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