float egrid(float (*func)(float a[], float x, float y), float xmin, float xmax,
            float ymin, float ymax, float a[]) {
  void minmaxphi(float xmin, float xmax, float ymin, float ymax, float a[],
                 float *minphi, float *maxphi, int quad[]);
  void minmaxrad(float xmin, float xmax, float ymin, float ymax, float a[],
                 float *minr, float *maxr);
  float phi2xy(float phi, float r, float a[], float *x, float *y);
  void swap(float *min, float *max);
  float traparea(float a[], float cphi, float r);
  float xf[33], yf[3], minphi, maxphi, minr, maxr, x, y, theta, r, cphi, flux,
      dphi, dflux, temp;
  int i, done = 0, centpix = 0, quad[5] = {0, 0, 0, 0, 0};
  a[9] = -(a[9] - 3.14159265352982 / 2.);
  if (xmin > xmax)
    swap(&xmin, &xmax);
  if (ymin > ymax)
    swap(&ymin, &ymax);
  minmaxphi(xmin, xmax, ymin, ymax, a, &minphi, &maxphi, quad);
  minmaxrad(xmin, xmax, ymin, ymax, a, &minr, &maxr);
  if ((xmin <= a[1] && xmax >= a[1]) && (ymin <= a[2] && ymax >= a[2]) ||
      quad[0] == 1) {
    minr = 0.;
    centpix = 1;
    if ((xmin < a[1] && xmax > a[1]) && (ymin < a[2] && ymax > a[2])) {
      minphi = 0.;
      maxphi = 2. * 3.14159265352982;
    };
  }
  maxr = maxr / a[8];
  minr = minr * a[8];
  if (minr == 0.)
    centpix = 1;
  flux = 0.;
  dphi = 1.0 / 180. * 3.14159265352982;
  for (cphi = minphi; cphi <= maxphi; cphi += dphi) {
    r = maxr;
    done = 0;
    while (!done && r >= minr) {
      r = r / (1 + 0.01);
      phi2xy(cphi, r, a, &x, &y);
      if (x >= xmin && x <= xmax && y >= ymin && y <= ymax) {
        dflux = func(a, x, y) * traparea(a, cphi, r);
        flux += dflux;
        if (centpix && (dflux / flux) < 1.e-5)
          done = 1;
      } else if (r < minr)
        done = 1;
    };
  };
  a[9] = (-a[9] + 3.14159265352982 / 2.);
  return (flux);
}


x86 assembly (clang, -O0):
<egrid>:
push   %rbp
mov    %rsp,%rbp
sub    $0x120,%rsp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
movss  %xmm2,-0x14(%rbp)
movss  %xmm3,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movl   $0x0,-0xf8(%rbp)
movl   $0x0,-0xfc(%rbp)
lea    -0x110(%rbp),%rdi
xor    %esi,%esi
mov    $0x14,%edx
call   1040 <memset@plt>
mov    -0x20(%rbp),%rax
movss  0x24(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3d(%rip),%xmm1
subsd  %xmm1,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x24(%rax)
movss  -0xc(%rbp),%xmm0
ucomiss -0x10(%rbp),%xmm0
jbe    1207 <egrid+0xa7>
lea    -0xc(%rbp),%rdi
lea    -0x10(%rbp),%rsi
call   1080 <swap@plt>
movss  -0x14(%rbp),%xmm0
ucomiss -0x18(%rbp),%xmm0
jbe    1223 <egrid+0xc3>
lea    -0x14(%rbp),%rdi
lea    -0x18(%rbp),%rsi
call   1080 <swap@plt>
movss  -0xc(%rbp),%xmm0
movss  -0x10(%rbp),%xmm1
movss  -0x14(%rbp),%xmm2
movss  -0x18(%rbp),%xmm3
mov    -0x20(%rbp),%rdi
lea    -0x110(%rbp),%rcx
lea    -0xc0(%rbp),%rsi
lea    -0xc4(%rbp),%rdx
call   1070 <minmaxphi@plt>
movss  -0xc(%rbp),%xmm0
movss  -0x10(%rbp),%xmm1
movss  -0x14(%rbp),%xmm2
movss  -0x18(%rbp),%xmm3
mov    -0x20(%rbp),%rdi
lea    -0xc8(%rbp),%rsi
lea    -0xcc(%rbp),%rdx
call   1030 <minmaxrad@plt>
movss  -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jb     12d4 <egrid+0x174>
movss  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
jb     12d4 <egrid+0x174>
movss  -0x14(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  0x8(%rax),%xmm0
ucomiss %xmm1,%xmm0
jb     12d4 <egrid+0x174>
movss  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x8(%rax),%xmm0
jae    12e1 <egrid+0x181>
cmpl   $0x1,-0x110(%rbp)
jne    136a <egrid+0x20a>
xorps  %xmm0,%xmm0
movss  %xmm0,-0xc8(%rbp)
ff
movl   $0x1,-0xfc(%rbp)
movss  -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1365 <egrid+0x205>
movss  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
jbe    1365 <egrid+0x205>
movss  -0x14(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  0x8(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1365 <egrid+0x205>
movss  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x8(%rax),%xmm0
jbe    1365 <egrid+0x205>
xorps  %xmm0,%xmm0
movss  %xmm0,-0xc0(%rbp)
ff
movss  0xcbb(%rip),%xmm0
movss  %xmm0,-0xc4(%rbp)
ff
jmp    136a <egrid+0x20a>
movss  -0xcc(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
divss  0x20(%rax),%xmm0
movss  %xmm0,-0xcc(%rbp)
ff
movss  -0xc8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mulss  0x20(%rax),%xmm0
movss  %xmm0,-0xc8(%rbp)
ff
movss  -0xc8(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13c5 <egrid+0x265>
jp     13c5 <egrid+0x265>
movl   $0x1,-0xfc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0xe4(%rbp)
ff
movss  0xc44(%rip),%xmm0
movss  %xmm0,-0xe8(%rbp)
ff
movss  -0xc0(%rbp),%xmm0
ff
movss  %xmm0,-0xe0(%rbp)
ff
movss  -0xe0(%rbp),%xmm1
ff
movss  -0xc4(%rbp),%xmm0
ff
ucomiss %xmm1,%xmm0
jb     15f9 <egrid+0x499>
movss  -0xcc(%rbp),%xmm0
ff
movss  %xmm0,-0xdc(%rbp)
ff
movl   $0x0,-0xf8(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0xf8(%rbp)
mov    %al,-0x111(%rbp)
jne    1450 <egrid+0x2f0>
movss  -0xdc(%rbp),%xmm0
ff
ucomiss -0xc8(%rbp),%xmm0
setae  %al
mov    %al,-0x111(%rbp)
mov    -0x111(%rbp),%al
test   $0x1,%al
jne    1463 <egrid+0x303>
jmp    15d7 <egrid+0x477>
movss  -0xdc(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm0
movsd  0xb91(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xdc(%rbp)
ff
movss  -0xe0(%rbp),%xmm0
ff
movss  -0xdc(%rbp),%xmm1
ff
mov    -0x20(%rbp),%rdi
lea    -0xd0(%rbp),%rsi
lea    -0xd4(%rbp),%rdx
call   1060 <phi2xy@plt>
movss  -0xd0(%rbp),%xmm0
ff
ucomiss -0xc(%rbp),%xmm0
jb     15aa <egrid+0x44a>
movss  -0xd0(%rbp),%xmm1
ff
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     15aa <egrid+0x44a>
movss  -0xd4(%rbp),%xmm0
ff
ucomiss -0x14(%rbp),%xmm0
jb     15aa <egrid+0x44a>
movss  -0xd4(%rbp),%xmm1
ff
movss  -0x18(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     15aa <egrid+0x44a>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rdi
movss  -0xd0(%rbp),%xmm0
ff
movss  -0xd4(%rbp),%xmm1
ff
call   *%rax
movss  %xmm0,-0x118(%rbp)
ff
mov    -0x20(%rbp),%rdi
movss  -0xe0(%rbp),%xmm0
ff
movss  -0xdc(%rbp),%xmm1
ff
call   1050 <traparea@plt>
movaps %xmm0,%xmm1
movss  -0x118(%rbp),%xmm0
ff
mulss  %xmm1,%xmm0
movss  %xmm0,-0xec(%rbp)
ff
movss  -0xec(%rbp),%xmm0
ff
addss  -0xe4(%rbp),%xmm0
ff
movss  %xmm0,-0xe4(%rbp)
ff
cmpl   $0x0,-0xfc(%rbp)
je     15a5 <egrid+0x445>
movss  -0xec(%rbp),%xmm0
ff
divss  -0xe4(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm1
movsd  0xa7f(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    15a5 <egrid+0x445>
movl   $0x1,-0xf8(%rbp)
jmp    15d2 <egrid+0x472>
movss  -0xdc(%rbp),%xmm1
ff
movss  -0xc8(%rbp),%xmm0
ff
ucomiss %xmm1,%xmm0
jbe    15cd <egrid+0x46d>
movl   $0x1,-0xf8(%rbp)
jmp    15d2 <egrid+0x472>
jmp    1423 <egrid+0x2c3>
jmp    15dc <egrid+0x47c>
movss  -0xe8(%rbp),%xmm0
ff
addss  -0xe0(%rbp),%xmm0
ff
movss  %xmm0,-0xe0(%rbp)
ff
jmp    13f0 <egrid+0x290>
mov    -0x20(%rbp),%rax
movss  0x24(%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0x9e5(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x24(%rax)
movss  -0xe4(%rbp),%xmm0
ff
add    $0x120,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<egrid>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x60,%rsp
mov    %rsi,%rbx
movss  %xmm0,0x20(%rsp)
movss  %xmm1,0x1c(%rsp)
movss  %xmm2,0x18(%rsp)
movss  %xmm3,0x14(%rsp)
xorps  %xmm4,%xmm4
movaps %xmm4,0x40(%rsp)
movl   $0x0,0x50(%rsp)
movss  0x24(%rsi),%xmm4
cvtss2sd %xmm4,%xmm4
addsd  0xe68(%rip),%xmm4
cvtsd2ss %xmm4,%xmm4
xorps  0xe7d(%rip),%xmm4
mov    %rdi,%r14
movss  %xmm4,0x24(%rsi)
ucomiss %xmm1,%xmm0
jbe    11d7 <egrid+0x87>
lea    0x20(%rsp),%rdi
lea    0x1c(%rsp),%rsi
movss  %xmm3,0xc(%rsp)
movss  %xmm2,0x8(%rsp)
call   1070 <swap@plt>
movss  0x8(%rsp),%xmm2
movss  0xc(%rsp),%xmm3
ucomiss %xmm3,%xmm2
jbe    11f7 <egrid+0xa7>
lea    0x18(%rsp),%rdi
lea    0x14(%rsp),%rsi
call   1070 <swap@plt>
movss  0x18(%rsp),%xmm2
movss  0x14(%rsp),%xmm3
movss  0x20(%rsp),%xmm0
movss  0x1c(%rsp),%xmm1
lea    0x30(%rsp),%rsi
lea    0x2c(%rsp),%rdx
lea    0x40(%rsp),%rcx
mov    %rbx,%rdi
call   1060 <minmaxphi@plt>
movss  0x20(%rsp),%xmm0
movss  0x1c(%rsp),%xmm1
movss  0x18(%rsp),%xmm2
movss  0x14(%rsp),%xmm3
lea    0x10(%rsp),%rsi
lea    0x28(%rsp),%rdx
mov    %rbx,%rdi
call   1030 <minmaxrad@plt>
movss  0x20(%rsp),%xmm2
movss  0x4(%rbx),%xmm0
ucomiss %xmm2,%xmm0
movss  0x1c(%rsp),%xmm1
jb     1276 <egrid+0x126>
ucomiss %xmm0,%xmm1
jb     1276 <egrid+0x126>
movss  0x8(%rbx),%xmm3
ucomiss 0x18(%rsp),%xmm3
jb     1276 <egrid+0x126>
movss  0x14(%rsp),%xmm4
ucomiss %xmm3,%xmm4
jae    1280 <egrid+0x130>
mov    $0x1,%bpl
cmpl   $0x1,0x40(%rsp)
jne    12bf <egrid+0x16f>
movl   $0x0,0x10(%rsp)
xor    %ebp,%ebp
ucomiss %xmm2,%xmm0
jbe    12bf <egrid+0x16f>
ucomiss %xmm0,%xmm1
jbe    12bf <egrid+0x16f>
movss  0x8(%rbx),%xmm0
xor    %ebp,%ebp
ucomiss 0x18(%rsp),%xmm0
jbe    12bf <egrid+0x16f>
movss  0x14(%rsp),%xmm1
ucomiss %xmm0,%xmm1
jbe    12bf <egrid+0x16f>
movl   $0x0,0x30(%rsp)
movl   $0x40c90fdb,0x2c(%rsp)
40
xor    %ebp,%ebp
movss  0x28(%rsp),%xmm4
movss  0x20(%rbx),%xmm2
divss  %xmm2,%xmm4
movss  %xmm4,0x28(%rsp)
mulss  0x10(%rsp),%xmm2
movss  %xmm2,0x10(%rsp)
movss  0x30(%rsp),%xmm3
movss  0x2c(%rsp),%xmm1
xorps  %xmm0,%xmm0
movss  %xmm3,0x8(%rsp)
ucomiss %xmm3,%xmm1
jb     146e <egrid+0x31e>
xorps  %xmm3,%xmm3
xorps  %xmm0,%xmm0
movss  %xmm0,0x24(%rsp)
ucomiss %xmm3,%xmm2
setp   %al
setne  %cl
or     %al,%cl
and    %cl,%bpl
movss  0xd10(%rip),%xmm3
lea    0x3c(%rsp),%r15
lea    0x38(%rsp),%r12
ucomiss %xmm2,%xmm4
jb     1442 <egrid+0x2f2>
jmp    1364 <egrid+0x214>
cs nopw 0x0(%rax,%rax,1)
nop
movss  0x10(%rsp),%xmm0
movss  0xc(%rsp),%xmm4
ucomiss %xmm4,%xmm0
ja     142e <egrid+0x2de>
movss  0x10(%rsp),%xmm2
ucomiss %xmm2,%xmm4
jb     1434 <egrid+0x2e4>
xorps  %xmm0,%xmm0
cvtss2sd %xmm4,%xmm0
divsd  0xc95(%rip),%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movss  0x8(%rsp),%xmm0
movss  %xmm1,0xc(%rsp)
mov    %rbx,%rdi
mov    %r15,%rsi
mov    %r12,%rdx
call   1050 <phi2xy@plt>
movss  0x3c(%rsp),%xmm0
ucomiss 0x20(%rsp),%xmm0
jb     1340 <egrid+0x1f0>
movss  0x1c(%rsp),%xmm1
ucomiss %xmm0,%xmm1
jb     1340 <egrid+0x1f0>
movss  0x38(%rsp),%xmm1
ucomiss 0x18(%rsp),%xmm1
jb     1340 <egrid+0x1f0>
movss  0x14(%rsp),%xmm2
ucomiss %xmm1,%xmm2
jb     1340 <egrid+0x1f0>
mov    %rbx,%rdi
call   *%r14
movss  %xmm0,0x34(%rsp)
mov    %rbx,%rdi
movss  0x8(%rsp),%xmm0
movss  0xc(%rsp),%xmm1
call   1040 <traparea@plt>
mulss  0x34(%rsp),%xmm0
movss  0x24(%rsp),%xmm1
addss  %xmm0,%xmm1
test   %bpl,%bpl
movss  %xmm1,0x24(%rsp)
je     140e <egrid+0x2be>
movss  0xc(%rsp),%xmm4
jmp    1355 <egrid+0x205>
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbf2(%rip),%xmm1
ucomisd %xmm0,%xmm1
movss  0xc(%rsp),%xmm4
jbe    1355 <egrid+0x205>
movss  0x10(%rsp),%xmm2
movss  0x2c(%rsp),%xmm1
movss  0xbee(%rip),%xmm3
movss  0x8(%rsp),%xmm0
addss  %xmm3,%xmm0
movss  %xmm0,0x8(%rsp)
ucomiss %xmm0,%xmm1
jb     1468 <egrid+0x318>
movss  0x28(%rsp),%xmm4
ucomiss %xmm2,%xmm4
jae    1364 <egrid+0x214>
jmp    1442 <egrid+0x2f2>
movss  0x24(%rsp),%xmm0
movss  0x24(%rbx),%xmm1
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
movsd  0xb96(%rip),%xmm1
subsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x24(%rbx)
add    $0x60,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define float @egrid(float (float*, float, float)* nocapture %0, float %1, float %2, float %3, float %4, float* %5) {
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca [5 x i32]
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
store float %4, float* %10
%18 = bitcast float* %11 to i8*
%19 = bitcast float* %12 to i8*
%20 = bitcast float* %13 to i8*
%21 = bitcast float* %14 to i8*
%22 = bitcast float* %15 to i8*
%23 = bitcast float* %16 to i8*
%24 = bitcast [5 x i32]* %17 to i8*
%25 = getelementptr inbounds float, float* %5, i64 9
%26 = load float, float* %25
%27 = fpext float %26 to double
%28 = fadd double %27, 0xBFF921FB54421D91
%29 = fptrunc double %28 to float
%30 = fneg float %29
store float %30, float* %25
%31 = fcmp ogt float %1, %2
br i1 %31, label %32, label %33
32: ; preds = %6
br label %33
33: ; preds = %32, %6
%34 = fcmp ogt float %3, %4
br i1 %34, label %35, label %38
35: ; preds = %33
%36 = load float, float* %9
%37 = load float, float* %10
br label %38
38: ; preds = %35, %33
%39 = phi float [ %37, %35 ], [ %4, %33 ]
%40 = phi float [ %36, %35 ], [ %3, %33 ]
%41 = load float, float* %7
%42 = load float, float* %8
%43 = getelementptr inbounds [5 x i32], [5 x i32]* %17, i64 0, i64 0
%44 = load float, float* %7
%45 = load float, float* %8
%46 = load float, float* %9
%47 = load float, float* %10
%48 = load float, float* %7
%49 = getelementptr inbounds float, float* %5, i64 1
%50 = load float, float* %49
%51 = fcmp ugt float %48, %50
%52 = load float, float* %8
%53 = fcmp ult float %52, %50
%54 = select i1 %51, i1 true, i1 %53
br i1 %54, label %66, label %55
55: ; preds = %38
%56 = load float, float* %9
%57 = getelementptr inbounds float, float* %5, i64 2
%58 = load float, float* %57
%59 = fcmp ugt float %56, %58
br i1 %59, label %66, label %60
60: ; preds = %55
%61 = load float, float* %10
%62 = fcmp oge float %61, %58
%63 = load i32, i32* %43
%64 = icmp eq i32 %63, 1
%65 = select i1 %62, i1 true, i1 %64
br i1 %65, label %69, label %82
66: ; preds = %55, %38
%67 = load i32, i32* %43
%68 = icmp eq i32 %67, 1
br i1 %68, label %69, label %82
69: ; preds = %66, %60
store float 0.000000e+00, float* %13
%70 = fcmp olt float %48, %50
%71 = fcmp ogt float %52, %50
%72 = select i1 %70, i1 %71, i1 false
br i1 %72, label %73, label %82
73: ; preds = %69
%74 = load float, float* %9
%75 = getelementptr inbounds float, float* %5, i64 2
%76 = load float, float* %75
%77 = fcmp olt float %74, %76
%78 = load float, float* %10
%79 = fcmp ogt float %78, %76
%80 = select i1 %77, i1 %79, i1 false
br i1 %80, label %81, label %82
81: ; preds = %73
store float 0.000000e+00, float* %11
store float 0x401921FB60000000, float* %12
br label %82
82: ; preds = %69, %73, %81, %60, %66
%83 = phi i1 [ false, %69 ], [ false, %73 ], [ false, %81 ], [ true, %60 ], [ true, %66 ]
%84 = load float, float* %14
%85 = getelementptr inbounds float, float* %5, i64 8
%86 = load float, float* %85
%87 = fdiv float %84, %86
store float %87, float* %14
%88 = load float, float* %13
%89 = fmul float %86, %88
store float %89, float* %13
%90 = load float, float* %11
%91 = load float, float* %12
%92 = fcmp ugt float %90, %91
br i1 %92, label %154, label %93
93: ; preds = %82
%94 = fcmp une float %89, 0.000000e+00
%95 = and i1 %83, %94
br label %96
96: ; preds = %152, %93
%97 = phi float [ %91, %93 ], [ %147, %152 ]
%98 = phi float [ %89, %93 ], [ %148, %152 ]
%99 = phi float [ %87, %93 ], [ %153, %152 ]
%100 = phi float [ %90, %93 ], [ %150, %152 ]
%101 = phi float [ 0.000000e+00, %93 ], [ %149, %152 ]
%102 = fcmp ult float %99, %98
br i1 %102, label %146, label %103
103: ; preds = %96, %138
%104 = phi float [ %108, %138 ], [ %99, %96 ]
%105 = phi float [ %139, %138 ], [ %101, %96 ]
%106 = fpext float %104 to double
%107 = fdiv double %106, 1.010000e+00
%108 = fptrunc double %107 to float
%109 = call float @phi2xy(float %100, float %108, float* %5, float* %15, float* %16)
%110 = load float, float* %15
%111 = load float, float* %7
%112 = fcmp ult float %110, %111
%113 = load float, float* %8
%114 = fcmp ugt float %110, %113
%115 = select i1 %112, i1 true, i1 %114
br i1 %115, label %132, label %116
116: ; preds = %103
%117 = load float, float* %16
%118 = load float, float* %9
%119 = fcmp ult float %117, %118
%120 = load float, float* %10
%121 = fcmp ugt float %117, %120
%122 = select i1 %119, i1 true, i1 %121
br i1 %122, label %132, label %123
123: ; preds = %116
%124 = call float %0(float* %5, float %110, float %117)
%125 = call float @traparea(float* %5, float %100, float %108)
%126 = fmul float %124, %125
%127 = fadd float %105, %126
br i1 %95, label %138, label %128
128: ; preds = %123
%129 = fdiv float %126, %127
%130 = fpext float %129 to double
%131 = fcmp olt double %130, 1.000000e-05
br i1 %131, label %135, label %138
132: ; preds = %116, %103
%133 = load float, float* %13
%134 = fcmp ogt float %133, %108
br i1 %134, label %135, label %138
135: ; preds = %128, %132
%136 = phi float [ %127, %128 ], [ %105, %132 ]
%137 = load float, float* %13
br label %142
138: ; preds = %132, %123, %128
%139 = phi float [ %127, %128 ], [ %127, %123 ], [ %105, %132 ]
%140 = load float, float* %13
%141 = fcmp ugt float %140, %108
br i1 %141, label %142, label %103
142: ; preds = %138, %135
%143 = phi float [ %137, %135 ], [ %140, %138 ]
%144 = phi float [ %136, %135 ], [ %139, %138 ]
%145 = load float, float* %12
br label %146
146: ; preds = %142, %96
%147 = phi float [ %97, %96 ], [ %145, %142 ]
%148 = phi float [ %98, %96 ], [ %143, %142 ]
%149 = phi float [ %101, %96 ], [ %144, %142 ]
%150 = fadd float %100, 0x3F91DF46A0000000
%151 = fcmp ugt float %150, %147
br i1 %151, label %154, label %152
152: ; preds = %146
%153 = load float, float* %14
br label %96
154: ; preds = %146, %82
%155 = phi float [ 0.000000e+00, %82 ], [ %149, %146 ]
%156 = load float, float* %25
%157 = fneg float %156
%158 = fpext float %157 to double
%159 = fadd double %158, 0x3FF921FB54421D91
%160 = fptrunc double %159 to float
store float %160, float* %25
ret float %155
}