Bug 11420 – Inefficient AA value setting

Status
NEW
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-11-02T05:51:21Z
Last change time
2024-12-13T18:13:32Z
Keywords
performance
Assigned to
No Owner
Creator
Kenji Hara
Moved to GitHub: dmd#18706 →

Comments

Comment #0 by k.hara.pg — 2013-11-02T05:51:21Z
This is both dmd and druntime issue. By fixing issue 6178, AA value setting with opAssign behavior has been properly fixed in 2.064. struct S { int val; this(int v) { val = 1; } void opAssign(S) { val = 2; } } void main() { S[int] aa; aa[1] = S(1); // S(1) is moved in the newly allocated AA slot aa[1] = S(2); // opAssign(S1) is called on existing aa[1] value assert(aa.length == 1 && aa[1].val == 2); } But, the generated code is a little inefficient because it would search the given key twice. // aa[1] = S(1); is lowered to: 1 in aa ? aa[1].opAssign(S(1)) : aa[1].__ctor(1); // --> 1 in aa is the first key search. // --> aa[1] is the second key search. To fix the issue, we need to add a new internal function in druntime, and compiler should generate code which uses the function. The new function's spec is: - it takes at least two arguments, the AA and assigned value. - it should return two values, one is the allocated/found slot, and the other is a boolean flag which the returned slot is newly allocated or not.
Comment #1 by robert.schadek — 2024-12-13T18:13:32Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18706 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB