在 2020/1/21 上午9:34, JunMa 写道:
在 2020/1/21 上午12:39, Iain Sandoe 写道:
JunMa <ju...@linux.alibaba.com> wrote:
在 2020/1/20 下午8:21, Iain Sandoe 写道:
JunMa <ju...@linux.alibaba.com> wrote:
在 2020/1/20 下午7:55, Iain Sandoe 写道:
Hi JunMa,
JunMa <ju...@linux.alibaba.com> wrote:
在 2020/1/20 下午6:07, Iain Sandoe 写道:
Hi JunMa,
JunMa <ju...@linux.alibaba.com> wrote:
Hi
Accroding to N4835: When a coroutine is invoked, a copy is
created
for each coroutine parameter. While in current implementation, we
only collect used parameters. This may lost behavior inside
constructor
and destructor of unused parameters.
This patch change the implementation to collect all parameter.
thanks for the patch.
I am not convinced this is the right way to fix this, we do not
want to increase
the size of the coroutine frame unnecessarily. I would like to
check the lifetime
requirements; such copies might only need to be made local to
the ramp function.
Iain
For type with trivial destructor, There is no need to copy
parameter if it is
never referenced after a reachable suspend
point(return-to-caller/resume) in the
coroutine. Since we are in front end, that should be
inital_suspend point. so we
can create field for type with non-trivial destructor first, and
skip unused parameters
in register_param_uses. I'll update the patch
I think that, even if the DTOR is non-trivial, the copy only
needs to be in the stack
frame of the ramp, not in the coroutine frame.
I do think this. It's just need more work on front end.
I think we already did the work, and know the answer (about param
uses in the body), right?
Yes, we may need extra work on copy parameters, I'll do this.
Having discussed this with Nathan (and I’ve also mailed Gor for
clarification). I think it might be
a good idea to wait for those responses before revising (it could be
that your original reading of
the wording is correct, and the clang impl. needs to be updated).
ok, thanks.
The reason why i consider about non-trivial destructors is that if the
destructors are called in ramp
function, actor function may has different status on something. the
testcase I attachted is such
example: it changes global variable in destructor.
Regards
JunMa
Regards
JunMa
thanks
Iain
This is also what clang does for -O>0 (although it makes a frame
copy at O0).
Will clarify this (perhaps the wording could be slightly more
specfic).
No, clang build frame in middle end. In FE, it just generate local
variable to do the copy, and let the middle end to
do the optimization which can see more opportunity.
Yes, i understand that clang does this in the ME not in the FE but,
so long as the principle is correct, it is equivalent for GCC to do
this in the FE.
Yes, just less situation we can handle, that's why we still need
coroutine frame reduction pass.
Regards
JunMa
thanks
Iain
Regards
JunMa
thanks
Iain
Regards
JunMa
Bootstrap and test on X86_64, is it OK?
Regards
JunMa
gcc/cp
2020-01-20 Jun Ma <ju...@linux.alibaba.com>
* coroutines.cc (build_actor_fn): Skip rewrite when
there is no
param references.
(register_param_uses): Only collect param references
here.
(morph_fn_to_coro): Create coroutine frame field for
each
function params.
gcc/testsuite
2020-01-20 Jun Ma <ju...@linux.alibaba.com>
* g++.dg/coroutines/torture/func-params-07.C: New test.
<0001-Fix-issue-when-copy-function-parameters-into-corouti.patch>