https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118572
Bug ID: 118572
Summary: wrong code for expression ((0x80 & c) != 0) && ((0xc0
& c&) == 0x80))
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: peter0x44 at disroot dot org
Target Milestone: ---
bool test(char c)
{
return (((0x80 & (c&0xff)) != 0) && ((0xc0 & (c&0xff)) == 0x80));
}
This is getting optimized to:
test(char):
xor eax, eax
ret
And a warning is emitted about the comparison being tautological:
<source>:4:38: warning: comparison is always 0 [-Wtautological-compare]
4 | return (((0x80 & (c&0xff)) != 0) && ((0xc0 & (c&0xff)) == 0x80));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
But it don't think it is (aside from the first half being able to be optimized
out)
https://gcc.godbolt.org/z/T8TM6n833
Found in upstream code:
https://github.com/raysan5/raylib/blob/master/src/rtext.c#L2121-L2138