https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121962
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Actually looks like there is an infinite loop:
Simplified
RoundingAlignment = MEM[(const struct CharUnits &)this_22(D) + 32];
after previous
this_22(D)->Alignment = MEM[(const struct CharUnits &)this_22(D) + 32];
into
RoundingAlignment = MEM[(const struct CharUnits &)this_22(D) + 32];
Simplified
RoundingAlignment = MEM[(const struct CharUnits &)this_22(D) + 32];
after previous
this_22(D)->Alignment = MEM[(const struct CharUnits &)this_22(D) + 32];
into
RoundingAlignment = MEM[(const struct CharUnits &)this_22(D) + 32];
The problem is now:
/* If the new store is `src2 = src2;` skip over it. */
if (operand_equal_p (src2, dest2, 0))
return false;
And
/* If the statement is `src = src;` then ignore it. */
if (operand_equal_p (dest, src, 0))
return false;
Is not decent enough to detect that.
It comes from originally:
```
_3 = &this_38(D)->RequiredAlignment;
_4 = &this_38(D)->Alignment;
_47 = MEM[(const struct CharUnits *)this_38(D) + 32B].Quantity;
_45 = MEM[(const struct CharUnits &)this_38(D) + 48].Quantity;
if (_45 > _47)
goto <bb 4>; [34.00%]
else
goto <bb 5>; [66.00%]
<bb 4> :
<bb 5> :
# _42 = PHI <_4(3), _3(4)>
this_38(D)->Alignment = *_42;
RoundingAlignment = *_42;
```
phiprop1 then does:
```
<bb 3> :
_3 = &this_38(D)->RequiredAlignment;
_4 = &this_38(D)->Alignment;
_47 = MEM[(const struct CharUnits *)this_38(D) + 32B].Quantity;
_45 = MEM[(const struct CharUnits &)this_38(D) + 48].Quantity;
if (_45 > _47)
goto <bb 4>; [34.00%]
else
goto <bb 24>; [66.00%]
<bb 24> :
this_38(D)->Alignment = MEM[(const struct CharUnits &)_4];
goto <bb 5>; [100.00%]
<bb 4> :
this_38(D)->Alignment = MEM[(const struct CharUnits &)_3];
<bb 5> :
# _42 = PHI <_4(24), _3(4)>
RoundingAlignment = *_42;
```
And then phiprop2 does:
```
<bb 3> [local count: 536870912]:
_1 = &this_22(D)->RequiredAlignment;
_2 = &this_22(D)->Alignment;
_29 = MEM[(const struct CharUnits *)this_22(D) + 32B].Quantity;
if (_29 < _41)
goto <bb 5>; [34.00%]
else
goto <bb 4>; [66.00%]
<bb 4> [local count: 354334800]:
this_22(D)->Alignment = MEM[(const struct CharUnits &)_2]; // NOP LOAD/Store
RoundingAlignment = MEM[(const struct CharUnits &)_2];
goto <bb 6>; [100.00%]
<bb 5> [local count: 182536112]:
this_22(D)->Alignment = MEM[(const struct CharUnits &)_1];
RoundingAlignment = MEM[(const struct CharUnits &)_1];
```
And then we go into an infinite loop.