diff options
| author | Scott McMurray <scottmcm@users.noreply.github.com> | 2018-07-04 02:48:30 -0700 |
|---|---|---|
| committer | Scott McMurray <scottmcm@users.noreply.github.com> | 2018-07-21 21:43:37 -0700 |
| commit | e6fc62a1ef6cfb545d4f33914a4440c6bbcbf9eb (patch) | |
| tree | 170eec70a297f7237aee84232ab1572f62706113 /src/test/codegen | |
| parent | 874dec25ed4c08d36f17d396b6872ca50313fc8e (diff) | |
| download | rust-e6fc62a1ef6cfb545d4f33914a4440c6bbcbf9eb.tar.gz rust-e6fc62a1ef6cfb545d4f33914a4440c6bbcbf9eb.zip | |
Don't use SIMD in mem::swap for types smaller than the block size
LLVM isn't able to remove the alloca for the unaligned block in the SIMD tail in some cases, so doing this helps SRoA work in cases where it currently doesn't. Found in the `replace_with` RFC discussion.
Diffstat (limited to 'src/test/codegen')
| -rw-r--r-- | src/test/codegen/swap-small-types.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/test/codegen/swap-small-types.rs b/src/test/codegen/swap-small-types.rs new file mode 100644 index 00000000000..f34a1d669bd --- /dev/null +++ b/src/test/codegen/swap-small-types.rs @@ -0,0 +1,26 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -O + +#![crate_type = "lib"] + +use std::mem::swap; + +type RGB48 = [u16; 3]; + +// CHECK-LABEL: @swap_rgb48 +#[no_mangle] +pub fn swap_rgb48(x: &mut RGB48, y: &mut RGB48) { +// CHECK-NOT: alloca +// CHECK: load i48 +// CHECK: store i48 + swap(x, y) +} |
