struct sift_scalespace *sift_malloc_scalespace_lowe(int nOct, int nSca,
                                                    int im_w, int im_h,
                                                    float delta_min,
                                                    float sigma_min) {
  int *ws = xmalloc(nOct * sizeof(int));
  int *hs = xmalloc(nOct * sizeof(int));
  int *nScas = xmalloc(nOct * sizeof(int));
  float *deltas = xmalloc(nOct * sizeof(float));
  float **sigmas = xmalloc(nOct * sizeof(float *));
  assert(delta_min <= 1);
  deltas[0] = delta_min;
  hs[0] = (int)(im_h / delta_min);
  ws[0] = (int)(im_w / delta_min);
  for (int o = 1; o < nOct; o++) {
    ws[o] = ws[o - 1] / 2;
    hs[o] = hs[o - 1] / 2;
    deltas[o] = deltas[o - 1] * 2.0;
  }
  for (int o = 0; o < nOct; o++) {
    nScas[o] = nSca + 3;
    sigmas[o] = xmalloc(nScas[o] * sizeof(float));
    for (int s = 0; s < nSca + 3; s++) {
      sigmas[o][s] =
          deltas[o] / deltas[0] * sigma_min * pow(2.0, (float)s / (float)nSca);
    }
  }
  struct sift_scalespace *scalespace =
      sift_malloc_scalespace(nOct, deltas, ws, hs, nScas, sigmas);
  xfree(deltas);
  xfree(ws);
  xfree(hs);
  xfree(nScas);
  for (int o = 0; o < nOct; o++)
    xfree(sigmas[o]);
  xfree(sigmas);
  return scalespace;
}


x86 assembly (clang, -O0):
<sift_malloc_scalespace_lowe>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movslq -0x4(%rbp),%rdi
shl    $0x2,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
cltq
mov    %rax,-0x20(%rbp)
movslq -0x4(%rbp),%rdi
shl    $0x2,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
cltq
mov    %rax,-0x28(%rbp)
movslq -0x4(%rbp),%rdi
shl    $0x2,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
cltq
mov    %rax,-0x30(%rbp)
movslq -0x4(%rbp),%rdi
shl    $0x2,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
cltq
mov    %rax,-0x38(%rbp)
movslq -0x4(%rbp),%rdi
shl    $0x3,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
cltq
mov    %rax,-0x40(%rbp)
movss  0xe21(%rip),%xmm0
ucomiss -0x14(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1060 <assert@plt>
movss  -0x14(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
cvtsi2ssl -0x10(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
cvtsi2ssl -0xc(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12c5 <sift_malloc_scalespace_lowe+0x175>
mov    -0x20(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%edx
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%edx
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd66(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    122e <sift_malloc_scalespace_lowe+0xde>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13af <sift_malloc_scalespace_lowe+0x25f>
mov    -0x8(%rbp),%edx
add    $0x3,%edx
mov    -0x30(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
movslq -0x48(%rbp),%rcx
movslq (%rax,%rcx,4),%rdi
shl    $0x2,%rdi
mov    $0x0,%al
call   1050 <xmalloc@plt>
movslq %eax,%rdx
mov    -0x40(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    -0x8(%rbp),%ecx
add    $0x3,%ecx
cmp    %ecx,%eax
jge    139c <sift_malloc_scalespace_lowe+0x24c>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x38(%rbp),%rax
divss  (%rax),%xmm0
mulss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
cvtsi2ssl -0x4c(%rbp),%xmm0
cvtsi2ssl -0x8(%rbp),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xca4(%rip),%xmm0
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x40(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x4c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1316 <sift_malloc_scalespace_lowe+0x1c6>
jmp    13a1 <sift_malloc_scalespace_lowe+0x251>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    12cc <sift_malloc_scalespace_lowe+0x17c>
mov    -0x4(%rbp),%edi
mov    -0x38(%rbp),%rsi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%r8
mov    -0x40(%rbp),%r9
mov    $0x0,%al
call   1030 <sift_malloc_scalespace@plt>
cltq
mov    %rax,-0x58(%rbp)
mov    -0x38(%rbp),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
mov    -0x20(%rbp),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
mov    -0x28(%rbp),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
mov    -0x30(%rbp),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1433 <sift_malloc_scalespace_lowe+0x2e3>
mov    -0x40(%rbp),%rax
movslq -0x5c(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1406 <sift_malloc_scalespace_lowe+0x2b6>
mov    -0x40(%rbp),%rdi
mov    $0x0,%al
call   1040 <xfree@plt>
mov    -0x58(%rbp),%rax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sift_malloc_scalespace_lowe>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
movss  %xmm1,0x1c(%rsp)
movss  %xmm0,0x10(%rsp)
mov    %ecx,%r14d
mov    %edx,0x20(%rsp)
mov    %rsi,0x38(%rsp)
mov    %edi,%r13d
movslq %edi,%r12
lea    0x0(,%r12,4),%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
movslq %eax,%r15
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
movslq %eax,%rbp
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
mov    %eax,0xc(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
movslq %eax,%rbx
lea    0x0(,%r12,8),%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
mov    %eax,0x28(%rsp)
movss  0xe2c(%rip),%xmm0
xor    %edi,%edi
ucomiss 0x10(%rsp),%xmm0
setae  %dil
xor    %eax,%eax
call   1070 <assert@plt>
movss  0x10(%rsp),%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %r14d,%xmm0
divss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
xorps  %xmm0,%xmm0
cvtsi2ssl 0x20(%rsp),%xmm0
movss  %xmm1,(%rbx)
divss  %xmm1,%xmm0
cvttss2si %xmm0,%edx
mov    %eax,0x0(%rbp)
mov    %edx,(%r15)
mov    %r13d,%r8d
cmp    $0x2,%r12d
jl     1269 <sift_malloc_scalespace_lowe+0x119>
lea    -0x2(%r8),%rax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
mov    %edx,%esi
shr    $0x1f,%esi
add    %edx,%esi
sar    %esi
mov    %esi,0x4(%r15,%rcx,4)
mov    0x0(%rbp,%rcx,4),%edx
mov    %edx,%esi
shr    $0x1f,%esi
add    %edx,%esi
sar    %esi
mov    %esi,0x4(%rbp,%rcx,4)
addss  %xmm1,%xmm1
movss  %xmm1,0x4(%rbx,%rcx,4)
cmp    %rcx,%rax
je     1269 <sift_malloc_scalespace_lowe+0x119>
mov    0x4(%r15,%rcx,4),%edx
add    $0x1,%rcx
jmp    1230 <sift_malloc_scalespace_lowe+0xe0>
mov    %r8,0x20(%rsp)
mov    %rbp,0x48(%rsp)
mov    %r15,0x50(%rsp)
movslq 0xc(%rsp),%rax
mov    %rax,0x40(%rsp)
movslq 0x28(%rsp),%rbp
mov    %r13d,0x34(%rsp)
test   %r13d,%r13d
jle    137f <sift_malloc_scalespace_lowe+0x22f>
mov    0x38(%rsp),%rax
lea    0x3(%rax),%r13d
cltq
lea    0xc(,%rax,4),%rcx
mov    %rcx,0x28(%rsp)
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0xc(%rsp)
cmp    $0x2,%r13d
mov    $0x1,%r14d
cmovge %r13d,%r14d
xor    %r12d,%r12d
jmp    12df <sift_malloc_scalespace_lowe+0x18f>
nopl   (%rax)
add    $0x1,%r12
cmp    0x20(%rsp),%r12
je     137f <sift_malloc_scalespace_lowe+0x22f>
mov    0x40(%rsp),%rax
mov    %r13d,(%rax,%r12,4)
mov    0x28(%rsp),%rdi
xor    %eax,%eax
call   1060 <xmalloc@plt>
cltq
mov    %rax,0x0(%rbp,%r12,8)
cmpl   $0xfffffffe,0x38(%rsp)
movss  0x1c(%rsp),%xmm2
movss  0xc(%rsp),%xmm3
jl     12d0 <sift_malloc_scalespace_lowe+0x180>
xor    %r15d,%r15d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movss  (%rbx,%r12,4),%xmm0
divss  (%rbx),%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %r15d,%xmm1
mulss  %xmm2,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x10(%rsp)
divss  %xmm3,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
call   1050 <exp2@plt>
movss  0xc(%rsp),%xmm3
movss  0x1c(%rsp),%xmm2
mulsd  0x10(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    0x0(%rbp,%r12,8),%rax
movss  %xmm0,(%rax,%r15,4)
add    $0x1,%r15
cmp    %r15,%r14
jne    1320 <sift_malloc_scalespace_lowe+0x1d0>
jmp    12d0 <sift_malloc_scalespace_lowe+0x180>
mov    0x34(%rsp),%r14d
mov    %r14d,%edi
mov    %rbx,%rsi
mov    0x50(%rsp),%r12
mov    %r12,%rdx
mov    0x48(%rsp),%r13
mov    %r13,%rcx
mov    0x40(%rsp),%r15
mov    %r15,%r8
mov    %rbp,%r9
xor    %eax,%eax
call   1030 <sift_malloc_scalespace@plt>
mov    %eax,0x10(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
mov    %r12,%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
mov    %r13,%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
mov    %r15,%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
test   %r14d,%r14d
mov    0x20(%rsp),%r14
jle    1405 <sift_malloc_scalespace_lowe+0x2b5>
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x0(%rbp,%rbx,8),%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
add    $0x1,%rbx
cmp    %rbx,%r14
jne    13f0 <sift_malloc_scalespace_lowe+0x2a0>
movslq 0x10(%rsp),%rbx
mov    %rbp,%rdi
xor    %eax,%eax
call   1040 <xfree@plt>
mov    %rbx,%rax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%struct.sift_scalespace = type opaque
define %struct.sift_scalespace* @sift_malloc_scalespace_lowe(i32 %0, i32 %1, i32 %2, i32 %3, float %4, float %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca float
%12 = alloca float
%13 = alloca i32*
%14 = alloca i32*
%15 = alloca i32*
%16 = alloca float*
%17 = alloca float**
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca %struct.sift_scalespace*
%22 = alloca i32
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store float %4, float* %11
store float %5, float* %12
%23 = load i32, i32* %7
%24 = sext i32 %23 to i64
%25 = mul i64 %24, 4
%26 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %25)
%27 = sext i32 %26 to i64
%28 = inttoptr i64 %27 to i32*
store i32* %28, i32** %13
%29 = load i32, i32* %7
%30 = sext i32 %29 to i64
%31 = mul i64 %30, 4
%32 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %31)
%33 = sext i32 %32 to i64
%34 = inttoptr i64 %33 to i32*
store i32* %34, i32** %14
%35 = load i32, i32* %7
%36 = sext i32 %35 to i64
%37 = mul i64 %36, 4
%38 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %37)
%39 = sext i32 %38 to i64
%40 = inttoptr i64 %39 to i32*
store i32* %40, i32** %15
%41 = load i32, i32* %7
%42 = sext i32 %41 to i64
%43 = mul i64 %42, 4
%44 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %43)
%45 = sext i32 %44 to i64
%46 = inttoptr i64 %45 to float*
store float* %46, float** %16
%47 = load i32, i32* %7
%48 = sext i32 %47 to i64
%49 = mul i64 %48, 8
%50 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %49)
%51 = sext i32 %50 to i64
%52 = inttoptr i64 %51 to float**
store float** %52, float*** %17
%53 = load float, float* %11
%54 = fcmp ole float %53, 1.000000e+00
%55 = zext i1 %54 to i32
%56 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %55)
%57 = load float, float* %11
%58 = load float*, float** %16
%59 = getelementptr inbounds float, float* %58, i64 0
store float %57, float* %59
%60 = load i32, i32* %10
%61 = sitofp i32 %60 to float
%62 = load float, float* %11
%63 = fdiv float %61, %62
%64 = fptosi float %63 to i32
%65 = load i32*, i32** %14
%66 = getelementptr inbounds i32, i32* %65, i64 0
store i32 %64, i32* %66
%67 = load i32, i32* %9
%68 = sitofp i32 %67 to float
%69 = load float, float* %11
%70 = fdiv float %68, %69
%71 = fptosi float %70 to i32
%72 = load i32*, i32** %13
%73 = getelementptr inbounds i32, i32* %72, i64 0
store i32 %71, i32* %73
store i32 1, i32* %18
br label %74
74: ; preds = %114, %6
%75 = load i32, i32* %18
%76 = load i32, i32* %7
%77 = icmp slt i32 %75, %76
br i1 %77, label %78, label %117
78: ; preds = %74
%79 = load i32*, i32** %13
%80 = load i32, i32* %18
%81 = sub nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i32, i32* %79, i64 %82
%84 = load i32, i32* %83
%85 = sdiv i32 %84, 2
%86 = load i32*, i32** %13
%87 = load i32, i32* %18
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i32, i32* %86, i64 %88
store i32 %85, i32* %89
%90 = load i32*, i32** %14
%91 = load i32, i32* %18
%92 = sub nsw i32 %91, 1
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i32, i32* %90, i64 %93
%95 = load i32, i32* %94
%96 = sdiv i32 %95, 2
%97 = load i32*, i32** %14
%98 = load i32, i32* %18
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds i32, i32* %97, i64 %99
store i32 %96, i32* %100
%101 = load float*, float** %16
%102 = load i32, i32* %18
%103 = sub nsw i32 %102, 1
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds float, float* %101, i64 %104
%106 = load float, float* %105
%107 = fpext float %106 to double
%108 = fmul double %107, 2.000000e+00
%109 = fptrunc double %108 to float
%110 = load float*, float** %16
%111 = load i32, i32* %18
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds float, float* %110, i64 %112
store float %109, float* %113
br label %114
114: ; preds = %78
%115 = load i32, i32* %18
%116 = add nsw i32 %115, 1
store i32 %116, i32* %18
br label %74
117: ; preds = %74
store i32 0, i32* %19
br label %118
118: ; preds = %182, %117
%119 = load i32, i32* %19
%120 = load i32, i32* %7
%121 = icmp slt i32 %119, %120
br i1 %121, label %122, label %185
122: ; preds = %118
%123 = load i32, i32* %8
%124 = add nsw i32 %123, 3
%125 = load i32*, i32** %15
%126 = load i32, i32* %19
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds i32, i32* %125, i64 %127
store i32 %124, i32* %128
%129 = load i32*, i32** %15
%130 = load i32, i32* %19
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i32, i32* %129, i64 %131
%133 = load i32, i32* %132
%134 = sext i32 %133 to i64
%135 = mul i64 %134, 4
%136 = call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %135)
%137 = sext i32 %136 to i64
%138 = inttoptr i64 %137 to float*
%139 = load float**, float*** %17
%140 = load i32, i32* %19
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds float*, float** %139, i64 %141
store float* %138, float** %142
store i32 0, i32* %20
br label %143
143: ; preds = %178, %122
%144 = load i32, i32* %20
%145 = load i32, i32* %8
%146 = add nsw i32 %145, 3
%147 = icmp slt i32 %144, %146
br i1 %147, label %148, label %181
148: ; preds = %143
%149 = load float*, float** %16
%150 = load i32, i32* %19
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds float, float* %149, i64 %151
%153 = load float, float* %152
%154 = load float*, float** %16
%155 = getelementptr inbounds float, float* %154, i64 0
%156 = load float, float* %155
%157 = fdiv float %153, %156
%158 = load float, float* %12
%159 = fmul float %157, %158
%160 = fpext float %159 to double
%161 = load i32, i32* %20
%162 = sitofp i32 %161 to float
%163 = load i32, i32* %8
%164 = sitofp i32 %163 to float
%165 = fdiv float %162, %164
%166 = fpext float %165 to double
%167 = call double @pow(double 2.000000e+00, double %166)
%168 = fmul double %160, %167
%169 = fptrunc double %168 to float
%170 = load float**, float*** %17
%171 = load i32, i32* %19
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds float*, float** %170, i64 %172
%174 = load float*, float** %173
%175 = load i32, i32* %20
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds float, float* %174, i64 %176
store float %169, float* %177
br label %178
178: ; preds = %148
%179 = load i32, i32* %20
%180 = add nsw i32 %179, 1
store i32 %180, i32* %20
br label %143
181: ; preds = %143
br label %182
182: ; preds = %181
%183 = load i32, i32* %19
%184 = add nsw i32 %183, 1
store i32 %184, i32* %19
br label %118
185: ; preds = %118
%186 = load i32, i32* %7
%187 = load float*, float** %16
%188 = load i32*, i32** %13
%189 = load i32*, i32** %14
%190 = load i32*, i32** %15
%191 = load float**, float*** %17
%192 = call i32 (i32, float*, i32*, i32*, i32*, float**, ...) bitcast (i32 (...)* @sift_malloc_scalespace to i32 (i32, float*, i32*, i32*, i32*, float**, ...)*)(i32 %186, float* %187, i32* %188, i32* %189, i32* %190, float** %191)
%193 = sext i32 %192 to i64
%194 = inttoptr i64 %193 to %struct.sift_scalespace*
store %struct.sift_scalespace* %194, %struct.sift_scalespace** %21
%195 = load float*, float** %16
%196 = call i32 (float*, ...) bitcast (i32 (...)* @xfree to i32 (float*, ...)*)(float* %195)
%197 = load i32*, i32** %13
%198 = call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %197)
%199 = load i32*, i32** %14
%200 = call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %199)
%201 = load i32*, i32** %15
%202 = call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %201)
store i32 0, i32* %22
br label %203
203: ; preds = %214, %185
%204 = load i32, i32* %22
%205 = load i32, i32* %7
%206 = icmp slt i32 %204, %205
br i1 %206, label %207, label %217
207: ; preds = %203
%208 = load float**, float*** %17
%209 = load i32, i32* %22
%210 = sext i32 %209 to i64
%211 = getelementptr inbounds float*, float** %208, i64 %210
%212 = load float*, float** %211
%213 = call i32 (float*, ...) bitcast (i32 (...)* @xfree to i32 (float*, ...)*)(float* %212)
br label %214
214: ; preds = %207
%215 = load i32, i32* %22
%216 = add nsw i32 %215, 1
store i32 %216, i32* %22
br label %203
217: ; preds = %203
%218 = load float**, float*** %17
%219 = call i32 (float**, ...) bitcast (i32 (...)* @xfree to i32 (float**, ...)*)(float** %218)
%220 = load %struct.sift_scalespace*, %struct.sift_scalespace** %21
ret %struct.sift_scalespace* %220
}

LLVM IR (-O2):
%struct.sift_scalespace = type opaque
define %struct.sift_scalespace* @sift_malloc_scalespace_lowe(i32 %0, i32 %1, i32 %2, i32 %3, float %4, float %5) {
%7 = sext i32 %0 to i64
%8 = shl nsw i64 %7, 2
%9 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %8)
%10 = sext i32 %9 to i64
%11 = inttoptr i64 %10 to i32*
%12 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %8)
%13 = sext i32 %12 to i64
%14 = inttoptr i64 %13 to i32*
%15 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %8)
%16 = sext i32 %15 to i64
%17 = inttoptr i64 %16 to i32*
%18 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %8)
%19 = sext i32 %18 to i64
%20 = inttoptr i64 %19 to float*
%21 = shl nsw i64 %7, 3
%22 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %21)
%23 = sext i32 %22 to i64
%24 = inttoptr i64 %23 to float**
%25 = fcmp ole float %4, 1.000000e+00
%26 = zext i1 %25 to i32
%27 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %26)
store float %4, float* %20
%28 = sitofp i32 %3 to float
%29 = fdiv float %28, %4
%30 = fptosi float %29 to i32
store i32 %30, i32* %14
%31 = sitofp i32 %2 to float
%32 = fdiv float %31, %4
%33 = fptosi float %32 to i32
store i32 %33, i32* %11
%34 = icmp sgt i32 %0, 1
br i1 %34, label %35, label %37
35: ; preds = %6
%36 = zext i32 %0 to i64
br label %48
37: ; preds = %48, %6
%38 = icmp sgt i32 %0, 0
br i1 %38, label %39, label %65
39: ; preds = %37
%40 = add nsw i32 %1, 3
%41 = sext i32 %40 to i64
%42 = shl nsw i64 %41, 2
%43 = icmp sgt i32 %1, -3
%44 = sitofp i32 %1 to float
%45 = call i32 @llvm.smax.i32(i32 %40, i32 1)
%46 = zext i32 %0 to i64
%47 = zext i32 %45 to i64
br label %73
48: ; preds = %63, %35
%49 = phi float [ %4, %35 ], [ %59, %63 ]
%50 = phi i32 [ %33, %35 ], [ %64, %63 ]
%51 = phi i64 [ 1, %35 ], [ %61, %63 ]
%52 = add nsw i64 %51, -1
%53 = sdiv i32 %50, 2
%54 = getelementptr inbounds i32, i32* %11, i64 %51
store i32 %53, i32* %54
%55 = getelementptr inbounds i32, i32* %14, i64 %52
%56 = load i32, i32* %55
%57 = sdiv i32 %56, 2
%58 = getelementptr inbounds i32, i32* %14, i64 %51
store i32 %57, i32* %58
%59 = fmul float %49, 2.000000e+00
%60 = getelementptr inbounds float, float* %20, i64 %51
store float %59, float* %60
%61 = add nuw nsw i64 %51, 1
%62 = icmp eq i64 %61, %36
br i1 %62, label %37, label %63
63: ; preds = %48
%64 = load i32, i32* %54
br label %48
65: ; preds = %82, %37
%66 = tail call i32 (i32, float*, i32*, i32*, i32*, float**, ...) bitcast (i32 (...)* @sift_malloc_scalespace to i32 (i32, float*, i32*, i32*, i32*, float**, ...)*)(i32 %0, float* %20, i32* %11, i32* %14, i32* %17, float** %24)
%67 = tail call i32 (float*, ...) bitcast (i32 (...)* @xfree to i32 (float*, ...)*)(float* %20)
%68 = tail call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %11)
%69 = tail call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %14)
%70 = tail call i32 (i32*, ...) bitcast (i32 (...)* @xfree to i32 (i32*, ...)*)(i32* %17)
br i1 %38, label %71, label %103
71: ; preds = %65
%72 = zext i32 %0 to i64
br label %107
73: ; preds = %39, %82
%74 = phi i64 [ 0, %39 ], [ %83, %82 ]
%75 = getelementptr inbounds i32, i32* %17, i64 %74
store i32 %40, i32* %75
%76 = tail call i32 (i64, ...) bitcast (i32 (...)* @xmalloc to i32 (i64, ...)*)(i64 %42)
%77 = sext i32 %76 to i64
%78 = inttoptr i64 %77 to float*
%79 = getelementptr inbounds float*, float** %24, i64 %74
store float* %78, float** %79
br i1 %43, label %80, label %82
80: ; preds = %73
%81 = getelementptr inbounds float, float* %20, i64 %74
br label %85
82: ; preds = %85, %73
%83 = add nuw nsw i64 %74, 1
%84 = icmp eq i64 %83, %46
br i1 %84, label %65, label %73
85: ; preds = %80, %85
%86 = phi i64 [ 0, %80 ], [ %101, %85 ]
%87 = load float, float* %81
%88 = load float, float* %20
%89 = fdiv float %87, %88
%90 = fmul float %89, %5
%91 = fpext float %90 to double
%92 = trunc i64 %86 to i32
%93 = sitofp i32 %92 to float
%94 = fdiv float %93, %44
%95 = fpext float %94 to double
%96 = tail call double @exp2(double %95)
%97 = fmul double %96, %91
%98 = fptrunc double %97 to float
%99 = load float*, float** %79
%100 = getelementptr inbounds float, float* %99, i64 %86
store float %98, float* %100
%101 = add nuw nsw i64 %86, 1
%102 = icmp eq i64 %101, %47
br i1 %102, label %82, label %85
103: ; preds = %107, %65
%104 = sext i32 %66 to i64
%105 = inttoptr i64 %104 to %struct.sift_scalespace*
%106 = tail call i32 (float**, ...) bitcast (i32 (...)* @xfree to i32 (float**, ...)*)(float** %24)
ret %struct.sift_scalespace* %105
107: ; preds = %71, %107
%108 = phi i64 [ 0, %71 ], [ %112, %107 ]
%109 = getelementptr inbounds float*, float** %24, i64 %108
%110 = load float*, float** %109
%111 = tail call i32 (float*, ...) bitcast (i32 (...)* @xfree to i32 (float*, ...)*)(float* %110)
%112 = add nuw nsw i64 %108, 1
%113 = icmp eq i64 %112, %72
br i1 %113, label %103, label %107
}