rust-lang / rust-memory-model

Collecting examples and information to help design a memory model for Rust.
Apache License 2.0
126 stars 15 forks source link

Basic `&mut` noalias optimization in unsafe code #24

Open arielb1 opened 8 years ago

arielb1 commented 8 years ago

One optimization we want for sure:

As long as <typeof(value) as Clone>::clone is known not to panic, this:

        unsafe {
            let mut ptr = self.buf.ptr();
            for i in 0..(self.len) {
                ptr::write(ptr, value.clone());
                ptr = ptr.offset(1);
                self.len += 1;
            }
        }

Must be optimizable to this:

        unsafe {
            let mut ptr = self.buf.ptr();
            for i in 0..(self.len) {
                ptr::write(ptr, value.clone());
                ptr = ptr.offset(1);
            }
            self.len += n;
        }

This optimization is important because the latter loop can be further optimized to a memcpy when value is Copy. However, this optimization requires that the memory referenced to by ptr not alias with self.len.

We used to do that optimization in older versions of rustc (using an LLVM noalias attribute, not in trans), but stopped emitting that attribute because LLVM's semantics miss the "is known not to panic" requirement. If we deal with that issue, we would like to apply noalias again.