-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Segmentation fault when transmuting simd vector temporary #32947
Comments
Maybe you can write a PR with a test case so that this gets addressed? |
Tests are usually added after the fix to prevent regressing, but I wouldn’t know where to start in order to fix this. |
LLVM generates a |
D'oh, nevermind that. I was looking at the wrong function in the IR. It's actually just |
For types that are not bitcast-compatible, transmute tries to avoid generating a temporary by translating its source expression directly into its destination, but when the source type has a bigger alignment requirement than the destination, this can lead to code that breaks due to misaligned stores. So in that case we need to generate a temporary for the source expression and then copy that into the destination, setting the proper alignment information on the memcpy/store. Fixes rust-lang#32947
Triage: this fails on nightly.
Running
|
Still failing on the newest nightly 1.14.0-nightly (f094206 2016-10-20) |
For transmute::<T, U> we simply pointercast the destination from a U pointer to a T pointer, without providing any alignment information, thus LLVM assumes that the destination is aligned to hold a value of type T, which is not necessarily true. This can lead to LLVM emitting machine instructions that assume said alignment, and thus cause aborts. To fix this, we need to provide the actual alignment to store_operand() and in turn to store() so they can set the proper alignment information on the stores and LLVM can emit the proper machine instructions. Fixes rust-lang#32947
Fix transmute::<T, U> where T requires a bigger alignment than U For transmute::<T, U> we simply pointercast the destination from a U pointer to a T pointer, without providing any alignment information, thus LLVM assumes that the destination is aligned to hold a value of type T, which is not necessarily true. This can lead to LLVM emitting machine instructions that assume said alignment, and thus cause aborts. To fix this, we need to provide the actual alignment to store_operand() and in turn to store() so they can set the proper alignment information on the stores and LLVM can emit the proper machine instructions. Fixes #32947
…chenkov Move some tests to more reasonable directories - 3 cc rust-lang#73494 r? `@petrochenkov` /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56202.rs <sup>/~https://github.com/rust-lang/rust/issues/56202</sup>: traits 1.008 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-69841.rs <sup>/~https://github.com/rust-lang/rust/issues/69841</sup>: for-loop-while 1.014 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-10763.rs <sup>/~https://github.com/rust-lang/rust/issues/10763</sup>: extern 1.016 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-50599.rs <sup>/~https://github.com/rust-lang/rust/issues/50599</sup>: resolve 1.018 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-6128.rs <sup>/~https://github.com/rust-lang/rust/issues/6128</sup>: traits 1.043 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-20616-8.rs <sup>/~https://github.com/rust-lang/rust/issues/20616</sup>: parser 1.045 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-46553.rs <sup>/~https://github.com/rust-lang/rust/issues/46553</sup>: consts 1.081 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33140-hack-boundaries.rs <sup>/~https://github.com/rust-lang/rust/issues/33140</sup>: traits 1.101 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-25826.rs <sup>/~https://github.com/rust-lang/rust/issues/25826</sup>: consts 1.108 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56488.rs <sup>/~https://github.com/rust-lang/rust/issues/56488</sup>: traits 1.110 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-58856-1.rs <sup>/~https://github.com/rust-lang/rust/issues/58856</sup>: parser 1.133 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57819.rs <sup>/~https://github.com/rust-lang/rust/issues/57819</sup>: parser 1.138 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-54348.rs <sup>/~https://github.com/rust-lang/rust/issues/54348</sup>: consts 1.155 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-14309.rs <sup>/~https://github.com/rust-lang/rust/issues/14309</sup>: lint 1.160 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-4446.rs <sup>/~https://github.com/rust-lang/rust/issues/4446</sup>: threads-sendsync 1.203 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-53675-a-test-called-panic.rs <sup>/~https://github.com/rust-lang/rust/issues/53675</sup>: test-attrs 1.211 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-40231-2.rs <sup>/~https://github.com/rust-lang/rust/issues/40231</sup>: consts 1.213 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-22037.rs <sup>/~https://github.com/rust-lang/rust/issues/22037</sup>: associated-types 1.214 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-59029-2.rs <sup>/~https://github.com/rust-lang/rust/issues/59029</sup>: traits 1.219 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-18425.rs <sup>/~https://github.com/rust-lang/rust/issues/18425</sup>: consts 1.237 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-6157.rs <sup>/~https://github.com/rust-lang/rust/issues/6157</sup>: regions 1.238 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33819.rs <sup>/~https://github.com/rust-lang/rust/issues/33819</sup>: borrowck 1.280 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-3683.rs <sup>/~https://github.com/rust-lang/rust/issues/3683</sup>: traits 1.283 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-8709.rs <sup>/~https://github.com/rust-lang/rust/issues/8709</sup>: macros 1.291 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-20616-9.rs <sup>/~https://github.com/rust-lang/rust/issues/20616</sup>: parser 1.293 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-64732.rs <sup>/~https://github.com/rust-lang/rust/issues/64732</sup>: parser 1.296 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-18655.rs <sup>/~https://github.com/rust-lang/rust/issues/18655</sup>: associated-types 1.305 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-32947.rs <sup>/~https://github.com/rust-lang/rust/issues/32947</sup>: simd 1.322 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57198.rs <sup>/~https://github.com/rust-lang/rust/issues/57198</sup>: parser 1.342 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-10764-rpass.rs <sup>/~https://github.com/rust-lang/rust/issues/10764</sup>: extern 1.392 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-73541-2.rs <sup>/~https://github.com/rust-lang/rust/issues/73541</sup>: async-await 1.422 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-7970b.rs <sup>/~https://github.com/rust-lang/rust/issues/7970</sup>: parser 1.439 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57684.rs <sup>/~https://github.com/rust-lang/rust/issues/57684</sup>: parser 1.512 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33264.rs <sup>/~https://github.com/rust-lang/rust/issues/33264</sup>: llvm-asm 1.523 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs <sup>/~https://github.com/rust-lang/rust/issues/65284</sup>: suggestions 1.647 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-17458.rs <sup>/~https://github.com/rust-lang/rust/issues/17458</sup>: consts 1.711 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56762.rs <sup>/~https://github.com/rust-lang/rust/issues/56762</sup>: consts 1.787 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-2216.rs <sup>/~https://github.com/rust-lang/rust/issues/2216</sup>: for-loop-while 1.856 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-45696-scribble-on-boxed-borrow.rs <sup>/~https://github.com/rust-lang/rust/issues/45696</sup>: nll 2.009 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-46036.rs <sup>/~https://github.com/rust-lang/rust/issues/46036</sup>: nll 2.059 `@petrochenkov` Can you put a place holder (like `N/A`) for tests without GitHub issues? It is a lot easier to parse fixed sized rows.
…chenkov Move some tests to more reasonable directories - 3 cc rust-lang#73494 r? ``@petrochenkov`` /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56202.rs <sup>/~https://github.com/rust-lang/rust/issues/56202</sup>: traits 1.008 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-69841.rs <sup>/~https://github.com/rust-lang/rust/issues/69841</sup>: for-loop-while 1.014 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-10763.rs <sup>/~https://github.com/rust-lang/rust/issues/10763</sup>: extern 1.016 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-50599.rs <sup>/~https://github.com/rust-lang/rust/issues/50599</sup>: resolve 1.018 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-6128.rs <sup>/~https://github.com/rust-lang/rust/issues/6128</sup>: traits 1.043 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-20616-8.rs <sup>/~https://github.com/rust-lang/rust/issues/20616</sup>: parser 1.045 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-46553.rs <sup>/~https://github.com/rust-lang/rust/issues/46553</sup>: consts 1.081 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33140-hack-boundaries.rs <sup>/~https://github.com/rust-lang/rust/issues/33140</sup>: traits 1.101 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-25826.rs <sup>/~https://github.com/rust-lang/rust/issues/25826</sup>: consts 1.108 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56488.rs <sup>/~https://github.com/rust-lang/rust/issues/56488</sup>: traits 1.110 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-58856-1.rs <sup>/~https://github.com/rust-lang/rust/issues/58856</sup>: parser 1.133 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57819.rs <sup>/~https://github.com/rust-lang/rust/issues/57819</sup>: parser 1.138 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-54348.rs <sup>/~https://github.com/rust-lang/rust/issues/54348</sup>: consts 1.155 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-14309.rs <sup>/~https://github.com/rust-lang/rust/issues/14309</sup>: lint 1.160 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-4446.rs <sup>/~https://github.com/rust-lang/rust/issues/4446</sup>: threads-sendsync 1.203 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-53675-a-test-called-panic.rs <sup>/~https://github.com/rust-lang/rust/issues/53675</sup>: test-attrs 1.211 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-40231-2.rs <sup>/~https://github.com/rust-lang/rust/issues/40231</sup>: consts 1.213 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-22037.rs <sup>/~https://github.com/rust-lang/rust/issues/22037</sup>: associated-types 1.214 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-59029-2.rs <sup>/~https://github.com/rust-lang/rust/issues/59029</sup>: traits 1.219 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-18425.rs <sup>/~https://github.com/rust-lang/rust/issues/18425</sup>: consts 1.237 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-6157.rs <sup>/~https://github.com/rust-lang/rust/issues/6157</sup>: regions 1.238 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33819.rs <sup>/~https://github.com/rust-lang/rust/issues/33819</sup>: borrowck 1.280 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-3683.rs <sup>/~https://github.com/rust-lang/rust/issues/3683</sup>: traits 1.283 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-8709.rs <sup>/~https://github.com/rust-lang/rust/issues/8709</sup>: macros 1.291 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-20616-9.rs <sup>/~https://github.com/rust-lang/rust/issues/20616</sup>: parser 1.293 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-64732.rs <sup>/~https://github.com/rust-lang/rust/issues/64732</sup>: parser 1.296 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-18655.rs <sup>/~https://github.com/rust-lang/rust/issues/18655</sup>: associated-types 1.305 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-32947.rs <sup>/~https://github.com/rust-lang/rust/issues/32947</sup>: simd 1.322 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57198.rs <sup>/~https://github.com/rust-lang/rust/issues/57198</sup>: parser 1.342 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-10764-rpass.rs <sup>/~https://github.com/rust-lang/rust/issues/10764</sup>: extern 1.392 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-73541-2.rs <sup>/~https://github.com/rust-lang/rust/issues/73541</sup>: async-await 1.422 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-7970b.rs <sup>/~https://github.com/rust-lang/rust/issues/7970</sup>: parser 1.439 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-57684.rs <sup>/~https://github.com/rust-lang/rust/issues/57684</sup>: parser 1.512 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-33264.rs <sup>/~https://github.com/rust-lang/rust/issues/33264</sup>: llvm-asm 1.523 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs <sup>/~https://github.com/rust-lang/rust/issues/65284</sup>: suggestions 1.647 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-17458.rs <sup>/~https://github.com/rust-lang/rust/issues/17458</sup>: consts 1.711 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-56762.rs <sup>/~https://github.com/rust-lang/rust/issues/56762</sup>: consts 1.787 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-2216.rs <sup>/~https://github.com/rust-lang/rust/issues/2216</sup>: for-loop-while 1.856 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-45696-scribble-on-boxed-borrow.rs <sup>/~https://github.com/rust-lang/rust/issues/45696</sup>: nll 2.009 /~https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-46036.rs <sup>/~https://github.com/rust-lang/rust/issues/46036</sup>: nll 2.059 ``@petrochenkov`` Can you put a place holder (like `N/A`) for tests without GitHub issues? It is a lot easier to parse fixed sized rows.
This is a pretty subtle interaction of several things that produces code which causes a segmentation fault:
#[repr(simd)]
.Now
cargo test
crashes with a segmentation fault. (The test program that is, not Cargo.)cargo test --release
runs fine. It could be that this is working as intended, and this is what I get for using unsafe code, but it certainly surprises me.Workaround for now: use
transmute_copy
instead oftransmute
.Version: rustc 1.9.0-nightly (a43eb4e 2016-04-12). It also happened on an older nightly.
The text was updated successfully, but these errors were encountered: