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.
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>