On Thu, 7 Dec 2023, Jakub Jelinek wrote: > On Thu, Dec 07, 2023 at 09:36:22AM +0100, Jakub Jelinek wrote: > > So, one way to fix the LRA issue would be just to use > > lra_insn_recog_data_len = index * 3U / 2; > > if (lra_insn_recog_data_len <= index) > > lra_insn_recog_data_len = index + 1; > > basically do what vec.cc does. I thought we can do better for > > both vec.cc and LRA on 64-bit hosts even without growing the allocated > > counters, but now that I look at it again, perhaps we can't. > > The above overflows already with original alloc or lra_insn_recog_data_len > > 0x55555556, where 0x5555555 * 3U / 2 is still 0x7fffffff > > and so representable in the 32-bit, but 0x55555556 * 3U / 2 is > > 1. I thought (and the patch implements it) that we could use > > alloc * (size_t) 3 / 2 so that on 64-bit hosts it wouldn't overflow > > that quickly, but 0x55555556 * (size_t) 3 / 2 there is 0x80000001 > > which is still ok in unsigned, but given that vec.h then stores the > > counter into unsigned m_alloc:31; bit-field, it is too much. > > > > The patch below is what I've actually bootstrapped/regtested on > > x86_64-linux and i686-linux, but given the above I think I should drop > > the vec.cc hunk and change (size_t) 3 in the LRA hunk to 3U. > > Here is so far untested adjusted patch, which does the computation > just in unsigned int rather than size_t, because doing it in size_t > wouldn't improve things.
OK, but ... > 2023-12-07 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/112411 > * params.opt (-param=min-nondebug-insn-uid=): Add > IntegerRange(0, 1073741824). > * lra.cc (check_and_expand_insn_recog_data): Use 3U rather than 3 > in * 3 / 2 computation and if the result is smaller or equal to > index, use index + 1. > > * gcc.dg/params/blocksort-part.c: Add dg-skip-if for > --param min-nondebug-insn-uid=1073741824. what's this change for? Do we test the actual param limit? Can you skip for the param without specifying the actual upper bound? Thanks, Richard. > --- gcc/params.opt.jj 2023-11-02 07:49:18.010852541 +0100 > +++ gcc/params.opt 2023-12-06 18:55:57.045420935 +0100 > @@ -779,7 +779,7 @@ Common Joined UInteger Var(param_min_loo > The minimum threshold for probability of semi-invariant condition statement > to trigger loop split. > > -param=min-nondebug-insn-uid= > -Common Joined UInteger Var(param_min_nondebug_insn_uid) Param > +Common Joined UInteger Var(param_min_nondebug_insn_uid) Param > IntegerRange(0, 1073741824) > The minimum UID to be used for a nondebug insn. > > -param=min-size-for-stack-sharing= > --- gcc/lra.cc.jj 2023-12-05 13:17:29.642260866 +0100 > +++ gcc/lra.cc 2023-12-06 19:52:01.759241999 +0100 > @@ -768,7 +768,9 @@ check_and_expand_insn_recog_data (int in > if (lra_insn_recog_data_len > index) > return; > old = lra_insn_recog_data_len; > - lra_insn_recog_data_len = index * 3 / 2 + 1; > + lra_insn_recog_data_len = index * 3U / 2; > + if (lra_insn_recog_data_len <= index) > + lra_insn_recog_data_len = index + 1; > lra_insn_recog_data = XRESIZEVEC (lra_insn_recog_data_t, > lra_insn_recog_data, > lra_insn_recog_data_len); > --- gcc/testsuite/gcc.dg/params/blocksort-part.c.jj 2020-01-12 > 11:54:37.463397567 +0100 > +++ gcc/testsuite/gcc.dg/params/blocksort-part.c 2023-12-07 > 08:46:11.656974144 +0100 > @@ -1,4 +1,5 @@ > /* { dg-skip-if "AArch64 does not support these bounds." { aarch64*-*-* } { > "--param stack-clash-protection-*" } } */ > +/* { dg-skip-if "For 32-bit hosts such param is too much and even for 64-bit > might require hundreds of GB of RAM" { *-*-* } { "--param > min-nondebug-insn-uid=1073741824" } } */ > > /*-------------------------------------------------------------*/ > /*--- Block sorting machinery ---*/ > > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)