https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94957
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org,
| |jason at gcc dot gnu.org,
| |mpolacek at gcc dot gnu.org
Version|unknown |9.0
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Seems var-tracking, we end up with -O2 -g with main containing just debug
stmts,
# DEBUG BEGIN_STMT
# DEBUG thisD.212422 => NULL
# DEBUG thisD.212423 => NULL
# DEBUG thisD.212424 => NULL
...
# DEBUG thisD.242421 => NULL
# DEBUG thisD.212421 => NULL
return 0;
for those 30000 this pointers of the ctor, and var-tracking is quite slow on
that indeed.
Though, code-generation-wise, I think that for these larger arrays we shouldn't
emit
_1 = &this->array[0];
MyObject::MyObject (_1);
_2 = &this->array[1];
MyObject::MyObject (_2);
_3 = &this->array[2];
MyObject::MyObject (_3);
...
_29997 = &this->array[29996];
MyObject::MyObject (_29997);
_29998 = &this->array[29997];
MyObject::MyObject (_29998);
_29999 = &this->array[29998];
MyObject::MyObject (_29999);
_30000 = &this->array[29999];
MyObject::MyObject (_30000);
but instead just a loop over the array elts initializing them, because e.g. if
everything doesn't get inlined, it will be much shorter.