diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-09-26 15:57:24 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-26 15:57:24 +0200 |
| commit | b9caba610e8808aa2a743a390eddf8d2f34befd0 (patch) | |
| tree | b3b92d8b8d46f62662f84b218a4911e4beb2d34c /tests/ui/codegen | |
| parent | 8bf0dec101dc458a411401a826994006abd2f022 (diff) | |
| parent | b6836849acf8ce97e71fdf3963e4000173f8e1da (diff) | |
| download | rust-b9caba610e8808aa2a743a390eddf8d2f34befd0.tar.gz rust-b9caba610e8808aa2a743a390eddf8d2f34befd0.zip | |
Rollup merge of #116099 - eduardosm:issue-79865-regression, r=oli-obk
Add regression test for issue #79865 Closes https://github.com/rust-lang/rust/issues/79865
Diffstat (limited to 'tests/ui/codegen')
| -rw-r--r-- | tests/ui/codegen/issue-79865-llvm-miscompile.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/codegen/issue-79865-llvm-miscompile.rs b/tests/ui/codegen/issue-79865-llvm-miscompile.rs new file mode 100644 index 00000000000..b77f09f8e9a --- /dev/null +++ b/tests/ui/codegen/issue-79865-llvm-miscompile.rs @@ -0,0 +1,38 @@ +// run-pass +// only-x86_64 +// compile-flags: -C opt-level=3 + +// Regression test for issue #79865. +// The assertion will fail when compiled with Rust 1.56..=1.59 +// due to a LLVM miscompilation. + +use std::arch::x86_64::*; + +fn main() { + if is_x86_feature_detected!("avx") { + let res: [f64; 4] = unsafe { std::mem::transmute::<_, _>(first()) }; + assert_eq!(res, [22.0, 44.0, 66.0, 88.0]); + } +} + +#[target_feature(enable = "avx")] +unsafe fn first() -> __m256d { + second() +} + +unsafe fn second() -> __m256d { + let v0 = _mm256_setr_pd(1.0, 2.0, 3.0, 4.0); + let v1 = _mm256_setr_pd(10.0, 20.0, 30.0, 40.0); + + // needs to be called twice to hit the miscompilation + let (add, _) = add_sub(v0, v1); + let (add, _) = add_sub(add, add); + add +} + +#[inline(never)] // needed to hit the miscompilation +unsafe fn add_sub(v1: __m256d, v0: __m256d) -> (__m256d, __m256d) { + let add = _mm256_add_pd(v0, v1); + let sub = _mm256_sub_pd(v0, v1); + (add, sub) +} |
