[Issue 24822] New: When passing a non-POD argument to an rvalue parameter, an unnecessary blit is done
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Oct 20 22:59:04 UTC 2024
https://issues.dlang.org/show_bug.cgi?id=24822
Issue ID: 24822
Summary: When passing a non-POD argument to an rvalue
parameter, an unnecessary blit is done
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: bugzilla at digitalmars.com
Consider:
struct S {
int i;
this(ref S);
void opAssign(S s) { i = s.i + 1; }
}
void test() {
S s;
S t;
t = s; // call to opAssign
}
The generated code for test() is:
0000: 55 push RBP
0001: 48 8B EC mov RBP,RSP
0004: 48 83 EC 10 sub RSP,010h
0008: 31 C0 xor EAX,EAX
000a: 89 45 F0 mov -010h[RBP],EAX
000d: 89 45 F4 mov -0Ch[RBP],EAX
0010: 89 45 F8 mov -8[RBP],EAX
0013: 48 8D 75 F0 lea RSI,-010h[RBP]
0017: 48 8D 7D F8 lea RDI,-8[RBP]
001b: E8 00 00 00 00 call __ctor
0020: 48 8D 75 F8 lea RSI,-8[RBP]
0024: 48 8D 7D FC lea RDI,-4[RBP]
0028: A5 movsd // blit copy, should not be here
0029: 48 8D 75 FC lea RSI,-4[RBP]
002d: 48 8D 7D F4 lea RDI,-0Ch[RBP]
0031: E8 00 00 00 00 call L0
0036: C9 leave
0037: C3 ret
The blit copy is redundant and should not be generated.
--
More information about the Digitalmars-d-bugs
mailing list