Closed
Description
Given this Rust code:
#[repr(C)]
struct S {
f1: i32,
f2: i32,
f3: i32,
}
extern {
fn foo(s: S);
}
A call to foo()
generates IR like this on x86_64 Linux:
%S = type { i32, i32, i32 }
; ...
%arg = alloca %S
; ...
%2 = bitcast %S* %s to i8*
%3 = bitcast %S* %arg to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* %2, i64 12, i32 4, i1 false)
%4 = bitcast %S* %arg to { i64, i64 }*
%5 = load { i64, i64 }, { i64, i64 }* %4
call void @x({ i64, i64 } %5)
So we have a 12 byte alloca from which we then read 16 bytes.