-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Use subslice patterns in slice methods #69706
Conversation
For all of the methods that pick off the first or last element, we can use subslice patterns to implement them directly, rather than relying on deeper indexing function calls. At a minimum, this means the generated code will rely less on inlining for performance, but in some cases it also optimizes better.
r? @kennytm (rust_highfive has picked a reviewer for you, use r? to override) |
To back this up, here is the compiler explorer comparing the immutable methods. Note the missing functions in the output, indicating that LLVM merged them with their counterpart. Then example::last:
xor ecx, ecx
mov rdx, rsi
sub rdx, 1
lea rax, [rdi + 4*rdx]
cmovb rax, rcx
cmp rdx, rsi
cmovae rax, rcx
ret
example::last_pattern:
xor eax, eax
sub rsi, 1
lea rcx, [rdi + 4*rsi]
cmovae rax, rcx
ret Here is the same exploration for the mutable methods. It looks like LLVM's merge-functions pass was less successful here, outputing split methods that are identical AFAICS. Then |
This can be confirmed by unchecking the .globl example::split_last_pattern
.type example::split_last_pattern,@function
.set example::split_last_pattern, example::split_last
.globl example::first
.type example::first,@function
.set example::first, example::first_pattern
.globl example::split_first_pattern
.type example::split_first_pattern,@function
.set example::split_first_pattern, example::split_first .globl example::first_mut
.type example::first_mut,@function
.set example::first_mut, example::first_mut_pattern |
📌 Commit 53be0cc has been approved by |
Use subslice patterns in slice methods For all of the methods that pick off the first or last element, we can use subslice patterns to implement them directly, rather than relying on deeper indexing function calls. At a minimum, this means the generated code will rely less on inlining for performance, but in some cases it also optimizes better.
Rollup of 6 pull requests Successful merges: - #69656 (Use .next() instead of .nth(0) on iterators.) - #69674 (Rename DefKind::Method and TraitItemKind::Method ) - #69676 (Pass correct place to `discriminant_switch_effect`) - #69706 (Use subslice patterns in slice methods) - #69714 (Make PlaceRef take just one lifetime) - #69727 (Avoid using `unwrap()` in suggestions) Failed merges: - #69589 (ast: `Mac`/`Macro` -> `MacCall`) - #69680 (rustc_expand: Factor out `Annotatable::into_tokens` to a separate method) r? @ghost
Use subslice patterns in slice methods For all of the methods that pick off the first or last element, we can use subslice patterns to implement them directly, rather than relying on deeper indexing function calls. At a minimum, this means the generated code will rely less on inlining for performance, but in some cases it also optimizes better.
I think LLVM merges functions which have equivalent IR, in fact the alias is already specified in the IR when functions are merged. |
Use subslice patterns in slice methods For all of the methods that pick off the first or last element, we can use subslice patterns to implement them directly, rather than relying on deeper indexing function calls. At a minimum, this means the generated code will rely less on inlining for performance, but in some cases it also optimizes better.
Rollup of 9 pull requests Successful merges: - #67741 (When encountering an Item in a pat context, point at the item def) - #68985 (Parse & reject postfix operators after casts) - #69656 (Use .next() instead of .nth(0) on iterators.) - #69680 (rustc_expand: Factor out `Annotatable::into_tokens` to a separate method) - #69690 (test(pattern): add tests for combinations of pattern features) - #69706 (Use subslice patterns in slice methods) - #69727 (Avoid using `unwrap()` in suggestions) - #69754 (Update deprecation version to 1.42 for Error::description) - #69782 (Don't redundantly repeat field names (clippy::redundant_field_names)) Failed merges: r? @ghost
For all of the methods that pick off the first or last element, we can
use subslice patterns to implement them directly, rather than relying on
deeper indexing function calls. At a minimum, this means the generated
code will rely less on inlining for performance, but in some cases it
also optimizes better.