Description
On this code in image-webp
, following the Clippy lint to replace .max(0).min(255)
with .clamp(0,255)
on an i32
value causes a performance regression:
It's unfortunate that .min().max() and .clamp() are not equivalent, and doubly so when Clippy nags us to rewrite the code in a way that makes it slower.
I've posted a self-contained sample that reproduces the issue on godbolt:
Generated assembly for .min().max(): https://rust.godbolt.org/z/zr7PK8vz3
Generated assembly for .clamp(): https://rust.godbolt.org/z/b898M45vo
You can see that the .clamp() version results in far more assembly; the vectorized loop is roughly twice the amount of instructions.
I've confirmed that the issue exists in rustc 1.75, 1.82 and 1.87 which is the latest as of this writing.