#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int shuffle(int const, int const, int const);
double K(int A[3], const int i[3], const double v[3], int a) {
  double s = (A[0] + A[1] + A[2]) / 6.0;
  double t;
  double x = v[0] - A[0] + s;
  double y = v[1] - A[1] + s;
  double z = v[2] - A[2] + s;
  int h = shuffle(i[0] + A[0], i[1] + A[1], i[2] + A[2]);
  A[a]++;
  if ((t = 0.6 - x * x - y * y - z * z) >= 0) {
    int b5 = h >> 5 & 1;
    int b4 = h >> 4 & 1;
    int b3 = h >> 3 & 1;
    int b2 = h >> 2 & 1;
    int b = h & 3;
    double p = (b == 1) ? x : ((b == 2) ? y : z);
    double q = (b == 1) ? y : ((b == 2) ? z : x);
    double r = (b == 1) ? z : ((b == 2) ? x : y);
    double m;
    p = (b5 == (b3)) ? -p : p;
    q = (b5 == (b4)) ? -q : q;
    r = (b5 != (b4 ^ b3)) ? -r : r;
    m = p + ((b == 0) ? q + r : ((b2 == 0) ? q : r));
    return 8 * (t * t * t * t) * m;
  }
  return 0;
}


x86 assembly (clang, -O0):
<K>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
add    0x4(%rcx),%eax
mov    -0x10(%rbp),%rcx
add    0x8(%rcx),%eax
cvtsi2sd %eax,%xmm0
movsd  0xebe(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl (%rax),%xmm1
subsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x4(%rax),%xmm1
subsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x8(%rax),%xmm1
subsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%edi
mov    -0x10(%rbp),%rax
add    (%rax),%edi
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%esi
mov    -0x10(%rbp),%rax
add    0x4(%rax),%esi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%edx
mov    -0x10(%rbp),%rax
add    0x8(%rax),%edx
call   1030 <shuffle@plt>
mov    %eax,-0x54(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xde1(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x48(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     158d <K+0x47d>
mov    -0x54(%rbp),%eax
sar    $0x5,%eax
and    $0x1,%eax
mov    %eax,-0x58(%rbp)
mov    -0x54(%rbp),%eax
sar    $0x4,%eax
and    $0x1,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x54(%rbp),%eax
sar    $0x3,%eax
and    $0x1,%eax
mov    %eax,-0x60(%rbp)
mov    -0x54(%rbp),%eax
sar    $0x2,%eax
and    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    -0x54(%rbp),%eax
and    $0x3,%eax
mov    %eax,-0x68(%rbp)
cmpl   $0x1,-0x68(%rbp)
jne    12dc <K+0x1cc>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
jmp    1315 <K+0x205>
cmpl   $0x2,-0x68(%rbp)
jne    12f8 <K+0x1e8>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
jmp    1305 <K+0x1f5>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x70(%rbp)
cmpl   $0x1,-0x68(%rbp)
jne    133e <K+0x22e>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1377 <K+0x267>
cmpl   $0x2,-0x68(%rbp)
jne    135a <K+0x24a>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
jmp    1367 <K+0x257>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x78(%rbp)
cmpl   $0x1,-0x68(%rbp)
jne    13a0 <K+0x290>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
jmp    13d9 <K+0x2c9>
cmpl   $0x2,-0x68(%rbp)
jne    13bc <K+0x2ac>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    13c9 <K+0x2b9>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x60(%rbp),%eax
jne    141b <K+0x30b>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
jmp    1428 <K+0x318>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x70(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jne    146a <K+0x35a>
movsd  -0x78(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
jmp    1477 <K+0x367>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0x78(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x5c(%rbp),%ecx
xor    -0x60(%rbp),%ecx
cmp    %ecx,%eax
je     14be <K+0x3ae>
movsd  -0x80(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
jmp    14cb <K+0x3bb>
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0x80(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
cmpl   $0x0,-0x68(%rbp)
jne    1506 <K+0x3f6>
movsd  -0x78(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0xe0(%rbp)
jmp    153f <K+0x42f>
cmpl   $0x0,-0x64(%rbp)
jne    1522 <K+0x412>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
jmp    152f <K+0x41f>
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
movsd  -0xe0(%rbp),%xmm1
ff
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
movsd  0xa99(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
jmp    1595 <K+0x485>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<K>:
push   %rbp
push   %r14
push   %rbx
sub    $0x30,%rsp
mov    %rdi,%r14
mov    (%rdi),%edi
mov    0x4(%r14),%eax
lea    (%rax,%rdi,1),%ebp
mov    0x8(%r14),%ebx
add    %ebx,%ebp
cvtsi2sd %ebp,%xmm0
divsd  0xeca(%rip),%xmm0
cvtsi2sd %edi,%xmm1
mov    %ecx,%ebp
movsd  (%rdx),%xmm2
subsd  %xmm1,%xmm2
movsd  0x8(%rdx),%xmm3
addsd  %xmm0,%xmm2
movapd %xmm2,0x20(%rsp)
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
subsd  %xmm1,%xmm3
addsd  %xmm0,%xmm3
movapd %xmm3,0x10(%rsp)
movsd  0x10(%rdx),%xmm2
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
subsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
movapd %xmm2,(%rsp)
add    (%rsi),%edi
add    0x4(%rsi),%eax
add    0x8(%rsi),%ebx
mov    %eax,%esi
mov    %ebx,%edx
call   1030 <shuffle@plt>
movapd (%rsp),%xmm6
movapd 0x10(%rsp),%xmm5
movapd 0x20(%rsp),%xmm4
movslq %ebp,%rcx
addl   $0x1,(%r14,%rcx,4)
movapd %xmm4,%xmm0
mulsd  %xmm4,%xmm0
movsd  0xe4d(%rip),%xmm1
subsd  %xmm0,%xmm1
movapd %xmm5,%xmm0
mulsd  %xmm5,%xmm0
subsd  %xmm0,%xmm1
movapd %xmm6,%xmm0
mulsd  %xmm6,%xmm0
subsd  %xmm0,%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jb     128a <K+0x17a>
mov    %eax,%edx
shr    $0x5,%edx
mov    %eax,%esi
shr    $0x3,%esi
mov    %eax,%ecx
and    $0x3,%ecx
movapd %xmm5,%xmm0
movapd %xmm6,%xmm2
movapd %xmm4,%xmm3
cmp    $0x2,%ecx
je     1211 <K+0x101>
movapd %xmm6,%xmm0
movapd %xmm4,%xmm2
movapd %xmm5,%xmm3
mov    %eax,%edi
shr    $0x4,%edi
and    $0x1,%edx
and    $0x1,%esi
cmp    $0x1,%ecx
je     122d <K+0x11d>
movapd %xmm0,%xmm4
movapd %xmm2,%xmm5
movapd %xmm3,%xmm6
and    $0x1,%edi
movapd 0xde8(%rip),%xmm0
cmp    %esi,%edx
jne    1240 <K+0x130>
xorpd  %xmm0,%xmm4
cmp    %edi,%edx
jne    1248 <K+0x138>
xorpd  %xmm0,%xmm5
xor    %esi,%edi
cmp    %edi,%edx
je     1252 <K+0x142>
xorpd  %xmm0,%xmm6
movapd %xmm5,%xmm0
test   $0x4,%al
je     125e <K+0x14e>
movapd %xmm6,%xmm0
test   %ecx,%ecx
jne    126a <K+0x15a>
addsd  %xmm6,%xmm5
movapd %xmm5,%xmm0
addsd  %xmm0,%xmm4
movapd %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  0xd8a(%rip),%xmm0
mulsd  %xmm4,%xmm0
add    $0x30,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

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

LLVM IR (-O2):
define double @K(i32* nocapture %0, i32* nocapture %1, double* nocapture %2, i32 %3) {
%5 = load i32, i32* %0
%6 = getelementptr inbounds i32, i32* %0, i64 1
%7 = load i32, i32* %6
%8 = add nsw i32 %7, %5
%9 = getelementptr inbounds i32, i32* %0, i64 2
%10 = load i32, i32* %9
%11 = add nsw i32 %8, %10
%12 = sitofp i32 %11 to double
%13 = fdiv double %12, 6.000000e+00
%14 = load double, double* %2
%15 = sitofp i32 %5 to double
%16 = fsub double %14, %15
%17 = fadd double %16, %13
%18 = getelementptr inbounds double, double* %2, i64 1
%19 = load double, double* %18
%20 = sitofp i32 %7 to double
%21 = fsub double %19, %20
%22 = fadd double %21, %13
%23 = getelementptr inbounds double, double* %2, i64 2
%24 = load double, double* %23
%25 = sitofp i32 %10 to double
%26 = fsub double %24, %25
%27 = fadd double %13, %26
%28 = load i32, i32* %1
%29 = add nsw i32 %28, %5
%30 = getelementptr inbounds i32, i32* %1, i64 1
%31 = load i32, i32* %30
%32 = add nsw i32 %31, %7
%33 = getelementptr inbounds i32, i32* %1, i64 2
%34 = load i32, i32* %33
%35 = add nsw i32 %34, %10
%36 = tail call i32 @shuffle(i32 %29, i32 %32, i32 %35)
%37 = sext i32 %3 to i64
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = load i32, i32* %38
%40 = add nsw i32 %39, 1
store i32 %40, i32* %38
%41 = fneg double %17
%42 = tail call double @llvm.fmuladd.f64(double %41, double %17, double 6.000000e-01)
%43 = fneg double %22
%44 = tail call double @llvm.fmuladd.f64(double %43, double %22, double %42)
%45 = fneg double %27
%46 = tail call double @llvm.fmuladd.f64(double %45, double %27, double %44)
%47 = fcmp ult double %46, 0.000000e+00
br i1 %47, label %86, label %48
48: ; preds = %4
%49 = lshr i32 %36, 5
%50 = and i32 %49, 1
%51 = lshr i32 %36, 4
%52 = and i32 %51, 1
%53 = lshr i32 %36, 3
%54 = and i32 %53, 1
%55 = and i32 %36, 3
%56 = icmp eq i32 %55, 1
%57 = icmp eq i32 %55, 2
%58 = select i1 %57, double %22, double %27
%59 = select i1 %56, double %17, double %58
%60 = select i1 %57, double %27, double %17
%61 = select i1 %56, double %22, double %60
%62 = select i1 %57, double %17, double %22
%63 = select i1 %56, double %27, double %62
%64 = icmp eq i32 %50, %54
%65 = fneg double %59
%66 = select i1 %64, double %65, double %59
%67 = icmp eq i32 %50, %52
%68 = fneg double %61
%69 = select i1 %67, double %68, double %61
%70 = xor i32 %52, %54
%71 = icmp eq i32 %50, %70
%72 = fneg double %63
%73 = select i1 %71, double %63, double %72
%74 = icmp eq i32 %55, 0
%75 = fadd double %69, %73
%76 = and i32 %36, 4
%77 = icmp eq i32 %76, 0
%78 = select i1 %77, double %69, double %73
%79 = select i1 %74, double %75, double %78
%80 = fadd double %66, %79
%81 = fmul double %46, %46
%82 = fmul double %46, %81
%83 = fmul double %46, %82
%84 = fmul double %83, 8.000000e+00
%85 = fmul double %84, %80
br label %86
86: ; preds = %4, %48
%87 = phi double [ %85, %48 ], [ 0.000000e+00, %4 ]
ret double %87
}