int fconv(int a, int n, char **msg) {
  int b[10];
  float f[10];
  int i;
  b[0] = a;
  for (i = n / 20; --i >= 0;)
    f[0] = b[0], f[1] = b[1], f[2] = b[2], f[3] = b[3], f[4] = b[4],
    f[5] = b[5], f[6] = b[6], f[7] = b[7], f[8] = b[8], f[9] = b[9],
    b[0] = f[1], b[1] = f[2], b[2] = f[3], b[3] = f[4], b[4] = f[5],
    b[5] = f[6], b[6] = f[7], b[7] = f[8], b[8] = f[9], b[9] = f[0];
  *msg = "float/int conversions";
  return b[0];
}


x86 assembly (clang, -O0):
<fconv>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x8(%rbp),%eax
mov    $0x14,%ecx
cltd
idiv   %ecx
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x74(%rbp)
cmp    $0x0,%eax
jl     11ed <fconv+0xed>
cvtsi2ssl -0x40(%rbp),%xmm0
movss  %xmm0,-0x70(%rbp)
cvtsi2ssl -0x3c(%rbp),%xmm0
movss  %xmm0,-0x6c(%rbp)
cvtsi2ssl -0x38(%rbp),%xmm0
movss  %xmm0,-0x68(%rbp)
cvtsi2ssl -0x34(%rbp),%xmm0
movss  %xmm0,-0x64(%rbp)
cvtsi2ssl -0x30(%rbp),%xmm0
movss  %xmm0,-0x60(%rbp)
cvtsi2ssl -0x2c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
cvtsi2ssl -0x28(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
cvtsi2ssl -0x24(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
cvtsi2ssl -0x20(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
cvtsi2ssl -0x1c(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
cvttss2si -0x6c(%rbp),%eax
mov    %eax,-0x40(%rbp)
cvttss2si -0x68(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cvttss2si -0x64(%rbp),%eax
mov    %eax,-0x38(%rbp)
cvttss2si -0x60(%rbp),%eax
mov    %eax,-0x34(%rbp)
cvttss2si -0x5c(%rbp),%eax
mov    %eax,-0x30(%rbp)
cvttss2si -0x58(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cvttss2si -0x54(%rbp),%eax
mov    %eax,-0x28(%rbp)
cvttss2si -0x50(%rbp),%eax
mov    %eax,-0x24(%rbp)
cvttss2si -0x4c(%rbp),%eax
mov    %eax,-0x20(%rbp)
cvttss2si -0x70(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1122 <fconv+0x22>
mov    -0x10(%rbp),%rax
lea    0xe08(%rip),%rcx
mov    %rcx,(%rax)
mov    -0x40(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fconv>:
mov    %edi,%eax
cmp    $0x14,%esi
jl     1165 <fconv+0x65>
mov    %esi,%esi
mov    $0xcccccccd,%ecx
imul   %rsi,%rcx
shr    $0x24,%rcx
movd   %eax,%xmm0
add    $0x1,%ecx
nopl   (%rax)
xorps  %xmm2,%xmm2
cvtsi2ss %esi,%xmm2
pshufd $0xff,%xmm1,%xmm3
cvtdq2ps %xmm3,%xmm3
movd   %eax,%xmm4
punpcklqdq %xmm0,%xmm4
shufps $0x98,%xmm0,%xmm4
shufps $0x3,%xmm1,%xmm0
shufps $0x98,%xmm1,%xmm0
cvtdq2ps %xmm4,%xmm4
cvtdq2ps %xmm0,%xmm0
cvttss2si %xmm2,%eax
cvttss2si %xmm3,%esi
cvttps2dq %xmm0,%xmm1
cvttps2dq %xmm4,%xmm0
add    $0xffffffff,%ecx
cmp    $0x1,%ecx
ja     1120 <fconv+0x20>
movd   %xmm0,%eax
lea    0xe94(%rip),%rcx
mov    %rcx,(%rdx)
ret

LLVM IR (-O0):
@.str = [22 x i8] c"float/int conversions\00"
define i32 @fconv(i32 %0, i32 %1, i8** %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8**
%7 = alloca [10 x i32]
%8 = alloca [10 x float]
%9 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store i8** %2, i8*** %6
%10 = load i32, i32* %4
%11 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 0
store i32 %10, i32* %11
%12 = load i32, i32* %5
%13 = sdiv i32 %12, 20
store i32 %13, i32* %9
br label %14
14: ; preds = %18, %3
%15 = load i32, i32* %9
%16 = add nsw i32 %15, -1
store i32 %16, i32* %9
%17 = icmp sge i32 %16, 0
br i1 %17, label %18, label %99
18: ; preds = %14
%19 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 0
%20 = load i32, i32* %19
%21 = sitofp i32 %20 to float
%22 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 0
store float %21, float* %22
%23 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 1
%24 = load i32, i32* %23
%25 = sitofp i32 %24 to float
%26 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 1
store float %25, float* %26
%27 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 2
%28 = load i32, i32* %27
%29 = sitofp i32 %28 to float
%30 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 2
store float %29, float* %30
%31 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 3
%32 = load i32, i32* %31
%33 = sitofp i32 %32 to float
%34 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 3
store float %33, float* %34
%35 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 4
%36 = load i32, i32* %35
%37 = sitofp i32 %36 to float
%38 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 4
store float %37, float* %38
%39 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 5
%40 = load i32, i32* %39
%41 = sitofp i32 %40 to float
%42 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 5
store float %41, float* %42
%43 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 6
%44 = load i32, i32* %43
%45 = sitofp i32 %44 to float
%46 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 6
store float %45, float* %46
%47 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 7
%48 = load i32, i32* %47
%49 = sitofp i32 %48 to float
%50 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 7
store float %49, float* %50
%51 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 8
%52 = load i32, i32* %51
%53 = sitofp i32 %52 to float
%54 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 8
store float %53, float* %54
%55 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 9
%56 = load i32, i32* %55
%57 = sitofp i32 %56 to float
%58 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 9
store float %57, float* %58
%59 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 1
%60 = load float, float* %59
%61 = fptosi float %60 to i32
%62 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 0
store i32 %61, i32* %62
%63 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 2
%64 = load float, float* %63
%65 = fptosi float %64 to i32
%66 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 1
store i32 %65, i32* %66
%67 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 3
%68 = load float, float* %67
%69 = fptosi float %68 to i32
%70 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 2
store i32 %69, i32* %70
%71 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 4
%72 = load float, float* %71
%73 = fptosi float %72 to i32
%74 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 3
store i32 %73, i32* %74
%75 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 5
%76 = load float, float* %75
%77 = fptosi float %76 to i32
%78 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 4
store i32 %77, i32* %78
%79 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 6
%80 = load float, float* %79
%81 = fptosi float %80 to i32
%82 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 5
store i32 %81, i32* %82
%83 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 7
%84 = load float, float* %83
%85 = fptosi float %84 to i32
%86 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 6
store i32 %85, i32* %86
%87 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 8
%88 = load float, float* %87
%89 = fptosi float %88 to i32
%90 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 7
store i32 %89, i32* %90
%91 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 9
%92 = load float, float* %91
%93 = fptosi float %92 to i32
%94 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 8
store i32 %93, i32* %94
%95 = getelementptr inbounds [10 x float], [10 x float]* %8, i64 0, i64 0
%96 = load float, float* %95
%97 = fptosi float %96 to i32
%98 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 9
store i32 %97, i32* %98
br label %14
99: ; preds = %14
%100 = load i8**, i8*** %6
store i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i8** %100
%101 = getelementptr inbounds [10 x i32], [10 x i32]* %7, i64 0, i64 0
%102 = load i32, i32* %101
ret i32 %102
}

LLVM IR (-O2):
@.str = [22 x i8] c"float/int conversions\00"
define i32 @fconv(i32 %0, i32 %1, i8** nocapture writeonly %2) {
%4 = icmp sgt i32 %1, 19
br i1 %4, label %5, label %26
5: ; preds = %3
%6 = udiv i32 %1, 20
%7 = insertelement <8 x i32> poison, i32 %0, i64 0
br label %8
8: ; preds = %5, %8
%9 = phi i32 [ %13, %8 ], [ %6, %5 ]
%10 = phi i32 [ %21, %8 ], [ undef, %5 ]
%11 = phi i32 [ %20, %8 ], [ undef, %5 ]
%12 = phi <8 x i32> [ %22, %8 ], [ %7, %5 ]
%13 = add nsw i32 %9, -1
%14 = sitofp i32 %10 to float
%15 = extractelement <8 x i32> %12, i64 7
%16 = sitofp i32 %15 to float
%17 = insertelement <8 x i32> poison, i32 %11, i64 0
%18 = shufflevector <8 x i32> %17, <8 x i32> %12, <8 x i32> <i32 0, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
%19 = sitofp <8 x i32> %18 to <8 x float>
%20 = fptosi float %14 to i32
%21 = fptosi float %16 to i32
%22 = fptosi <8 x float> %19 to <8 x i32>
%23 = icmp ugt i32 %9, 1
br i1 %23, label %8, label %24
24: ; preds = %8
%25 = extractelement <8 x i32> %22, i64 0
br label %26
26: ; preds = %24, %3
%27 = phi i32 [ %0, %3 ], [ %25, %24 ]
store i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i8** %2
ret i32 %27
}