[naga msl-out] Avoid undefined behaviour due to signed integer overflow #6959
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Connections
Fixes #6666
Description
Signed integer overflow is undefined behaviour in MSL. However, signed integers are defined to be two's complement. This allows us to cast signed values to their corresponding unsigned type, perform the arithmetic on these unsigned values (which has defined overflow behaviour) then cast the result back to signed.
Care must be taken when emitting the isign polyfill, which uses metal::select(). We must ensure the -1, 0, and 1 literals used as inputs to select() have the correct width, else bitcasting the output of select() will fail due to mismatched widths.
Testing
Inspected shapshot test output. Ensure validation still succeeds.
Checklist
cargo fmt
.taplo format
.cargo clippy
. If applicable, add:--target wasm32-unknown-unknown
--target wasm32-unknown-emscripten
cargo xtask test
to run tests.CHANGELOG.md
. See simple instructions inside file.