float dscf_line_brute(search, where, params, n, what, whom)
int n;
float search[], params[], *where[];
float (*what)();
void *whom;
{
  float beststep, step, dstep, myval, bestval;
  float steps[100], vals[100];
  float Loose_Ritz_product(), Ritz_orth(), Ritz_product(), INDO_Ritz_product(),
      tight_INDO_Ritz_product();
  float Cached_Ritz_orth();
  int inbuf;
  int nfunc;
  int i, irun, itry;
  if (what == Ritz_orth || what == Loose_Ritz_product)
    what = Cached_Ritz_orth;
  inbuf = 1;
  steps[0] = 0.;
  if (what == Cached_Ritz_orth) {
    vals[0] = (*what)(whom, -1);
  } else {
    vals[0] = (*what)(whom);
  }
  bestval = vals[0];
  nfunc = 1;
  step = 0.;
  beststep = step;
  dstep = 1.;
  dstep = .1;
  for (itry = 0; itry < 7; itry++) {
    for (irun = 0; irun < 100; irun++) {
      step += dstep;
      for (i = 0; i < inbuf; i++) {
        if (step == steps[i]) {
          myval = vals[i];
          goto STEP_FOUND;
        }
      }
      for (i = 0; i < n; i++) {
        *where[i] = params[i] + search[i] * step;
      }
      if (what == Cached_Ritz_orth) {
        myval = (*what)(whom, 0);
      } else {
        myval = (*what)(whom);
      }
      nfunc++;
      if (inbuf == 100) {
        if (what == Cached_Ritz_orth) {
          (*what)(whom, 1);
        }
        return beststep;
      }
      assert(inbuf < 100);
      if (inbuf < 100) {
        vals[inbuf] = myval;
        steps[inbuf++] = step;
      } else {
        inbuf -= 10;
      }
    STEP_FOUND:
      if (myval >= bestval) {
        step -= dstep;
        dstep = -dstep * .1;
        break;
      } else {
        bestval = myval;
        beststep = step;
      }
    }
  }
  for (i = 0; i < n; i++) {
    *where[i] = params[i] + search[i] * beststep;
  }
  printf("%d function calls \n", nfunc);
  if (what == Cached_Ritz_orth) {
    (*what)(whom, 1);
  }
  return beststep;
}


x86 assembly (clang, -O0):
<dscf_line_brute>:
push   %rbp
mov    %rsp,%rbp
sub    $0x390,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    0x2e8f(%rip),%rax
cmp    %rax,-0x30(%rbp)
je     1164 <dscf_line_brute+0x44>
mov    0x2e8e(%rip),%rax
cmp    %rax,-0x30(%rbp)
jne    116f <dscf_line_brute+0x4f>
mov    0x2e75(%rip),%rax
mov    %rax,-0x30(%rbp)
movl   $0x1,-0x374(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1e0(%rbp)
ff
mov    0x2e55(%rip),%rax
cmp    %rax,-0x30(%rbp)
jne    11b3 <dscf_line_brute+0x93>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
mov    $0xffffffff,%esi
mov    $0x0,%al
call   *%rcx
movss  %xmm0,-0x370(%rbp)
ff
jmp    11c7 <dscf_line_brute+0xa7>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
mov    $0x0,%al
call   *%rcx
movss  %xmm0,-0x370(%rbp)
ff
movss  -0x370(%rbp),%xmm0
ff
movss  %xmm0,-0x4c(%rbp)
movl   $0x1,-0x378(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  0xe0c(%rip),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  0xdfb(%rip),%xmm0
movss  %xmm0,-0x44(%rbp)
movl   $0x0,-0x384(%rbp)
cmpl   $0x7,-0x384(%rbp)
jge    14b4 <dscf_line_brute+0x394>
movl   $0x0,-0x380(%rbp)
cmpl   $0x64,-0x380(%rbp)
jge    149b <dscf_line_brute+0x37b>
movss  -0x44(%rbp),%xmm0
addss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movl   $0x0,-0x37c(%rbp)
mov    -0x37c(%rbp),%eax
cmp    -0x374(%rbp),%eax
jge    12b6 <dscf_line_brute+0x196>
movss  -0x40(%rbp),%xmm0
movslq -0x37c(%rbp),%rax
ucomiss -0x1e0(%rbp,%rax,4),%xmm0
ff
jne    129d <dscf_line_brute+0x17d>
jp     129d <dscf_line_brute+0x17d>
movslq -0x37c(%rbp),%rax
movss  -0x370(%rbp,%rax,4),%xmm0
ff ff
movss  %xmm0,-0x48(%rbp)
jmp    141c <dscf_line_brute+0x2fc>
jmp    12a2 <dscf_line_brute+0x182>
mov    -0x37c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x37c(%rbp)
jmp    1251 <dscf_line_brute+0x131>
movl   $0x0,-0x37c(%rbp)
mov    -0x37c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1323 <dscf_line_brute+0x203>
mov    -0x20(%rbp),%rax
movslq -0x37c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x37c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x40(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x37c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movss  %xmm0,(%rax)
mov    -0x37c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x37c(%rbp)
jmp    12c0 <dscf_line_brute+0x1a0>
mov    0x2cb6(%rip),%rax
cmp    %rax,-0x30(%rbp)
jne    134c <dscf_line_brute+0x22c>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
xor    %esi,%esi
mov    $0x0,%al
call   *%rcx
movss  %xmm0,-0x48(%rbp)
jmp    135d <dscf_line_brute+0x23d>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
mov    $0x0,%al
call   *%rcx
movss  %xmm0,-0x48(%rbp)
mov    -0x378(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x378(%rbp)
cmpl   $0x64,-0x374(%rbp)
jne    13aa <dscf_line_brute+0x28a>
mov    0x2c60(%rip),%rax
cmp    %rax,-0x30(%rbp)
jne    139b <dscf_line_brute+0x27b>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
mov    $0x1,%esi
mov    $0x0,%al
call   *%rcx
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1561 <dscf_line_brute+0x441>
cmpl   $0x64,-0x374(%rbp)
setl   %al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1040 <assert@plt>
cmpl   $0x64,-0x374(%rbp)
jge    1408 <dscf_line_brute+0x2e8>
movss  -0x48(%rbp),%xmm0
movslq -0x374(%rbp),%rax
movss  %xmm0,-0x370(%rbp,%rax,4)
ff ff
movss  -0x40(%rbp),%xmm0
mov    -0x374(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x374(%rbp)
cltq
movss  %xmm0,-0x1e0(%rbp,%rax,4)
ff ff
jmp    1417 <dscf_line_brute+0x2f7>
mov    -0x374(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x374(%rbp)
jmp    141c <dscf_line_brute+0x2fc>
movss  -0x48(%rbp),%xmm0
ucomiss -0x4c(%rbp),%xmm0
jb     146e <dscf_line_brute+0x34e>
movss  -0x44(%rbp),%xmm1
movss  -0x40(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x44(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbac(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    149b <dscf_line_brute+0x37b>
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    1487 <dscf_line_brute+0x367>
mov    -0x380(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x380(%rbp)
jmp    122b <dscf_line_brute+0x10b>
jmp    14a0 <dscf_line_brute+0x380>
mov    -0x384(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x384(%rbp)
jmp    1214 <dscf_line_brute+0xf4>
movl   $0x0,-0x37c(%rbp)
mov    -0x37c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1521 <dscf_line_brute+0x401>
mov    -0x20(%rbp),%rax
movslq -0x37c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x37c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x3c(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x37c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movss  %xmm0,(%rax)
mov    -0x37c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x37c(%rbp)
jmp    14be <dscf_line_brute+0x39e>
mov    -0x378(%rbp),%esi
lea    0xae2(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    0x2aa4(%rip),%rax
cmp    %rax,-0x30(%rbp)
jne    1557 <dscf_line_brute+0x437>
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdi
mov    $0x1,%esi
mov    $0x0,%al
call   *%rcx
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x390,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dscf_line_brute>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x378,%rsp
cmp    0x2ea0(%rip),%r8
mov    %ecx,0x14(%rsp)
mov    %rdx,%r12
mov    %rsi,%r15
mov    %rdi,%rbx
sete   %al
cmp    0x2e99(%rip),%r8
sete   %cl
or     %al,%cl
cmp    0x2e85(%rip),%r8
movl   $0x0,0x1e0(%rsp)
sete   %al
or     %cl,%al
mov    %al,0xf(%rsp)
cmp    $0x1,%al
mov    %r9,0x30(%rsp)
mov    %r9,%rdi
jne    1195 <dscf_line_brute+0x75>
mov    $0xffffffff,%esi
xor    %eax,%eax
call   1050 <Cached_Ritz_orth@plt>
mov    0x2e52(%rip),%rax
mov    %rax,0x40(%rsp)
jmp    119f <dscf_line_brute+0x7f>
xor    %eax,%eax
mov    %r8,0x40(%rsp)
call   *%r8
movss  %xmm0,0x50(%rsp)
mov    0x14(%rsp),%r14d
lea    -0x1(%r14),%rax
mov    %rax,0x48(%rsp)
mov    %r14,0x38(%rsp)
and    $0xfffffffe,%r14d
xorps  %xmm3,%xmm3
movss  0xe39(%rip),%xmm1
movss  %xmm1,0x18(%rsp)
movl   $0x1,0x24(%rsp)
xor    %eax,%eax
mov    $0x1,%r13d
xorps  %xmm1,%xmm1
jmp    1220 <dscf_line_brute+0x100>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  0x18(%rsp),%xmm2
subss  %xmm2,%xmm3
cvtss2sd %xmm2,%xmm2
mulsd  0xe02(%rip),%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,0x18(%rsp)
mov    0x20(%rsp),%eax
add    $0x1,%eax
cmp    $0x7,%eax
je     1417 <dscf_line_brute+0x2f7>
mov    %eax,0x20(%rsp)
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
addss  0x18(%rsp),%xmm3
test   %r13d,%r13d
jle    1259 <dscf_line_brute+0x139>
mov    %r13d,%eax
xor    %ecx,%ecx
ucomiss 0x1e0(%rsp,%rcx,4),%xmm3
jne    1250 <dscf_line_brute+0x130>
jnp    13a0 <dscf_line_brute+0x280>
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1240 <dscf_line_brute+0x120>
cmpl   $0x0,0x14(%rsp)
jle    12c8 <dscf_line_brute+0x1a8>
cmpq   $0x0,0x48(%rsp)
je     13c3 <dscf_line_brute+0x2a3>
xor    %eax,%eax
xchg   %ax,%ax
movss  (%rbx,%rax,4),%xmm2
mulss  %xmm3,%xmm2
addss  (%r12,%rax,4),%xmm2
mov    (%r15,%rax,8),%rcx
movss  %xmm2,(%rcx)
movss  0x4(%rbx,%rax,4),%xmm2
mulss  %xmm3,%xmm2
addss  0x4(%r12,%rax,4),%xmm2
mov    0x8(%r15,%rax,8),%rcx
movss  %xmm2,(%rcx)
add    $0x2,%rax
cmp    %rax,%r14
jne    1270 <dscf_line_brute+0x150>
testb  $0x1,0x38(%rsp)
je     12c8 <dscf_line_brute+0x1a8>
movss  (%rbx,%rax,4),%xmm2
mulss  %xmm3,%xmm2
addss  (%r12,%rax,4),%xmm2
mov    (%r15,%rax,8),%rax
movss  %xmm2,(%rax)
cmpb   $0x0,0xf(%rsp)
movss  %xmm1,0x10(%rsp)
movss  %xmm0,0x2c(%rsp)
movss  %xmm3,0x28(%rsp)
je     1300 <dscf_line_brute+0x1e0>
mov    0x30(%rsp),%rdi
xor    %esi,%esi
xor    %eax,%eax
call   1050 <Cached_Ritz_orth@plt>
cmp    $0x64,%r13d
jne    1315 <dscf_line_brute+0x1f5>
jmp    13eb <dscf_line_brute+0x2cb>
nopw   0x0(%rax,%rax,1)
mov    0x30(%rsp),%rdi
xor    %eax,%eax
call   *0x40(%rsp)
cmp    $0x64,%r13d
je     13ff <dscf_line_brute+0x2df>
movss  %xmm0,0x1c(%rsp)
addl   $0x1,0x24(%rsp)
xor    %edi,%edi
cmp    $0x64,%r13d
setl   %dil
xor    %eax,%eax
call   1040 <assert@plt>
cmp    $0x63,%r13d
jg     1370 <dscf_line_brute+0x250>
movslq %r13d,%rax
movss  0x1c(%rsp),%xmm2
movss  %xmm2,0x50(%rsp,%rax,4)
add    $0x1,%r13d
movss  0x28(%rsp),%xmm3
movss  %xmm3,0x1e0(%rsp,%rax,4)
movss  0x10(%rsp),%xmm1
movss  0x2c(%rsp),%xmm0
ucomiss %xmm0,%xmm2
jb     13af <dscf_line_brute+0x28f>
jmp    11f0 <dscf_line_brute+0xd0>
nop
add    $0xfffffff6,%r13d
movss  0x10(%rsp),%xmm1
movss  0x2c(%rsp),%xmm0
movss  0x28(%rsp),%xmm3
movss  0x1c(%rsp),%xmm2
ucomiss %xmm0,%xmm2
jb     13af <dscf_line_brute+0x28f>
jmp    11f0 <dscf_line_brute+0xd0>
cs nopw 0x0(%rax,%rax,1)
movss  0x50(%rsp,%rcx,4),%xmm2
ucomiss %xmm0,%xmm2
jae    11f0 <dscf_line_brute+0xd0>
add    $0x1,%ebp
movaps %xmm2,%xmm0
movaps %xmm3,%xmm1
cmp    $0x64,%ebp
jne    1230 <dscf_line_brute+0x110>
jmp    13e0 <dscf_line_brute+0x2c0>
xor    %eax,%eax
testb  $0x1,0x38(%rsp)
jne    12b1 <dscf_line_brute+0x191>
jmp    12c8 <dscf_line_brute+0x1a8>
cs nopw 0x0(%rax,%rax,1)
nop
movaps %xmm3,%xmm1
movaps %xmm2,%xmm0
jmp    1210 <dscf_line_brute+0xf0>
mov    0x30(%rsp),%rbp
mov    %rbp,%rdi
mov    $0x1,%esi
xor    %eax,%eax
call   1050 <Cached_Ritz_orth@plt>
movss  0x10(%rsp),%xmm0
add    $0x378,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmpl   $0x0,0x14(%rsp)
mov    0x30(%rsp),%rbp
jle    1498 <dscf_line_brute+0x378>
cmpq   $0x0,0x48(%rsp)
je     14c0 <dscf_line_brute+0x3a0>
mov    0x38(%rsp),%rcx
and    $0xfffffffe,%ecx
xor    %eax,%eax
nopl   0x0(%rax)
movss  (%rbx,%rax,4),%xmm0
mulss  %xmm1,%xmm0
addss  (%r12,%rax,4),%xmm0
mov    (%r15,%rax,8),%rdx
movss  %xmm0,(%rdx)
movss  0x4(%rbx,%rax,4),%xmm0
mulss  %xmm1,%xmm0
addss  0x4(%r12,%rax,4),%xmm0
mov    0x8(%r15,%rax,8),%rdx
movss  %xmm0,(%rdx)
add    $0x2,%rax
cmp    %rax,%rcx
jne    1440 <dscf_line_brute+0x320>
testb  $0x1,0x38(%rsp)
je     1498 <dscf_line_brute+0x378>
movss  (%rbx,%rax,4),%xmm0
mulss  %xmm1,%xmm0
addss  (%r12,%rax,4),%xmm0
mov    (%r15,%rax,8),%rax
movss  %xmm0,(%rax)
movss  %xmm1,0x10(%rsp)
lea    0xb6b(%rip),%rdi
mov    0x24(%rsp),%esi
xor    %eax,%eax
call   1030 <printf@plt>
cmpb   $0x0,0xf(%rsp)
jne    13f0 <dscf_line_brute+0x2d0>
jmp    13ff <dscf_line_brute+0x2df>
xor    %eax,%eax
testb  $0x1,0x38(%rsp)
jne    1481 <dscf_line_brute+0x361>
jmp    1498 <dscf_line_brute+0x378>

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

LLVM IR (-O2):
@.str = [20 x i8] c"%d function calls \0A\00"
define float @dscf_line_brute(float* nocapture %0, float** nocapture %1, float* nocapture %2, i32 %3, float (...)* %4, i8* %5) {
%7 = alloca [100 x float]
%8 = alloca [100 x float]
%9 = bitcast [100 x float]* %7 to i8*
%10 = bitcast [100 x float]* %8 to i8*
%11 = icmp eq float (...)* %4, @Ritz_orth
%12 = icmp eq float (...)* %4, @Loose_Ritz_product
%13 = or i1 %11, %12
%14 = getelementptr inbounds [100 x float], [100 x float]* %7, i64 0, i64 0
store float 0.000000e+00, float* %14
%15 = icmp eq float (...)* %4, @Cached_Ritz_orth
%16 = or i1 %15, %13
br i1 %16, label %17, label %19
17: ; preds = %6
%18 = tail call float (i8*, i32, ...) bitcast (float (...)* @Cached_Ritz_orth to float (i8*, i32, ...)*)(i8* %5, i32 -1)
br label %22
19: ; preds = %6
%20 = bitcast float (...)* %4 to float (i8*, ...)*
%21 = tail call float (i8*, ...) %20(i8* %5)
br label %22
22: ; preds = %19, %17
%23 = phi float (i8*, ...)* [ %20, %19 ], [ bitcast (float (...)* @Cached_Ritz_orth to float (i8*, ...)*), %17 ]
%24 = phi float [ %21, %19 ], [ %18, %17 ]
%25 = getelementptr inbounds [100 x float], [100 x float]* %8, i64 0, i64 0
store float %24, float* %25
%26 = icmp sgt i32 %3, 0
%27 = zext i32 %3 to i64
%28 = add nsw i64 %27, -1
%29 = and i64 %27, 1
%30 = icmp eq i64 %28, 0
%31 = and i64 %27, 4294967294
%32 = icmp eq i64 %29, 0
br label %33
33: ; preds = %22, %137
%34 = phi i32 [ 0, %22 ], [ %142, %137 ]
%35 = phi i32 [ 1, %22 ], [ %129, %137 ]
%36 = phi i32 [ 1, %22 ], [ %128, %137 ]
%37 = phi float [ %24, %22 ], [ %139, %137 ]
%38 = phi float [ 0x3FB99999A0000000, %22 ], [ %141, %137 ]
%39 = phi float [ 0.000000e+00, %22 ], [ %140, %137 ]
%40 = phi float [ 0.000000e+00, %22 ], [ %138, %137 ]
br label %50
41: ; preds = %137
br i1 %26, label %42, label %176
42: ; preds = %41
%43 = and i64 %27, 1
%44 = icmp eq i64 %28, 0
br i1 %44, label %165, label %45
45: ; preds = %42
%46 = and i64 %27, 4294967294
br label %144
47: ; preds = %126
%48 = add nuw nsw i32 %51, 1
%49 = icmp eq i32 %48, 100
br i1 %49, label %137, label %50
50: ; preds = %33, %47
%51 = phi i32 [ 0, %33 ], [ %48, %47 ]
%52 = phi i32 [ %35, %33 ], [ %129, %47 ]
%53 = phi i32 [ %36, %33 ], [ %128, %47 ]
%54 = phi float [ %37, %33 ], [ %127, %47 ]
%55 = phi float [ %39, %33 ], [ %57, %47 ]
%56 = phi float [ %40, %33 ], [ %57, %47 ]
%57 = fadd float %38, %55
%58 = icmp sgt i32 %53, 0
br i1 %58, label %59, label %61
59: ; preds = %50
%60 = zext i32 %53 to i64
br label %63
61: ; preds = %72, %50
br i1 %26, label %62, label %106
62: ; preds = %61
br i1 %30, label %96, label %75
63: ; preds = %59, %72
%64 = phi i64 [ 0, %59 ], [ %73, %72 ]
%65 = getelementptr inbounds [100 x float], [100 x float]* %7, i64 0, i64 %64
%66 = load float, float* %65
%67 = fcmp oeq float %57, %66
br i1 %67, label %68, label %72
68: ; preds = %63
%69 = and i64 %64, 4294967295
%70 = getelementptr inbounds [100 x float], [100 x float]* %8, i64 0, i64 %69
%71 = load float, float* %70
br label %126
72: ; preds = %63
%73 = add nuw nsw i64 %64, 1
%74 = icmp eq i64 %73, %60
br i1 %74, label %61, label %63
75: ; preds = %62, %75
%76 = phi i64 [ %93, %75 ], [ 0, %62 ]
%77 = phi i64 [ %94, %75 ], [ 0, %62 ]
%78 = getelementptr inbounds float, float* %2, i64 %76
%79 = load float, float* %78
%80 = getelementptr inbounds float, float* %0, i64 %76
%81 = load float, float* %80
%82 = tail call float @llvm.fmuladd.f32(float %81, float %57, float %79)
%83 = getelementptr inbounds float*, float** %1, i64 %76
%84 = load float*, float** %83
store float %82, float* %84
%85 = or i64 %76, 1
%86 = getelementptr inbounds float, float* %2, i64 %85
%87 = load float, float* %86
%88 = getelementptr inbounds float, float* %0, i64 %85
%89 = load float, float* %88
%90 = tail call float @llvm.fmuladd.f32(float %89, float %57, float %87)
%91 = getelementptr inbounds float*, float** %1, i64 %85
%92 = load float*, float** %91
store float %90, float* %92
%93 = add nuw nsw i64 %76, 2
%94 = add i64 %77, 2
%95 = icmp eq i64 %94, %31
br i1 %95, label %96, label %75
96: ; preds = %75, %62
%97 = phi i64 [ 0, %62 ], [ %93, %75 ]
br i1 %32, label %106, label %98
98: ; preds = %96
%99 = getelementptr inbounds float, float* %2, i64 %97
%100 = load float, float* %99
%101 = getelementptr inbounds float, float* %0, i64 %97
%102 = load float, float* %101
%103 = tail call float @llvm.fmuladd.f32(float %102, float %57, float %100)
%104 = getelementptr inbounds float*, float** %1, i64 %97
%105 = load float*, float** %104
store float %103, float* %105
br label %106
106: ; preds = %98, %96, %61
br i1 %16, label %107, label %110
107: ; preds = %106
%108 = tail call float (i8*, i32, ...) bitcast (float (...)* @Cached_Ritz_orth to float (i8*, i32, ...)*)(i8* %5, i32 0)
%109 = icmp eq i32 %53, 100
br i1 %109, label %178, label %113
110: ; preds = %106
%111 = tail call float (i8*, ...) %23(i8* %5)
%112 = icmp eq i32 %53, 100
br i1 %112, label %181, label %113
113: ; preds = %110, %107
%114 = phi float [ %111, %110 ], [ %108, %107 ]
%115 = add nsw i32 %52, 1
%116 = icmp slt i32 %53, 100
%117 = zext i1 %116 to i32
%118 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %117)
br i1 %116, label %119, label %124
119: ; preds = %113
%120 = sext i32 %53 to i64
%121 = getelementptr inbounds [100 x float], [100 x float]* %8, i64 0, i64 %120
store float %114, float* %121
%122 = add nsw i32 %53, 1
%123 = getelementptr inbounds [100 x float], [100 x float]* %7, i64 0, i64 %120
store float %57, float* %123
br label %126
124: ; preds = %113
%125 = add nsw i32 %53, -10
br label %126
126: ; preds = %119, %124, %68
%127 = phi float [ %71, %68 ], [ %114, %119 ], [ %114, %124 ]
%128 = phi i32 [ %53, %68 ], [ %122, %119 ], [ %125, %124 ]
%129 = phi i32 [ %52, %68 ], [ %115, %119 ], [ %115, %124 ]
%130 = fcmp ult float %127, %54
br i1 %130, label %47, label %131
131: ; preds = %126
%132 = fsub float %57, %38
%133 = fneg float %38
%134 = fpext float %133 to double
%135 = fmul double %134, 1.000000e-01
%136 = fptrunc double %135 to float
br label %137
137: ; preds = %47, %131
%138 = phi float [ %56, %131 ], [ %57, %47 ]
%139 = phi float [ %54, %131 ], [ %127, %47 ]
%140 = phi float [ %132, %131 ], [ %57, %47 ]
%141 = phi float [ %136, %131 ], [ %38, %47 ]
%142 = add nuw nsw i32 %34, 1
%143 = icmp eq i32 %142, 7
br i1 %143, label %41, label %33
144: ; preds = %144, %45
%145 = phi i64 [ 0, %45 ], [ %162, %144 ]
%146 = phi i64 [ 0, %45 ], [ %163, %144 ]
%147 = getelementptr inbounds float, float* %2, i64 %145
%148 = load float, float* %147
%149 = getelementptr inbounds float, float* %0, i64 %145
%150 = load float, float* %149
%151 = tail call float @llvm.fmuladd.f32(float %150, float %138, float %148)
%152 = getelementptr inbounds float*, float** %1, i64 %145
%153 = load float*, float** %152
store float %151, float* %153
%154 = or i64 %145, 1
%155 = getelementptr inbounds float, float* %2, i64 %154
%156 = load float, float* %155
%157 = getelementptr inbounds float, float* %0, i64 %154
%158 = load float, float* %157
%159 = tail call float @llvm.fmuladd.f32(float %158, float %138, float %156)
%160 = getelementptr inbounds float*, float** %1, i64 %154
%161 = load float*, float** %160
store float %159, float* %161
%162 = add nuw nsw i64 %145, 2
%163 = add i64 %146, 2
%164 = icmp eq i64 %163, %46
br i1 %164, label %165, label %144
165: ; preds = %144, %42
%166 = phi i64 [ 0, %42 ], [ %162, %144 ]
%167 = icmp eq i64 %43, 0
br i1 %167, label %176, label %168
168: ; preds = %165
%169 = getelementptr inbounds float, float* %2, i64 %166
%170 = load float, float* %169
%171 = getelementptr inbounds float, float* %0, i64 %166
%172 = load float, float* %171
%173 = tail call float @llvm.fmuladd.f32(float %172, float %138, float %170)
%174 = getelementptr inbounds float*, float** %1, i64 %166
%175 = load float*, float** %174
store float %173, float* %175
br label %176
176: ; preds = %168, %165, %41
%177 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i32 %129)
br i1 %16, label %178, label %181
178: ; preds = %107, %176
%179 = phi float [ %138, %176 ], [ %56, %107 ]
%180 = tail call float (i8*, i32, ...) bitcast (float (...)* @Cached_Ritz_orth to float (i8*, i32, ...)*)(i8* %5, i32 1)
br label %181
181: ; preds = %110, %178, %176
%182 = phi float [ %138, %176 ], [ %179, %178 ], [ %56, %110 ]
ret float %182
}