On Thu, Feb 6, 2020 at 5:12 PM Iain Sandoe <i...@sandoe.co.uk> wrote: > > Hi JunMa, > > JunMa <ju...@linux.alibaba.com> wrote: > > > 在 2020/2/4 下午8:17, JunMa 写道: > >> Hi > >> When testing coroutines with lambda function, I find we copy each captured > >> variable to frame. However, according to gimplify pass, for each > >> declaration > >> that is an alias for another expression(DECL_VALUE_EXPR), we can > >> substitute them directly. > >> > >> Since lambda captured variables is one of this kind. It is better to > >> replace them > >> rather than copy them, This can reduce frame size (all of the captured > >> variables > >> are field of closure class) and avoid extra copy behavior as well. > >> > >> This patch remove all of the code related to copy captured variable. > >> Instead, we first rewrite DECL_VALUE_EXPR with frame field, then we check > >> every variable whether it has DECL_VALUE_EXPR, and then substitute it, > >> this > >> patch does not create frame field for such variables. > >> > >> Bootstrap and test on X86_64, is it OK? > > > minor update: only handle var_decl when iterate BIND_EXPR_VARS > > in register_local_var_uses. > > Do you have any other local patches applied along with this? > > Testing locally (on Darwin), I see regressions with optimisation O2/O3/Os > e.g: > > class-05-lambda-capture-copy-local.C -O2 (internal compiler error) > class-06-lambda-capture-ref.C -O2 (internal compiler error) > lambda-05-capture-copy-local.C -O2 (internal compiler error) > lambda-06-multi-capture.C -O2 (internal compiler error) > lambda-07-multi-capture.C -O2 (internal compiler error) > lambda-08-co-ret-parm-ref.C -O3 -g (internal compiler error) > > I have applied this to master, and on top of the patches posted by you and > Bin, but the results are the same. Hi Iains,
Thanks for helping. Yes, there will be another patch fixing the O2/O3 issues. Will send it out for review soon. Thanks, bin > > thanks > Iain > > >> gcc/cp > >> 2020-02-04 Jun Ma <ju...@linux.alibaba.com> > >> > >> * coroutines.cc (morph_fn_to_coro): Remove code related to > >> copy captured variable. > >> (register_local_var_uses): Ditto. > >> (register_param_uses): Collect use of parameters inside > >> DECL_VALUE_EXPR. > >> (transform_local_var_uses): Substitute the alias variable > >> with DECL_VALUE_EXPR if it has one. > >> > >> > >> gcc/testsuite > >> 2020-02-04 Jun Ma <ju...@linux.alibaba.com> > >> > >> * g++.dg/coroutines/lambda-07-multi-capture.C: New test. > > > > > > <0001-fix-alias-variable.patch> > >