forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#123778 - jhorstmann:optimize-upper-lower-auto…
…-vectorization, r=the8472 Improve autovectorization of to_lowercase / to_uppercase functions Refactor the code in the `convert_while_ascii` helper function to make it more suitable for auto-vectorization and also process the full ascii prefix of the string. The generic case conversion logic will only be invoked starting from the first non-ascii character. The runtime on a microbenchmark with a small ascii-only input decreases from ~55ns to ~18ns per iteration. The new implementation also reduces the amount of unsafe code and encapsulates all unsafe inside the helper function. Fixes rust-lang#123712
- Loading branch information
Showing
4 changed files
with
107 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
tests/codegen/issues/issue-123712-str-to-lower-autovectorization.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
//@ only-x86_64 | ||
// | ||
//@ needs-llvm-components: x86 | ||
//@ compile-flags: --target=x86_64-unknown-linux-gnu -Copt-level=3 | ||
#![crate_type = "lib"] | ||
#![no_std] | ||
#![feature(str_internals)] | ||
|
||
extern crate alloc; | ||
|
||
/// Ensure that the ascii-prefix loop for `str::to_lowercase` and `str::to_uppercase` uses vector | ||
/// instructions. | ||
/// | ||
/// The llvm ir should be the same for all targets that support some form of simd. Only targets | ||
/// without any simd instructions would see scalarized ir. | ||
/// Unfortunately, there is no `only-simd` directive to only run this test on only such platforms, | ||
/// and using test revisions would still require the core libraries for all platforms. | ||
// CHECK-LABEL: @lower_while_ascii | ||
// CHECK: [[A:%[0-9]]] = load <16 x i8> | ||
// CHECK-NEXT: [[B:%[0-9]]] = icmp slt <16 x i8> [[A]], zeroinitializer | ||
// CHECK-NEXT: [[C:%[0-9]]] = bitcast <16 x i1> [[B]] to i16 | ||
#[no_mangle] | ||
pub fn lower_while_ascii(s: &str) -> (alloc::string::String, &str) { | ||
alloc::str::convert_while_ascii(s, u8::to_ascii_lowercase) | ||
} |