void Legendre(int order, float *t, int n, float **P, float **Pp, float **Ppp) {
  int k, p;
  for (p = 1; p <= n; p++) {
    P[0][p] = 1.00;
    P[1][p] = t[p];
    P[2][p] = 1.50 * t[p] * t[p] - 0.50;
    P[3][p] = 2.50 * t[p] * t[p] * t[p] - 1.50 * t[p];
    Pp[0][p] = 0.00;
    Pp[1][p] = 1.00;
    Pp[2][p] = 3.00 * t[p];
    Pp[3][p] = 7.50 * t[p] * t[p] - 1.50;
    Ppp[0][p] = 0.00;
    Ppp[1][p] = 0.00;
    Ppp[2][p] = 3.00;
    Ppp[3][p] = 15.00 * t[p];
    for (k = 4; k <= order; k++) {
      P[k][p] =
          (2.0 - 1.0 / k) * t[p] * P[k - 1][p] - (1.0 - 1.0 / k) * P[k - 2][p];
      Pp[k][p] = (2.0 - 1.0 / k) * (P[k - 1][p] + t[p] * Pp[k - 1][p]) -
                 (1.0 - 1.0 / k) * Pp[k - 2][p];
      Ppp[k][p] = (2.0 - 1.0 / k) * (2 * Pp[k - 1][p] + t[p] * Ppp[k - 1][p]) -
                  (1.0 - 1.0 / k) * Ppp[k - 2][p];
    }
  }
  return;
}


x86 assembly (clang, -O0):
<Legendre>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x1,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     162a <Legendre+0x52a>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
movslq -0x38(%rbp),%rcx
movss  0xf0c(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xea4(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe93(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe59(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm2
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm3
movsd  0xe0e(%rip),%xmm1
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movslq -0x38(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  0xddb(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd89(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
mov    0x10(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd4f(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd26(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
mov    0x18(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movslq -0x38(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x38(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
mov    0x10(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  0xd12(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xcac(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x30(%rbp),%rax
mov    0x18(%rax),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movl   $0x4,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1617 <Legendre+0x517>
cvtsi2sdl -0x34(%rbp),%xmm0
movsd  0xcab(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xca7(%rip),%xmm0
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm2
cvtsi2sdl -0x34(%rbp),%xmm1
movsd  0xc5b(%rip),%xmm3
divsd  %xmm1,%xmm3
movsd  0xc4f(%rip),%xmm1
subsd  %xmm3,%xmm1
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2sdl -0x34(%rbp),%xmm0
movsd  0xbe4(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xbe0(%rip),%xmm0
subsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm2
cvtsi2sdl -0x34(%rbp),%xmm1
movsd  0xb7a(%rip),%xmm3
divsd  %xmm1,%xmm3
movsd  0xb6e(%rip),%xmm1
subsd  %xmm3,%xmm1
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2sdl -0x34(%rbp),%xmm0
movsd  0xb03(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xaff(%rip),%xmm0
subsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x30(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm2
addss  %xmm1,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm2
cvtsi2sdl -0x34(%rbp),%xmm1
movsd  0xa99(%rip),%xmm3
divsd  %xmm1,%xmm3
movsd  0xa8d(%rip),%xmm1
subsd  %xmm3,%xmm1
mov    -0x30(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1374 <Legendre+0x274>
jmp    161c <Legendre+0x51c>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1121 <Legendre+0x21>
pop    %rbp
ret

x86 assembly (clang, -O2):
<Legendre>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,-0x58(%rsp)
mov    %rdx,-0x60(%rsp)
test   %edx,%edx
jle    1438 <Legendre+0x338>
mov    (%rcx),%rax
mov    %rax,-0x8(%rsp)
mov    0x8(%rcx),%rax
mov    %rax,-0x10(%rsp)
mov    0x10(%rcx),%rax
mov    %rax,-0x18(%rsp)
mov    0x18(%rcx),%rax
mov    %rax,-0x50(%rsp)
mov    (%r8),%rax
mov    %rax,-0x20(%rsp)
mov    0x8(%r8),%rax
mov    %rax,-0x28(%rsp)
mov    0x10(%r8),%rax
mov    %rax,-0x30(%rsp)
mov    0x18(%r8),%rbp
mov    (%r9),%rax
mov    %rax,-0x38(%rsp)
mov    0x8(%r9),%rax
mov    %rax,-0x40(%rsp)
mov    0x10(%r9),%rax
mov    %rax,-0x48(%rsp)
mov    0x18(%r9),%rdi
mov    -0x58(%rsp),%rax
lea    0x1(%rax),%r15d
mov    -0x60(%rsp),%rax
add    $0x1,%eax
mov    %rax,-0x60(%rsp)
mov    $0x1,%r12d
movsd  0xe60(%rip),%xmm8
movsd  0xe5f(%rip),%xmm9
movsd  0xe5e(%rip),%xmm10
movsd  0xe5e(%rip),%xmm3
movss  0xe75(%rip),%xmm11
movsd  0xe54(%rip),%xmm12
movss  0xe68(%rip),%xmm6
movsd  0xe4c(%rip),%xmm4
movsd  0xe4c(%rip),%xmm1
jmp    11ff <Legendre+0xff>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r12
cmp    -0x60(%rsp),%r12
je     1438 <Legendre+0x338>
mov    -0x8(%rsp),%rax
movl   $0x3f800000,(%rax,%r12,4)
3f
movss  (%rsi,%r12,4),%xmm0
mov    -0x10(%rsp),%rax
movss  %xmm0,(%rax,%r12,4)
movss  (%rsi,%r12,4),%xmm0
cvtss2sd %xmm0,%xmm0
movaps %xmm0,%xmm7
mulsd  %xmm8,%xmm7
mulsd  %xmm0,%xmm7
addsd  %xmm9,%xmm7
xorps  %xmm0,%xmm0
cvtsd2ss %xmm7,%xmm0
mov    -0x18(%rsp),%rax
movss  %xmm0,(%rax,%r12,4)
movss  (%rsi,%r12,4),%xmm0
cvtss2sd %xmm0,%xmm0
movaps %xmm0,%xmm7
mulsd  %xmm10,%xmm7
mulsd  %xmm0,%xmm7
mulsd  %xmm0,%xmm7
mulsd  %xmm3,%xmm0
addsd  %xmm7,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x50(%rsp),%rax
movss  %xmm0,(%rax,%r12,4)
mov    -0x20(%rsp),%rax
movl   $0x0,(%rax,%r12,4)
mov    -0x28(%rsp),%rax
movl   $0x3f800000,(%rax,%r12,4)
3f
movss  (%rsi,%r12,4),%xmm0
mulss  %xmm11,%xmm0
mov    -0x30(%rsp),%rax
movss  %xmm0,(%rax,%r12,4)
movss  (%rsi,%r12,4),%xmm0
cvtss2sd %xmm0,%xmm0
movaps %xmm0,%xmm7
mulsd  %xmm12,%xmm7
mulsd  %xmm0,%xmm7
addsd  %xmm3,%xmm7
xorps  %xmm0,%xmm0
cvtsd2ss %xmm7,%xmm0
movss  %xmm0,0x0(%rbp,%r12,4)
mov    -0x38(%rsp),%rax
movl   $0x0,(%rax,%r12,4)
mov    -0x40(%rsp),%rax
movl   $0x0,(%rax,%r12,4)
mov    -0x48(%rsp),%rax
movl   $0x40400000,(%rax,%r12,4)
40
movss  (%rsi,%r12,4),%xmm0
mulss  %xmm6,%xmm0
movss  %xmm0,(%rdi,%r12,4)
cmpl   $0x4,-0x58(%rsp)
jl     11f0 <Legendre+0xf0>
mov    $0x4,%r13d
mov    %rdi,%r14
mov    %rbp,%rax
mov    -0x50(%rsp),%r10
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
movapd %xmm4,%xmm2
divsd  %xmm0,%xmm2
movapd %xmm1,%xmm0
subsd  %xmm2,%xmm0
movss  (%rsi,%r12,4),%xmm7
cvtss2sd %xmm7,%xmm7
mulsd  %xmm0,%xmm7
movss  (%r10,%r12,4),%xmm5
cvtss2sd %xmm5,%xmm5
mulsd  %xmm7,%xmm5
movapd %xmm4,%xmm7
subsd  %xmm2,%xmm7
mov    -0x10(%rcx,%r13,8),%rbx
mov    (%rcx,%r13,8),%r11
movss  (%rbx,%r12,4),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm7,%xmm2
subsd  %xmm2,%xmm5
xorps  %xmm2,%xmm2
cvtsd2ss %xmm5,%xmm2
movss  %xmm2,(%r11,%r12,4)
movss  (%rsi,%r12,4),%xmm2
mulss  (%rax,%r12,4),%xmm2
addss  (%r10,%r12,4),%xmm2
cvtss2sd %xmm2,%xmm2
mov    -0x10(%r8,%r13,8),%rdx
mov    (%r8,%r13,8),%rbx
movss  (%rdx,%r12,4),%xmm5
cvtss2sd %xmm5,%xmm5
mulsd  %xmm7,%xmm5
mulsd  %xmm0,%xmm2
subsd  %xmm5,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,(%rbx,%r12,4)
movss  (%rsi,%r12,4),%xmm2
mulss  (%r14,%r12,4),%xmm2
movss  (%rax,%r12,4),%xmm5
addss  %xmm5,%xmm5
addss  %xmm2,%xmm5
xorps  %xmm2,%xmm2
cvtss2sd %xmm5,%xmm2
mov    -0x10(%r9,%r13,8),%rax
movss  (%rax,%r12,4),%xmm5
cvtss2sd %xmm5,%xmm5
mulsd  %xmm7,%xmm5
mulsd  %xmm0,%xmm2
subsd  %xmm5,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
mov    (%r9,%r13,8),%r14
movss  %xmm0,(%r14,%r12,4)
add    $0x1,%r13
mov    %rbx,%rax
mov    %r11,%r10
cmp    %r13,%r15
jne    1330 <Legendre+0x230>
jmp    11f0 <Legendre+0xf0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @Legendre(i32 %0, float* %1, i32 %2, float** %3, float** %4, float** %5) {
%7 = alloca i32
%8 = alloca float*
%9 = alloca i32
%10 = alloca float**
%11 = alloca float**
%12 = alloca float**
%13 = alloca i32
%14 = alloca i32
store i32 %0, i32* %7
store float* %1, float** %8
store i32 %2, i32* %9
store float** %3, float*** %10
store float** %4, float*** %11
store float** %5, float*** %12
store i32 1, i32* %14
br label %15
15: ; preds = %348, %6
%16 = load i32, i32* %14
%17 = load i32, i32* %9
%18 = icmp sle i32 %16, %17
br i1 %18, label %19, label %351
19: ; preds = %15
%20 = load float**, float*** %10
%21 = getelementptr inbounds float*, float** %20, i64 0
%22 = load float*, float** %21
%23 = load i32, i32* %14
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds float, float* %22, i64 %24
store float 1.000000e+00, float* %25
%26 = load float*, float** %8
%27 = load i32, i32* %14
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds float, float* %26, i64 %28
%30 = load float, float* %29
%31 = load float**, float*** %10
%32 = getelementptr inbounds float*, float** %31, i64 1
%33 = load float*, float** %32
%34 = load i32, i32* %14
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds float, float* %33, i64 %35
store float %30, float* %36
%37 = load float*, float** %8
%38 = load i32, i32* %14
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds float, float* %37, i64 %39
%41 = load float, float* %40
%42 = fpext float %41 to double
%43 = fmul double 1.500000e+00, %42
%44 = load float*, float** %8
%45 = load i32, i32* %14
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
%49 = fpext float %48 to double
%50 = call double @llvm.fmuladd.f64(double %43, double %49, double -5.000000e-01)
%51 = fptrunc double %50 to float
%52 = load float**, float*** %10
%53 = getelementptr inbounds float*, float** %52, i64 2
%54 = load float*, float** %53
%55 = load i32, i32* %14
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %54, i64 %56
store float %51, float* %57
%58 = load float*, float** %8
%59 = load i32, i32* %14
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds float, float* %58, i64 %60
%62 = load float, float* %61
%63 = fpext float %62 to double
%64 = fmul double 2.500000e+00, %63
%65 = load float*, float** %8
%66 = load i32, i32* %14
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds float, float* %65, i64 %67
%69 = load float, float* %68
%70 = fpext float %69 to double
%71 = fmul double %64, %70
%72 = load float*, float** %8
%73 = load i32, i32* %14
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds float, float* %72, i64 %74
%76 = load float, float* %75
%77 = fpext float %76 to double
%78 = load float*, float** %8
%79 = load i32, i32* %14
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds float, float* %78, i64 %80
%82 = load float, float* %81
%83 = fpext float %82 to double
%84 = fmul double 1.500000e+00, %83
%85 = fneg double %84
%86 = call double @llvm.fmuladd.f64(double %71, double %77, double %85)
%87 = fptrunc double %86 to float
%88 = load float**, float*** %10
%89 = getelementptr inbounds float*, float** %88, i64 3
%90 = load float*, float** %89
%91 = load i32, i32* %14
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds float, float* %90, i64 %92
store float %87, float* %93
%94 = load float**, float*** %11
%95 = getelementptr inbounds float*, float** %94, i64 0
%96 = load float*, float** %95
%97 = load i32, i32* %14
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds float, float* %96, i64 %98
store float 0.000000e+00, float* %99
%100 = load float**, float*** %11
%101 = getelementptr inbounds float*, float** %100, i64 1
%102 = load float*, float** %101
%103 = load i32, i32* %14
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds float, float* %102, i64 %104
store float 1.000000e+00, float* %105
%106 = load float*, float** %8
%107 = load i32, i32* %14
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds float, float* %106, i64 %108
%110 = load float, float* %109
%111 = fpext float %110 to double
%112 = fmul double 3.000000e+00, %111
%113 = fptrunc double %112 to float
%114 = load float**, float*** %11
%115 = getelementptr inbounds float*, float** %114, i64 2
%116 = load float*, float** %115
%117 = load i32, i32* %14
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds float, float* %116, i64 %118
store float %113, float* %119
%120 = load float*, float** %8
%121 = load i32, i32* %14
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds float, float* %120, i64 %122
%124 = load float, float* %123
%125 = fpext float %124 to double
%126 = fmul double 7.500000e+00, %125
%127 = load float*, float** %8
%128 = load i32, i32* %14
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds float, float* %127, i64 %129
%131 = load float, float* %130
%132 = fpext float %131 to double
%133 = call double @llvm.fmuladd.f64(double %126, double %132, double -1.500000e+00)
%134 = fptrunc double %133 to float
%135 = load float**, float*** %11
%136 = getelementptr inbounds float*, float** %135, i64 3
%137 = load float*, float** %136
%138 = load i32, i32* %14
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds float, float* %137, i64 %139
store float %134, float* %140
%141 = load float**, float*** %12
%142 = getelementptr inbounds float*, float** %141, i64 0
%143 = load float*, float** %142
%144 = load i32, i32* %14
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds float, float* %143, i64 %145
store float 0.000000e+00, float* %146
%147 = load float**, float*** %12
%148 = getelementptr inbounds float*, float** %147, i64 1
%149 = load float*, float** %148
%150 = load i32, i32* %14
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds float, float* %149, i64 %151
store float 0.000000e+00, float* %152
%153 = load float**, float*** %12
%154 = getelementptr inbounds float*, float** %153, i64 2
%155 = load float*, float** %154
%156 = load i32, i32* %14
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds float, float* %155, i64 %157
store float 3.000000e+00, float* %158
%159 = load float*, float** %8
%160 = load i32, i32* %14
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds float, float* %159, i64 %161
%163 = load float, float* %162
%164 = fpext float %163 to double
%165 = fmul double 1.500000e+01, %164
%166 = fptrunc double %165 to float
%167 = load float**, float*** %12
%168 = getelementptr inbounds float*, float** %167, i64 3
%169 = load float*, float** %168
%170 = load i32, i32* %14
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds float, float* %169, i64 %171
store float %166, float* %172
store i32 4, i32* %13
br label %173
173: ; preds = %344, %19
%174 = load i32, i32* %13
%175 = load i32, i32* %7
%176 = icmp sle i32 %174, %175
br i1 %176, label %177, label %347
177: ; preds = %173
%178 = load i32, i32* %13
%179 = sitofp i32 %178 to double
%180 = fdiv double 1.000000e+00, %179
%181 = fsub double 2.000000e+00, %180
%182 = load float*, float** %8
%183 = load i32, i32* %14
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds float, float* %182, i64 %184
%186 = load float, float* %185
%187 = fpext float %186 to double
%188 = fmul double %181, %187
%189 = load float**, float*** %10
%190 = load i32, i32* %13
%191 = sub nsw i32 %190, 1
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds float*, float** %189, i64 %192
%194 = load float*, float** %193
%195 = load i32, i32* %14
%196 = sext i32 %195 to i64
%197 = getelementptr inbounds float, float* %194, i64 %196
%198 = load float, float* %197
%199 = fpext float %198 to double
%200 = load i32, i32* %13
%201 = sitofp i32 %200 to double
%202 = fdiv double 1.000000e+00, %201
%203 = fsub double 1.000000e+00, %202
%204 = load float**, float*** %10
%205 = load i32, i32* %13
%206 = sub nsw i32 %205, 2
%207 = sext i32 %206 to i64
%208 = getelementptr inbounds float*, float** %204, i64 %207
%209 = load float*, float** %208
%210 = load i32, i32* %14
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds float, float* %209, i64 %211
%213 = load float, float* %212
%214 = fpext float %213 to double
%215 = fmul double %203, %214
%216 = fneg double %215
%217 = call double @llvm.fmuladd.f64(double %188, double %199, double %216)
%218 = fptrunc double %217 to float
%219 = load float**, float*** %10
%220 = load i32, i32* %13
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds float*, float** %219, i64 %221
%223 = load float*, float** %222
%224 = load i32, i32* %14
%225 = sext i32 %224 to i64
%226 = getelementptr inbounds float, float* %223, i64 %225
store float %218, float* %226
%227 = load i32, i32* %13
%228 = sitofp i32 %227 to double
%229 = fdiv double 1.000000e+00, %228
%230 = fsub double 2.000000e+00, %229
%231 = load float**, float*** %10
%232 = load i32, i32* %13
%233 = sub nsw i32 %232, 1
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds float*, float** %231, i64 %234
%236 = load float*, float** %235
%237 = load i32, i32* %14
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds float, float* %236, i64 %238
%240 = load float, float* %239
%241 = load float*, float** %8
%242 = load i32, i32* %14
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds float, float* %241, i64 %243
%245 = load float, float* %244
%246 = load float**, float*** %11
%247 = load i32, i32* %13
%248 = sub nsw i32 %247, 1
%249 = sext i32 %248 to i64
%250 = getelementptr inbounds float*, float** %246, i64 %249
%251 = load float*, float** %250
%252 = load i32, i32* %14
%253 = sext i32 %252 to i64
%254 = getelementptr inbounds float, float* %251, i64 %253
%255 = load float, float* %254
%256 = call float @llvm.fmuladd.f32(float %245, float %255, float %240)
%257 = fpext float %256 to double
%258 = load i32, i32* %13
%259 = sitofp i32 %258 to double
%260 = fdiv double 1.000000e+00, %259
%261 = fsub double 1.000000e+00, %260
%262 = load float**, float*** %11
%263 = load i32, i32* %13
%264 = sub nsw i32 %263, 2
%265 = sext i32 %264 to i64
%266 = getelementptr inbounds float*, float** %262, i64 %265
%267 = load float*, float** %266
%268 = load i32, i32* %14
%269 = sext i32 %268 to i64
%270 = getelementptr inbounds float, float* %267, i64 %269
%271 = load float, float* %270
%272 = fpext float %271 to double
%273 = fmul double %261, %272
%274 = fneg double %273
%275 = call double @llvm.fmuladd.f64(double %230, double %257, double %274)
%276 = fptrunc double %275 to float
%277 = load float**, float*** %11
%278 = load i32, i32* %13
%279 = sext i32 %278 to i64
%280 = getelementptr inbounds float*, float** %277, i64 %279
%281 = load float*, float** %280
%282 = load i32, i32* %14
%283 = sext i32 %282 to i64
%284 = getelementptr inbounds float, float* %281, i64 %283
store float %276, float* %284
%285 = load i32, i32* %13
%286 = sitofp i32 %285 to double
%287 = fdiv double 1.000000e+00, %286
%288 = fsub double 2.000000e+00, %287
%289 = load float**, float*** %11
%290 = load i32, i32* %13
%291 = sub nsw i32 %290, 1
%292 = sext i32 %291 to i64
%293 = getelementptr inbounds float*, float** %289, i64 %292
%294 = load float*, float** %293
%295 = load i32, i32* %14
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds float, float* %294, i64 %296
%298 = load float, float* %297
%299 = load float*, float** %8
%300 = load i32, i32* %14
%301 = sext i32 %300 to i64
%302 = getelementptr inbounds float, float* %299, i64 %301
%303 = load float, float* %302
%304 = load float**, float*** %12
%305 = load i32, i32* %13
%306 = sub nsw i32 %305, 1
%307 = sext i32 %306 to i64
%308 = getelementptr inbounds float*, float** %304, i64 %307
%309 = load float*, float** %308
%310 = load i32, i32* %14
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds float, float* %309, i64 %311
%313 = load float, float* %312
%314 = fmul float %303, %313
%315 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %298, float %314)
%316 = fpext float %315 to double
%317 = load i32, i32* %13
%318 = sitofp i32 %317 to double
%319 = fdiv double 1.000000e+00, %318
%320 = fsub double 1.000000e+00, %319
%321 = load float**, float*** %12
%322 = load i32, i32* %13
%323 = sub nsw i32 %322, 2
%324 = sext i32 %323 to i64
%325 = getelementptr inbounds float*, float** %321, i64 %324
%326 = load float*, float** %325
%327 = load i32, i32* %14
%328 = sext i32 %327 to i64
%329 = getelementptr inbounds float, float* %326, i64 %328
%330 = load float, float* %329
%331 = fpext float %330 to double
%332 = fmul double %320, %331
%333 = fneg double %332
%334 = call double @llvm.fmuladd.f64(double %288, double %316, double %333)
%335 = fptrunc double %334 to float
%336 = load float**, float*** %12
%337 = load i32, i32* %13
%338 = sext i32 %337 to i64
%339 = getelementptr inbounds float*, float** %336, i64 %338
%340 = load float*, float** %339
%341 = load i32, i32* %14
%342 = sext i32 %341 to i64
%343 = getelementptr inbounds float, float* %340, i64 %342
store float %335, float* %343
br label %344
344: ; preds = %177
%345 = load i32, i32* %13
%346 = add nsw i32 %345, 1
store i32 %346, i32* %13
br label %173
347: ; preds = %173
br label %348
348: ; preds = %347
%349 = load i32, i32* %14
%350 = add nsw i32 %349, 1
store i32 %350, i32* %14
br label %15
351: ; preds = %15
ret void
}

LLVM IR (-O2):
define void @Legendre(i32 %0, float* nocapture %1, i32 %2, float** nocapture %3, float** nocapture %4, float** nocapture %5) {
%7 = icmp slt i32 %2, 1
br i1 %7, label %141, label %8
8: ; preds = %6
%9 = load float*, float** %3
%10 = getelementptr inbounds float*, float** %3, i64 1
%11 = load float*, float** %10
%12 = getelementptr inbounds float*, float** %3, i64 2
%13 = load float*, float** %12
%14 = getelementptr inbounds float*, float** %3, i64 3
%15 = load float*, float** %14
%16 = load float*, float** %4
%17 = getelementptr inbounds float*, float** %4, i64 1
%18 = load float*, float** %17
%19 = getelementptr inbounds float*, float** %4, i64 2
%20 = load float*, float** %19
%21 = getelementptr inbounds float*, float** %4, i64 3
%22 = load float*, float** %21
%23 = load float*, float** %5
%24 = getelementptr inbounds float*, float** %5, i64 1
%25 = load float*, float** %24
%26 = getelementptr inbounds float*, float** %5, i64 2
%27 = load float*, float** %26
%28 = getelementptr inbounds float*, float** %5, i64 3
%29 = load float*, float** %28
%30 = icmp slt i32 %0, 4
%31 = add i32 %0, 1
%32 = add nuw i32 %2, 1
%33 = zext i32 %32 to i64
%34 = zext i32 %31 to i64
br label %35
35: ; preds = %8, %138
%36 = phi i64 [ 1, %8 ], [ %139, %138 ]
%37 = getelementptr inbounds float, float* %9, i64 %36
store float 1.000000e+00, float* %37
%38 = getelementptr inbounds float, float* %1, i64 %36
%39 = load float, float* %38
%40 = getelementptr inbounds float, float* %11, i64 %36
store float %39, float* %40
%41 = load float, float* %38
%42 = fpext float %41 to double
%43 = fmul double %42, 1.500000e+00
%44 = tail call double @llvm.fmuladd.f64(double %43, double %42, double -5.000000e-01)
%45 = fptrunc double %44 to float
%46 = getelementptr inbounds float, float* %13, i64 %36
store float %45, float* %46
%47 = load float, float* %38
%48 = fpext float %47 to double
%49 = fmul double %48, 2.500000e+00
%50 = fmul double %49, %48
%51 = fmul double %48, -1.500000e+00
%52 = tail call double @llvm.fmuladd.f64(double %50, double %48, double %51)
%53 = fptrunc double %52 to float
%54 = getelementptr inbounds float, float* %15, i64 %36
store float %53, float* %54
%55 = getelementptr inbounds float, float* %16, i64 %36
store float 0.000000e+00, float* %55
%56 = getelementptr inbounds float, float* %18, i64 %36
store float 1.000000e+00, float* %56
%57 = load float, float* %38
%58 = fmul float %57, 3.000000e+00
%59 = getelementptr inbounds float, float* %20, i64 %36
store float %58, float* %59
%60 = load float, float* %38
%61 = fpext float %60 to double
%62 = fmul double %61, 7.500000e+00
%63 = tail call double @llvm.fmuladd.f64(double %62, double %61, double -1.500000e+00)
%64 = fptrunc double %63 to float
%65 = getelementptr inbounds float, float* %22, i64 %36
store float %64, float* %65
%66 = getelementptr inbounds float, float* %23, i64 %36
store float 0.000000e+00, float* %66
%67 = getelementptr inbounds float, float* %25, i64 %36
store float 0.000000e+00, float* %67
%68 = getelementptr inbounds float, float* %27, i64 %36
store float 3.000000e+00, float* %68
%69 = load float, float* %38
%70 = fmul float %69, 1.500000e+01
%71 = getelementptr inbounds float, float* %29, i64 %36
store float %70, float* %71
br i1 %30, label %138, label %72
72: ; preds = %35, %72
%73 = phi float* [ %134, %72 ], [ %29, %35 ]
%74 = phi float* [ %116, %72 ], [ %22, %35 ]
%75 = phi float* [ %99, %72 ], [ %15, %35 ]
%76 = phi i64 [ %136, %72 ], [ 4, %35 ]
%77 = trunc i64 %76 to i32
%78 = sitofp i32 %77 to double
%79 = fdiv double 1.000000e+00, %78
%80 = fsub double 2.000000e+00, %79
%81 = load float, float* %38
%82 = fpext float %81 to double
%83 = fmul double %80, %82
%84 = getelementptr inbounds float, float* %75, i64 %36
%85 = load float, float* %84
%86 = fpext float %85 to double
%87 = fsub double 1.000000e+00, %79
%88 = add nsw i64 %76, -2
%89 = getelementptr inbounds float*, float** %3, i64 %88
%90 = load float*, float** %89
%91 = getelementptr inbounds float, float* %90, i64 %36
%92 = load float, float* %91
%93 = fpext float %92 to double
%94 = fneg double %87
%95 = fmul double %94, %93
%96 = tail call double @llvm.fmuladd.f64(double %83, double %86, double %95)
%97 = fptrunc double %96 to float
%98 = getelementptr inbounds float*, float** %3, i64 %76
%99 = load float*, float** %98
%100 = getelementptr inbounds float, float* %99, i64 %36
store float %97, float* %100
%101 = load float, float* %84
%102 = load float, float* %38
%103 = getelementptr inbounds float, float* %74, i64 %36
%104 = load float, float* %103
%105 = tail call float @llvm.fmuladd.f32(float %102, float %104, float %101)
%106 = fpext float %105 to double
%107 = getelementptr inbounds float*, float** %4, i64 %88
%108 = load float*, float** %107
%109 = getelementptr inbounds float, float* %108, i64 %36
%110 = load float, float* %109
%111 = fpext float %110 to double
%112 = fmul double %94, %111
%113 = tail call double @llvm.fmuladd.f64(double %80, double %106, double %112)
%114 = fptrunc double %113 to float
%115 = getelementptr inbounds float*, float** %4, i64 %76
%116 = load float*, float** %115
%117 = getelementptr inbounds float, float* %116, i64 %36
store float %114, float* %117
%118 = load float, float* %103
%119 = load float, float* %38
%120 = getelementptr inbounds float, float* %73, i64 %36
%121 = load float, float* %120
%122 = fmul float %119, %121
%123 = tail call float @llvm.fmuladd.f32(float %118, float 2.000000e+00, float %122)
%124 = fpext float %123 to double
%125 = getelementptr inbounds float*, float** %5, i64 %88
%126 = load float*, float** %125
%127 = getelementptr inbounds float, float* %126, i64 %36
%128 = load float, float* %127
%129 = fpext float %128 to double
%130 = fmul double %94, %129
%131 = tail call double @llvm.fmuladd.f64(double %80, double %124, double %130)
%132 = fptrunc double %131 to float
%133 = getelementptr inbounds float*, float** %5, i64 %76
%134 = load float*, float** %133
%135 = getelementptr inbounds float, float* %134, i64 %36
store float %132, float* %135
%136 = add nuw nsw i64 %76, 1
%137 = icmp eq i64 %136, %34
br i1 %137, label %138, label %72
138: ; preds = %72, %35
%139 = add nuw nsw i64 %36, 1
%140 = icmp eq i64 %139, %33
br i1 %140, label %141, label %35
141: ; preds = %138, %6
ret void
}