public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug other/115581] New: missed argument forwarding in lambda
@ 2024-06-21 13:39 pobrn at protonmail dot com
2024-06-21 17:20 ` [Bug middle-end/115581] could remove copy of struct if original otherwise not used pinskia at gcc dot gnu.org
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: pobrn at protonmail dot com @ 2024-06-21 13:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
Bug ID: 115581
Summary: missed argument forwarding in lambda
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: pobrn at protonmail dot com
Target Milestone: ---
Consider the following piece of C++ code:
```
struct thing {
int x[64];
};
void g(const thing &);
void f1(thing x)
{
g(x);
}
auto *f2 = +[](thing x) {
g(x);
};
struct f3 {
void operator()(thing);
};
void f3::operator()(thing x) {
g(x);
}
```
Checking the generated code on an x86-64 linux system at -O2, note that `f1()`
and `f3::operator()()` simply "forward" their by-value arguments to `g()`:
```
f1(thing):
sub rsp, 8
lea rdi, [rsp+16]
call g(thing const&)
add rsp, 8
ret
```
Notice that this is not done in the case of `f2`, the generated function from
the lambda makes a copy of `x`:
```
f2::{lambda(thing)#1}::_FUN(thing):
sub rsp, 264
movdqu xmm0, XMMWORD PTR [rsp+272]
mov rdi, rsp
movaps XMMWORD PTR [rsp], xmm0
movdqu xmm0, XMMWORD PTR [rsp+288]
[...]
movdqu xmm0, XMMWORD PTR [rsp+512]
movaps XMMWORD PTR [rsp+240], xmm0
call g(thing const&)
add rsp, 264
ret
```
See https://gcc.godbolt.org/z/n43a6MPjY, clang does the same copy, so maybe
there is a rule in C++ that prevents this optimization and that I failed to
consider?
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug middle-end/115581] could remove copy of struct if original otherwise not used
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
@ 2024-06-21 17:20 ` pinskia at gcc dot gnu.org
2024-06-21 17:20 ` pinskia at gcc dot gnu.org
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21 17:20 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Component|other |middle-end
Keywords| |missed-optimization
Summary|missed argument forwarding |could remove copy of struct
|in lambda |if original otherwise not
| |used
Ever confirmed|0 |1
Last reconfirmed| |2024-06-21
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced testcase:
```
struct thing {
int x[64];
};
void g(const thing &);
static inline
void f1(thing x)
{
g(x);
}
void f9(thing x)
{
f1(x);
}
```
Confirmed.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug middle-end/115581] could remove copy of struct if original otherwise not used
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
2024-06-21 17:20 ` [Bug middle-end/115581] could remove copy of struct if original otherwise not used pinskia at gcc dot gnu.org
@ 2024-06-21 17:20 ` pinskia at gcc dot gnu.org
2024-06-21 17:22 ` pinskia at gcc dot gnu.org
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21 17:20 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Severity|normal |enhancement
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug middle-end/115581] could remove copy of struct if original otherwise not used
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
2024-06-21 17:20 ` [Bug middle-end/115581] could remove copy of struct if original otherwise not used pinskia at gcc dot gnu.org
2024-06-21 17:20 ` pinskia at gcc dot gnu.org
@ 2024-06-21 17:22 ` pinskia at gcc dot gnu.org
2024-06-21 18:01 ` pobrn at protonmail dot com
2024-06-21 18:15 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21 17:22 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Note it looks like clang does some front-end optimization for converting the
lambda into a function pointer because my example in comment #1 has the copy
still there for clang/LLVM.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug middle-end/115581] could remove copy of struct if original otherwise not used
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
` (2 preceding siblings ...)
2024-06-21 17:22 ` pinskia at gcc dot gnu.org
@ 2024-06-21 18:01 ` pobrn at protonmail dot com
2024-06-21 18:15 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pobrn at protonmail dot com @ 2024-06-21 18:01 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
--- Comment #3 from Barnabás Pőcze <pobrn at protonmail dot com> ---
Isn't your testcase a bit different? I guess my question is, why does gcc feel
the need to make a local copy of a by-value argument when calling a function
with a reference to it, but seemingly only in a function generated from a
lambda?
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug middle-end/115581] could remove copy of struct if original otherwise not used
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
` (3 preceding siblings ...)
2024-06-21 18:01 ` pobrn at protonmail dot com
@ 2024-06-21 18:15 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21 18:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115581
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Barnabás Pőcze from comment #3)
> Isn't your testcase a bit different? I guess my question is, why does gcc
> feel the need to make a local copy of a by-value argument when calling a
> function with a reference to it, but seemingly only in a function generated
> from a lambda?
No my testcase is exactly what is done when converting a lambda to a function
pointer. That is it creates a function which then calls the lamdba.
Just like this:
```
struct thing {
int x[64];
};
void f10(thing x)
{
auto l = [](thing x) {
g(x);
};
l(x);
}
auto *f13 = f10;
```
Which has still has the extra copy even for clang.
That is why I mentioned that clang seems to have a front-end optimization which
removes the copy when converting the lambda to a function pointer.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-06-21 18:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-21 13:39 [Bug other/115581] New: missed argument forwarding in lambda pobrn at protonmail dot com
2024-06-21 17:20 ` [Bug middle-end/115581] could remove copy of struct if original otherwise not used pinskia at gcc dot gnu.org
2024-06-21 17:20 ` pinskia at gcc dot gnu.org
2024-06-21 17:22 ` pinskia at gcc dot gnu.org
2024-06-21 18:01 ` pobrn at protonmail dot com
2024-06-21 18:15 ` pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).