https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104357
Andrew Pinski changed:
What|Removed |Added
Status|UNCONFIRMED |NEW
Last reconfirmed||2022-02-02
Component|target |tree-optimization
Ever confirmed|0 |1
--- Comment #1 from Andrew Pinski ---
This will get GCC closer to what clang/LLVM produces:
unsigned char stbi__clamp(int x)
{
int t = x;
if ((unsigned)x > 255) {
if (x < 0) t = 0;
else if (x > 255) t = -1;
}
return t;
}
CUT
The zero-extends are due to the cast not being outside of the csel and the RTL
level is not really good at cross bb optimizations.
The gimple level looks like:
[local count: 1073741824]:
x.0_1 = (unsigned int) x_3(D);
if (x.0_1 > 255)
goto ; [50.00%]
else
goto ; [50.00%]
[local count: 536870913]:
_7 = x_3(D) >= 0;
_6 = (unsigned char) _7;
_8 = -_6;
goto ; [100.00%]
[local count: 536870913]:
_4 = (unsigned char) x_3(D);
[local count: 1073741824]:
# _2 = PHI <_8(3), _4(4)>
return _2;
Which in theory could be improved to the what I gave above.
The gimple level has no knowledge of the rtl/target level that to do - in
unsigned, you need to a zero extend still.