https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126378
Drea Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |diagnostic,
| |missed-optimization
Target Milestone|--- |13.5
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
Last reconfirmed| |2026-07-23
Summary|spurious -Wnonnull "'this' |[13/14/15/16/17 Regression]
|pointer is null" at -O2 for |spurious -Wnonnull "'this'
|pointer guarded by |pointer is null" at -O2 for
|preceding null checks |pointer guarded by
|(regression from 10.x) |preceding null checks
| |(regression from 10.x)
--- Comment #1 from Drea Pinski <pinskia at gcc dot gnu.org> ---
Confirmed. Looks like we are warning right after inlining which means we get
something like:
```
<bb 2> [local count: 1073741824]:
_6 = q_2(D) == 0B;
if (_6 != 0)
goto <bb 6>; [34.00%]
else
goto <bb 3>; [66.00%]
<bb 3> [local count: 708669600]:
if (q_2(D) != 0B)
goto <bb 4>; [82.57%]
else
goto <bb 5>; [17.43%]
```
Which then gets optimized away and the call to `p->get()` is removed
afterwards.
But really the issue is before inlining we don't change this to the reasonible
IR:
```
<bb 2> :
_1 = p_6(D) == 0B;
_2 = q_7(D) == 0B;
_3 = _1 & _2;
if (_3 != 0)
goto <bb 3>; [INV]
else
goto <bb 4>; [INV]
<bb 3> :
// predicted unlikely by early return (on trees) predictor.
goto <bb 7>; [INV]
<bb 4> :
if (q_7(D) != 0B)
goto <bb 5>; [INV]
else
goto <bb 6>; [INV]
```