https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115274
--- Comment #13 from qinzhao at gcc dot gnu.org ---
>when adding -fno-tree-sink, the warning disappeared.
Before tree-sinking optimization, the IR is: (c.151t.pre)
<bb 2> [local count: 1073741824]:
c.0_1 = c;
_2 = c.0_1 + 1;
_5 = strlen (_2);
_8 = (int) _5;
f_6 = (long int) _8;
if (c.0_1 == 0B)
goto <bb 3>; [17.43%]
else
goto <bb 5>; [82.57%]
<bb 5> [local count: 886588624]:
goto <bb 4>; [100.00%]
<bb 3> [local count: 187153200]:
a (f_6);
<bb 4> [local count: 1073741824]:
return;
With the tree-sinking optimization, the IR becomes: (c.152t.sink1)
<bb 2> [local count: 1073741824]:
c.0_1 = c;
if (c.0_1 == 0B)
goto <bb 3>; [17.43%]
else
goto <bb 5>; [82.57%]
<bb 5> [local count: 886588624]:
goto <bb 4>; [100.00%]
<bb 3> [local count: 187153200]:
_2 = c.0_1 + 1;
_5 = strlen (_2);
_8 = (int) _5;
f_6 = (long int) _8;
a (f_6);
<bb 4> [local count: 1073741824]:
return;
>From the above, we can clearly see that, 4 statements including "_5 = strlen
(_2)" are sinked from basic block 2 down to basic block 3. The basic block 3 is
on the TRUE path of the condition "if (c.0_1 == 0B), therefore, compiler
definitely reports the error in the user code, i.e., "strlen (_2)" tries to
reference a NULL pointer.
This is a real bug in the user's source code.
Instead of a code duplication as jump threading optimization, tree-sinking
applies a code movement from a joint-point of a CFG to a specific path.
We might need to record such information.