https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117222
Bug ID: 117222
Summary: [15 regression] Missed optimization with with
std::vector resize in loop
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: sjames at gcc dot gnu.org
Target Milestone: ---
Created attachment 59391
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59391&action=edit
test.cxx
Noticed this when looking at PR80641.
At -O3, we do so much better in GCC 14.2 than we do on trunk
(https://godbolt.org/z/6jeoxKxTq).
With 14, we have which is optimal:
```
;; Function main (main, funcdef_no=1275, decl_uid=24945, cgraph_uid=152,
symbol_order=168) (executed once)
int main ()
{
int * _53;
<bb 2> [local count: 114863531]:
_53 = operator new (16);
MEM <uint128_t> [(char * {ref-all})_53] = 0x30000000200000001;
operator delete (_53, 16);
return 0;
}
```
With trunk, we have:
```
;; Function main (main, funcdef_no=1267, decl_uid=24700, cgraph_uid=153,
symbol_order=169) (executed once)
int main ()
{
void * D.28023;
int * _1;
long int _10;
int pretmp_17;
void * _26;
int * _48;
int * _53;
int * _61;
long unsigned int _149;
long unsigned int _156;
<bb 2> [local count: 114863530]:
_53 = operator new (16);
MEM <uint128_t> [(char * {ref-all})_53] = 0x30000000200000001;
_48 = _53 + 16;
goto <bb 4>; [100.00%]
<bb 3> [local count: 906139990]:
pretmp_17 = MEM[(value_type &)_61 + 18446744073709551612];
if (pretmp_17 == 0)
goto <bb 4>; [93.80%]
else
goto <bb 7>; [6.20%]
<bb 4> [local count: 958878295]:
# _1 = PHI <_61(3), _48(2)>
_10 = _1 - _53;
if (_10 == 0)
goto <bb 5>; [33.00%]
else
goto <bb 6>; [67.00%]
<bb 5> [local count: 316429836]:
std::__throw_length_error ("vector::_M_default_append");
<bb 6> [local count: 958878296]:
_156 = (long unsigned int) _10;
_149 = _156 + 18446744073709551612;
_61 = _53 + _149;
if (_53 != _61)
goto <bb 3>; [94.50%]
else
goto <bb 7>; [5.50%]
<bb 7> [local count: 114863531]:
operator delete (_53, 16);
return 0;
<bb 8> [count: 0]:
<L12>:
operator delete (_53, 16);
_26 = __builtin_eh_pointer (6);
__builtin_unwind_resume (_26);
}
```