about summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
authorMarkus <marwes91@gmail.com>2015-06-12 09:41:06 +0200
committerMarkus Westerlind <marwes91@gmail.com>2015-06-13 20:40:59 +0200
commit7721d46bd76967e73a04b7944651094d3d2f9274 (patch)
tree0b0bdab1dfce71aa270ea0e1cd670acbed31c4f5 /src/rustllvm/RustWrapper.cpp
parenta9f1e29c4ef68d09f3a926462e4be946d0749042 (diff)
downloadrust-7721d46bd76967e73a04b7944651094d3d2f9274.tar.gz
rust-7721d46bd76967e73a04b7944651094d3d2f9274.zip
Utilize discriminant_value for more efficient deriving
The new code generated for deriving on enums looks something like this:

```rust
let __self0_vi = unsafe {
    std::intrinsics::discriminant_value(&self) } as i32;
let __self1_vi = unsafe {
    std::intrinsics::discriminant_value(&__arg1) } as i32;
let __self2_vi = unsafe {
    std::intrinsics::discriminant_value(&__arg2) } as i32;
///
if __self0_vi == __self1_vi && __self0_vi == __self2_vi && ... {
    match (...) {
        (Variant1, Variant1, ...) => Body1
        (Variant2, Variant2, ...) => Body2,
        ...
        _ => ::core::intrinsics::unreachable()
    }
}
else {
    ... // catch-all remainder can inspect above variant index values.
}
```
This helps massively for C-like enums since they will be compiled as a
single comparison giving observed speedups of up to 8x. For more complex
enums the speedup is more difficult to measure but it should not be
slower to generate code this way regardless.
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions