double *mk_farr_from_iarr(int *iarr, int size) {
  double *farr = ((double *)malloc((size) * sizeof(double)));
  int i;
  for (i = 0; i < size; i++)
    farr[i] = (double)iarr[i];
  return farr;
}


x86 assembly (clang, -O0):
<mk_farr_from_iarr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movslq -0xc(%rbp),%rdi
shl    $0x3,%rdi
call   1030 <malloc@plt>
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    116b <mk_farr_from_iarr+0x5b>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1137 <mk_farr_from_iarr+0x27>
mov    -0x18(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mk_farr_from_iarr>:
push   %rbp
push   %r14
push   %rbx
mov    %esi,%r14d
mov    %rdi,%rbx
movslq %esi,%rbp
lea    0x0(,%rbp,8),%rdi
call   1030 <malloc@plt>
test   %ebp,%ebp
jle    11e6 <mk_farr_from_iarr+0xd6>
mov    %r14d,%ecx
cmp    $0x4,%r14d
jae    1142 <mk_farr_from_iarr+0x32>
xor    %edx,%edx
jmp    11d0 <mk_farr_from_iarr+0xc0>
mov    %ecx,%edx
and    $0xfffffffc,%edx
lea    -0x4(%rdx),%rsi
mov    %rsi,%rbp
shr    $0x2,%rbp
add    $0x1,%rbp
test   %rsi,%rsi
je     11eb <mk_farr_from_iarr+0xdb>
mov    %rbp,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
cvtdq2pd (%rbx,%rdi,4),%xmm0
cvtdq2pd 0x8(%rbx,%rdi,4),%xmm1
movups %xmm0,(%rax,%rdi,8)
movups %xmm1,0x10(%rax,%rdi,8)
cvtdq2pd 0x10(%rbx,%rdi,4),%xmm0
cvtdq2pd 0x18(%rbx,%rdi,4),%xmm1
movupd %xmm0,0x20(%rax,%rdi,8)
movups %xmm1,0x30(%rax,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rsi
jne    1170 <mk_farr_from_iarr+0x60>
test   $0x1,%bpl
je     11c0 <mk_farr_from_iarr+0xb0>
cvtdq2pd (%rbx,%rdi,4),%xmm0
cvtdq2pd 0x8(%rbx,%rdi,4),%xmm1
movupd %xmm0,(%rax,%rdi,8)
movups %xmm1,0x10(%rax,%rdi,8)
cmp    %rcx,%rdx
je     11e6 <mk_farr_from_iarr+0xd6>
cs nopw 0x0(%rax,%rax,1)
nop
xorps  %xmm0,%xmm0
cvtsi2sdl (%rbx,%rdx,4),%xmm0
movsd  %xmm0,(%rax,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    11d0 <mk_farr_from_iarr+0xc0>
pop    %rbx
pop    %r14
pop    %rbp
ret
xor    %edi,%edi
test   $0x1,%bpl
jne    11ab <mk_farr_from_iarr+0x9b>
jmp    11c0 <mk_farr_from_iarr+0xb0>

LLVM IR (-O0):
define double* @mk_farr_from_iarr(i32* %0, i32 %1) {
%3 = alloca i32*
%4 = alloca i32
%5 = alloca double*
%6 = alloca i32
store i32* %0, i32** %3
store i32 %1, i32* %4
%7 = load i32, i32* %4
%8 = sext i32 %7 to i64
%9 = mul i64 %8, 8
%10 = call i8* @malloc(i64 %9)
%11 = bitcast i8* %10 to double*
store double* %11, double** %5
store i32 0, i32* %6
br label %12
12: ; preds = %27, %2
%13 = load i32, i32* %6
%14 = load i32, i32* %4
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %30
16: ; preds = %12
%17 = load i32*, i32** %3
%18 = load i32, i32* %6
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %17, i64 %19
%21 = load i32, i32* %20
%22 = sitofp i32 %21 to double
%23 = load double*, double** %5
%24 = load i32, i32* %6
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds double, double* %23, i64 %25
store double %22, double* %26
br label %27
27: ; preds = %16
%28 = load i32, i32* %6
%29 = add nsw i32 %28, 1
store i32 %29, i32* %6
br label %12
30: ; preds = %12
%31 = load double*, double** %5
ret double* %31
}

LLVM IR (-O2):
define noalias double* @mk_farr_from_iarr(i32* nocapture %0, i32 %1) {
%3 = sext i32 %1 to i64
%4 = shl nsw i64 %3, 3
%5 = tail call i8* @malloc(i64 %4)
%6 = bitcast i8* %5 to double*
%7 = icmp sgt i32 %1, 0
br i1 %7, label %8, label %79
8: ; preds = %2
%9 = zext i32 %1 to i64
%10 = icmp ult i32 %1, 4
br i1 %10, label %69, label %11
11: ; preds = %8
%12 = and i64 %9, 4294967292
%13 = add nsw i64 %12, -4
%14 = lshr exact i64 %13, 2
%15 = add nuw nsw i64 %14, 1
%16 = and i64 %15, 1
%17 = icmp eq i64 %13, 0
br i1 %17, label %51, label %18
18: ; preds = %11
%19 = and i64 %15, 9223372036854775806
br label %20
20: ; preds = %20, %18
%21 = phi i64 [ 0, %18 ], [ %48, %20 ]
%22 = phi i64 [ 0, %18 ], [ %49, %20 ]
%23 = getelementptr inbounds i32, i32* %0, i64 %21
%24 = bitcast i32* %23 to <2 x i32>*
%25 = load <2 x i32>, <2 x i32>* %24
%26 = getelementptr inbounds i32, i32* %23, i64 2
%27 = bitcast i32* %26 to <2 x i32>*
%28 = load <2 x i32>, <2 x i32>* %27
%29 = sitofp <2 x i32> %25 to <2 x double>
%30 = sitofp <2 x i32> %28 to <2 x double>
%31 = getelementptr inbounds double, double* %6, i64 %21
%32 = bitcast double* %31 to <2 x double>*
store <2 x double> %29, <2 x double>* %32
%33 = getelementptr inbounds double, double* %31, i64 2
%34 = bitcast double* %33 to <2 x double>*
store <2 x double> %30, <2 x double>* %34
%35 = or i64 %21, 4
%36 = getelementptr inbounds i32, i32* %0, i64 %35
%37 = bitcast i32* %36 to <2 x i32>*
%38 = load <2 x i32>, <2 x i32>* %37
%39 = getelementptr inbounds i32, i32* %36, i64 2
%40 = bitcast i32* %39 to <2 x i32>*
%41 = load <2 x i32>, <2 x i32>* %40
%42 = sitofp <2 x i32> %38 to <2 x double>
%43 = sitofp <2 x i32> %41 to <2 x double>
%44 = getelementptr inbounds double, double* %6, i64 %35
%45 = bitcast double* %44 to <2 x double>*
store <2 x double> %42, <2 x double>* %45
%46 = getelementptr inbounds double, double* %44, i64 2
%47 = bitcast double* %46 to <2 x double>*
store <2 x double> %43, <2 x double>* %47
%48 = add nuw i64 %21, 8
%49 = add i64 %22, 2
%50 = icmp eq i64 %49, %19
br i1 %50, label %51, label %20
51: ; preds = %20, %11
%52 = phi i64 [ 0, %11 ], [ %48, %20 ]
%53 = icmp eq i64 %16, 0
br i1 %53, label %67, label %54
54: ; preds = %51
%55 = getelementptr inbounds i32, i32* %0, i64 %52
%56 = bitcast i32* %55 to <2 x i32>*
%57 = load <2 x i32>, <2 x i32>* %56
%58 = getelementptr inbounds i32, i32* %55, i64 2
%59 = bitcast i32* %58 to <2 x i32>*
%60 = load <2 x i32>, <2 x i32>* %59
%61 = sitofp <2 x i32> %57 to <2 x double>
%62 = sitofp <2 x i32> %60 to <2 x double>
%63 = getelementptr inbounds double, double* %6, i64 %52
%64 = bitcast double* %63 to <2 x double>*
store <2 x double> %61, <2 x double>* %64
%65 = getelementptr inbounds double, double* %63, i64 2
%66 = bitcast double* %65 to <2 x double>*
store <2 x double> %62, <2 x double>* %66
br label %67
67: ; preds = %51, %54
%68 = icmp eq i64 %12, %9
br i1 %68, label %79, label %69
69: ; preds = %8, %67
%70 = phi i64 [ 0, %8 ], [ %12, %67 ]
br label %71
71: ; preds = %69, %71
%72 = phi i64 [ %77, %71 ], [ %70, %69 ]
%73 = getelementptr inbounds i32, i32* %0, i64 %72
%74 = load i32, i32* %73
%75 = sitofp i32 %74 to double
%76 = getelementptr inbounds double, double* %6, i64 %72
store double %75, double* %76
%77 = add nuw nsw i64 %72, 1
%78 = icmp eq i64 %77, %9
br i1 %78, label %79, label %71
79: ; preds = %71, %67, %2
ret double* %6
}