On Tue, Jul 08, 2025 at 09:43:20PM -0400, Jason Merrill wrote:
Thanks for the review.
Working on the rest (most of it already have in my working copy).

> >       case CLEANUP_POINT_EXPR:
> >         {
> > -   auto_vec<tree, 2> cleanups;
> > +   auto_vec<tree, 4> cleanups;
> 
> What's the rationale for this increase?  It seems costly to increase the
> size of a local variable in cxx_eval_constant_expression given the deep
> recursion.  I think we need a rationale for using any internal storage at
> all in this auto_vec; all full-expressions are wrapped in
> CLEANUP_POINT_EXPR, and only some of them actually have any cleanups.
> 
> Though I don't know for sure whether this actually affects the size of the
> stack frame.

Wanted to reply to this separately.
The rationale was that for C++26 CLEANUP_EH_ONLY will push not 0 but 2 elts
to the vector, so I thought increasing it a little bit would help.
Note, there is
  constexpr_ctx new_ctx;
  tree r = t;

  tree_code tcode = TREE_CODE (t);
  switch (tcode)
...
    case CLEANUP_POINT_EXPR:
      {
        auto_vec<tree, 2> cleanups;
        vec<tree> *prev_cleanups = ctx->global->cleanups;
        ctx->global->cleanups = &cleanups;

        auto_vec<tree, 10> save_exprs;
        constexpr_ctx new_ctx = *ctx;
        new_ctx.save_exprs = &save_exprs;
before this change.
Unpatched trunk needs on x86_64 frame size 0x148,
with auto_vec<tree, 4> that is 0x158, with auto_vec<tree, 0> (aka
auto_vec<tree> 0x138 and with auto_vec<tree, 10> changed to
auto_vec<tree> 0xd8.
Changing
        constexpr_ctx new_ctx = *ctx;
to
        new_ctx = *ctx;
doesn't free anything but is a good idea anyway.

I guess one option is to decrease both auto_vec to 0, another
is outline the CLEANUP_POINT_EXPR to a separate function (and perhaps
use [[gnu::noinline]] on it conditionally).
What do you prefer (though guess it can be done separately and I can
just drop the 2->4 change from the patch)?
And perhaps investigate more how to decrease the frame size further.

        Jakub

Reply via email to