dbc57584bd
Passing higher alignment values gives the optimization passes more freedom since it can copy in larger chunks. This change results in rustc outputting the same post-optimization IR as clang for swaps and most copies excluding the lack of information about padding. Code snippet: ```rust #[inline(never)] fn swap<T>(x: &mut T, y: &mut T) { util::swap(x, y); } ``` Original IR (for `int`): ```llvm define internal fastcc void @_ZN9swap_283417_a71830ca3ed2d65d3_00E(i64*, i64*) #1 { static_allocas: %2 = icmp eq i64* %0, %1 br i1 %2, label %_ZN4util9swap_283717_a71830ca3ed2d65d3_00E.exit, label %3 ; <label>:3 ; preds = %static_allocas %4 = load i64* %0, align 1 %5 = load i64* %1, align 1 store i64 %5, i64* %0, align 1 store i64 %4, i64* %1, align 1 br label %_ZN4util9swap_283717_a71830ca3ed2d65d3_00E.exit _ZN4util9swap_283717_a71830ca3ed2d65d3_00E.exit: ; preds = %3, %static_allocas ret void } ``` After #6710: ```llvm define internal fastcc void @_ZN9swap_283017_a71830ca3ed2d65d3_00E(i64* nocapture, i64* nocapture) #1 { static_allocas: %2 = load i64* %0, align 1 %3 = load i64* %1, align 1 store i64 %3, i64* %0, align 1 store i64 %2, i64* %1, align 1 ret void } ``` After this change: ```llvm define internal fastcc void @_ZN9swap_283017_a71830ca3ed2d65d3_00E(i64* nocapture, i64* nocapture) #1 { static_allocas: %2 = load i64* %0, align 8 %3 = load i64* %1, align 8 store i64 %3, i64* %0, align 8 store i64 %2, i64* %1, align 8 ret void } ``` Another example: ```rust #[inline(never)] fn set<T>(x: &mut T, y: T) { *x = y; } ``` Before, with `(int, int)` (align 1): ```llvm define internal fastcc void @_ZN8set_282517_8fa972e3f9e451983_00E({ i64, i64 }* nocapture, { i64, i64 }* nocapture) #1 { static_allocas: %2 = bitcast { i64, i64 }* %1 to i8* %3 = bitcast { i64, i64 }* %0 to i8* tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* %2, i64 16, i32 1, i1 false) ret void } ``` After, with `(int, int)` (align 8): ```llvm define internal fastcc void @_ZN8set_282617_8fa972e3f9e451983_00E({ i64, i64 }* nocapture, { i64, i64 }* nocapture) #1 { static_allocas: %2 = bitcast { i64, i64 }* %1 to i8* %3 = bitcast { i64, i64 }* %0 to i8* tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* %2, i64 16, i32 8, i1 false) ret void } ``` |
||
---|---|---|
.. | ||
num | ||
rand | ||
rt | ||
str | ||
task | ||
unstable | ||
at_vec.rs | ||
bool.rs | ||
cast.rs | ||
cell.rs | ||
char.rs | ||
cleanup.rs | ||
clone.rs | ||
cmp.rs | ||
comm.rs | ||
condition.rs | ||
container.rs | ||
core.rc | ||
either.rs | ||
from_str.rs | ||
gc.rs | ||
hash.rs | ||
hashmap.rs | ||
io.rs | ||
iter.rs | ||
iterator.rs | ||
kinds.rs | ||
libc.rs | ||
local_data.rs | ||
logging.rs | ||
macros.rs | ||
managed.rs | ||
nil.rs | ||
old_iter.rs | ||
ops.rs | ||
option.rs | ||
os.rs | ||
owned.rs | ||
path.rs | ||
pipes.rs | ||
prelude.rs | ||
ptr.rs | ||
rand.rs | ||
reflect.rs | ||
repr.rs | ||
result.rs | ||
run.rs | ||
stackwalk.rs | ||
str.rs | ||
sys.rs | ||
to_bytes.rs | ||
to_str.rs | ||
trie.rs | ||
tuple.rs | ||
unicode.rs | ||
util.rs | ||
vec.rs |