int fftshift(double *vector_in, double *vector_out, int vector_length) {
  double inter1, inter2;
  int i, half_length;
  half_length = (int)(vector_length / 2.0);
  if (((vector_length / 2.0) == ((int)(vector_length / 2)) ? 0 : 1) == 1) {
    inter2 = vector_in[half_length];
    for (i = 0; i < half_length; i++) {
      inter1 = vector_in[i];
      vector_out[i] = vector_in[half_length + i + 1];
      vector_out[half_length + i] = inter1;
    }
    vector_out[vector_length - 1] = inter2;
  } else {
    for (i = 0; i < half_length; i++) {
      inter1 = vector_in[half_length + i];
      vector_out[half_length + i] = vector_in[i];
      vector_out[i] = inter1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<fftshift>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
movsd  0xee4(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x30(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
movsd  0xecc(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cvtsi2sd %eax,%xmm1
mov    $0x1,%eax
xor    %ecx,%ecx
ucomisd %xmm1,%xmm0
setnp  %sil
sete   %dl
test   %sil,%dl
cmovne %ecx,%eax
cmp    $0x1,%eax
jne    1202 <fftshift+0x102>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    11e6 <fftshift+0xe6>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1181 <fftshift+0x81>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1270 <fftshift+0x170>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    126b <fftshift+0x16b>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1209 <fftshift+0x109>
jmp    1270 <fftshift+0x170>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fftshift>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
cvtsi2sd %edx,%xmm0
mulsd  0xeea(%rip),%xmm0
cvttsd2si %xmm0,%eax
mov    %edx,%ecx
shr    $0x1f,%ecx
add    %edx,%ecx
sar    %ecx
cvtsi2sd %ecx,%xmm1
ucomisd %xmm1,%xmm0
jne    1133 <fftshift+0x33>
jnp    11db <fftshift+0xdb>
movslq %eax,%r8
movsd  (%rdi,%r8,8),%xmm0
test   %eax,%eax
jle    13f6 <fftshift+0x2f6>
mov    %eax,%r10d
cmp    $0x4,%eax
jae    127a <fftshift+0x17a>
xor    %eax,%eax
mov    %rax,%rcx
not    %rcx
test   $0x1,%r10b
je     117b <fftshift+0x7b>
movsd  (%rdi,%rax,8),%xmm1
lea    (%rax,%r8,1),%rbp
movsd  0x8(%rdi,%rbp,8),%xmm2
movsd  %xmm2,(%rsi,%rax,8)
movsd  %xmm1,(%rsi,%rbp,8)
or     $0x1,%rax
add    %r10,%rcx
je     13f6 <fftshift+0x2f6>
lea    (%rsi,%r8,8),%rcx
add    $0x8,%rcx
lea    (%rdi,%r8,8),%rbp
add    $0x10,%rbp
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdi,%rax,8),%xmm1
movsd  -0x8(%rbp,%rax,8),%xmm2
movsd  %xmm2,(%rsi,%rax,8)
movsd  %xmm1,-0x8(%rcx,%rax,8)
movsd  0x8(%rdi,%rax,8),%xmm1
movsd  0x0(%rbp,%rax,8),%xmm2
movsd  %xmm2,0x8(%rsi,%rax,8)
movsd  %xmm1,(%rcx,%rax,8)
add    $0x2,%rax
cmp    %rax,%r10
jne    11a0 <fftshift+0xa0>
jmp    13f6 <fftshift+0x2f6>
test   %eax,%eax
jle    13ff <fftshift+0x2ff>
mov    %eax,%r9d
cmp    $0x4,%eax
jae    140c <fftshift+0x30c>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
test   $0x1,%r9b
je     1219 <fftshift+0x119>
lea    (%rcx,%r9,1),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  (%rdi,%rcx,8),%xmm1
movsd  %xmm1,(%rsi,%rdx,8)
movsd  %xmm0,(%rsi,%rcx,8)
or     $0x1,%rcx
add    %r9,%rax
je     13ff <fftshift+0x2ff>
lea    (%rdi,%r9,8),%rax
add    $0x8,%rax
lea    (%rsi,%r9,8),%rdx
add    $0x8,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  -0x8(%rax,%rcx,8),%xmm0
movsd  (%rdi,%rcx,8),%xmm1
movsd  %xmm1,-0x8(%rdx,%rcx,8)
movsd  %xmm0,(%rsi,%rcx,8)
movsd  (%rax,%rcx,8),%xmm0
movsd  0x8(%rdi,%rcx,8),%xmm1
movsd  %xmm1,(%rdx,%rcx,8)
movsd  %xmm0,0x8(%rsi,%rcx,8)
add    $0x2,%rcx
cmp    %rcx,%r9
jne    1240 <fftshift+0x140>
jmp    13ff <fftshift+0x2ff>
lea    (%rsi,%r10,8),%rax
lea    (%rsi,%r8,8),%rbp
lea    (%r8,%r10,1),%rbx
lea    (%rsi,%rbx,8),%rcx
lea    (%rdi,%r10,8),%r9
lea    (%rdi,%r8,8),%r15
add    $0x8,%r15
cmp    %rsi,%rcx
seta   -0x1(%rsp)
cmp    %rax,%rbp
setb   %r14b
cmp    %rsi,%r9
seta   %r12b
lea    (%rdi,%rbx,8),%rbx
add    $0x8,%rbx
cmp    %rdi,%rax
seta   -0x2(%rsp)
cmp    %rsi,%rbx
seta   %r13b
cmp    %rax,%r15
setb   -0x3(%rsp)
cmp    %r9,%rbp
setb   %r9b
cmp    %rdi,%rcx
seta   -0x4(%rsp)
cmp    %rbx,%rbp
setb   %r11b
cmp    %rcx,%r15
setb   %cl
xor    %eax,%eax
test   %r14b,-0x1(%rsp)
jne    1152 <fftshift+0x52>
and    -0x2(%rsp),%r12b
jne    1152 <fftshift+0x52>
and    -0x3(%rsp),%r13b
jne    1152 <fftshift+0x52>
and    -0x4(%rsp),%r9b
jne    1152 <fftshift+0x52>
and    %cl,%r11b
jne    1152 <fftshift+0x52>
mov    %r10d,%eax
and    $0xfffffffc,%eax
lea    -0x4(%rax),%rcx
mov    %rcx,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     155e <fftshift+0x45e>
mov    %r9,%r11
and    $0xfffffffffffffffe,%r11
lea    (%rsi,%r8,8),%r14
add    $0x30,%r14
lea    (%rdi,%r8,8),%rbx
add    $0x38,%rbx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movups (%rdi,%rcx,8),%xmm1
movups 0x10(%rdi,%rcx,8),%xmm2
movups -0x30(%rbx,%rcx,8),%xmm3
movups -0x20(%rbx,%rcx,8),%xmm4
movups %xmm3,(%rsi,%rcx,8)
movups %xmm4,0x10(%rsi,%rcx,8)
movups %xmm1,-0x30(%r14,%rcx,8)
movups %xmm2,-0x20(%r14,%rcx,8)
movupd 0x20(%rdi,%rcx,8),%xmm1
movups 0x30(%rdi,%rcx,8),%xmm2
movups -0x10(%rbx,%rcx,8),%xmm3
movups (%rbx,%rcx,8),%xmm4
movups %xmm3,0x20(%rsi,%rcx,8)
movups %xmm4,0x30(%rsi,%rcx,8)
movupd %xmm1,-0x10(%r14,%rcx,8)
movups %xmm2,(%r14,%rcx,8)
add    $0x8,%rcx
add    $0xfffffffffffffffe,%r11
jne    1360 <fftshift+0x260>
test   $0x1,%r9b
je     13ed <fftshift+0x2ed>
movupd (%rdi,%rcx,8),%xmm1
movups 0x10(%rdi,%rcx,8),%xmm2
lea    (%rcx,%r8,1),%rbp
movups 0x8(%rdi,%rbp,8),%xmm3
movups 0x18(%rdi,%rbp,8),%xmm4
movups %xmm3,(%rsi,%rcx,8)
movups %xmm4,0x10(%rsi,%rcx,8)
movupd %xmm1,(%rsi,%rbp,8)
movups %xmm2,0x10(%rsi,%rbp,8)
cmp    %r10,%rax
jne    1152 <fftshift+0x52>
movslq %edx,%rax
movsd  %xmm0,-0x8(%rsi,%rax,8)
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    (%rdi,%r9,8),%rcx
mov    %r9,%rbp
shl    $0x4,%rbp
lea    (%rdi,%rbp,1),%rdx
add    %rsi,%rbp
cmp    %rsi,%rcx
seta   %r14b
lea    (%rsi,%r9,8),%rax
cmp    %rdi,%rax
seta   %r12b
cmp    %rsi,%rdx
seta   %bl
cmp    %rsi,%rdi
setb   %r11b
seta   %r15b
cmp    %rdi,%rbp
seta   %r8b
cmp    %rdx,%rax
setb   %dl
cmp    %rbp,%rcx
setb   %r10b
xor    %ecx,%ecx
test   %r12b,%r14b
jne    11f1 <fftshift+0xf1>
and    %r11b,%bl
jne    11f1 <fftshift+0xf1>
and    %r8b,%r15b
jne    11f1 <fftshift+0xf1>
and    %r10b,%dl
jne    11f1 <fftshift+0xf1>
mov    %r9d,%ecx
and    $0xfffffffc,%ecx
lea    -0x4(%rcx),%rax
mov    %rax,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rax,%rax
je     156f <fftshift+0x46f>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
lea    (%rsi,%r9,8),%r10
add    $0x30,%r10
lea    (%rdi,%r9,8),%rbx
add    $0x30,%rbx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x30(%rbx,%rdx,8),%xmm0
movups -0x20(%rbx,%rdx,8),%xmm1
movups (%rdi,%rdx,8),%xmm2
movups 0x10(%rdi,%rdx,8),%xmm3
movups %xmm2,-0x30(%r10,%rdx,8)
movups %xmm3,-0x20(%r10,%rdx,8)
movups %xmm0,(%rsi,%rdx,8)
movups %xmm1,0x10(%rsi,%rdx,8)
movupd -0x10(%rbx,%rdx,8),%xmm0
movupd (%rbx,%rdx,8),%xmm1
movups 0x20(%rdi,%rdx,8),%xmm2
movups 0x30(%rdi,%rdx,8),%xmm3
movups %xmm2,-0x10(%r10,%rdx,8)
movups %xmm3,(%r10,%rdx,8)
movupd %xmm0,0x20(%rsi,%rdx,8)
movupd %xmm1,0x30(%rsi,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rax
jne    14c0 <fftshift+0x3c0>
test   $0x1,%r8b
je     1550 <fftshift+0x450>
lea    (%rdx,%r9,1),%rax
movupd (%rdi,%rax,8),%xmm0
movupd 0x10(%rdi,%rax,8),%xmm1
movups (%rdi,%rdx,8),%xmm2
movups 0x10(%rdi,%rdx,8),%xmm3
movups %xmm2,(%rsi,%rax,8)
movups %xmm3,0x10(%rsi,%rax,8)
movupd %xmm0,(%rsi,%rdx,8)
movupd %xmm1,0x10(%rsi,%rdx,8)
cmp    %r9,%rcx
jne    11f1 <fftshift+0xf1>
jmp    13ff <fftshift+0x2ff>
xor    %ecx,%ecx
test   $0x1,%r9b
jne    13c2 <fftshift+0x2c2>
jmp    13ed <fftshift+0x2ed>
xor    %edx,%edx
test   $0x1,%r8b
jne    1524 <fftshift+0x424>
jmp    1550 <fftshift+0x450>

LLVM IR (-O0):
define i32 @fftshift(double* %0, double* %1, i32 %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
store double* %0, double** %4
store double* %1, double** %5
store i32 %2, i32* %6
%11 = load i32, i32* %6
%12 = sitofp i32 %11 to double
%13 = fdiv double %12, 2.000000e+00
%14 = fptosi double %13 to i32
store i32 %14, i32* %10
%15 = load i32, i32* %6
%16 = sitofp i32 %15 to double
%17 = fdiv double %16, 2.000000e+00
%18 = load i32, i32* %6
%19 = sdiv i32 %18, 2
%20 = sitofp i32 %19 to double
%21 = fcmp oeq double %17, %20
%22 = zext i1 %21 to i64
%23 = select i1 %21, i32 0, i32 1
%24 = icmp eq i32 %23, 1
br i1 %24, label %25, label %70
25: ; preds = %3
%26 = load double*, double** %4
%27 = load i32, i32* %10
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds double, double* %26, i64 %28
%30 = load double, double* %29
store double %30, double* %8
store i32 0, i32* %9
br label %31
31: ; preds = %60, %25
%32 = load i32, i32* %9
%33 = load i32, i32* %10
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %63
35: ; preds = %31
%36 = load double*, double** %4
%37 = load i32, i32* %9
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double, double* %36, i64 %38
%40 = load double, double* %39
store double %40, double* %7
%41 = load double*, double** %4
%42 = load i32, i32* %10
%43 = load i32, i32* %9
%44 = add nsw i32 %42, %43
%45 = add nsw i32 %44, 1
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %41, i64 %46
%48 = load double, double* %47
%49 = load double*, double** %5
%50 = load i32, i32* %9
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds double, double* %49, i64 %51
store double %48, double* %52
%53 = load double, double* %7
%54 = load double*, double** %5
%55 = load i32, i32* %10
%56 = load i32, i32* %9
%57 = add nsw i32 %55, %56
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds double, double* %54, i64 %58
store double %53, double* %59
br label %60
60: ; preds = %35
%61 = load i32, i32* %9
%62 = add nsw i32 %61, 1
store i32 %62, i32* %9
br label %31
63: ; preds = %31
%64 = load double, double* %8
%65 = load double*, double** %5
%66 = load i32, i32* %6
%67 = sub nsw i32 %66, 1
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds double, double* %65, i64 %68
store double %64, double* %69
br label %103
70: ; preds = %3
store i32 0, i32* %9
br label %71
71: ; preds = %99, %70
%72 = load i32, i32* %9
%73 = load i32, i32* %10
%74 = icmp slt i32 %72, %73
br i1 %74, label %75, label %102
75: ; preds = %71
%76 = load double*, double** %4
%77 = load i32, i32* %10
%78 = load i32, i32* %9
%79 = add nsw i32 %77, %78
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds double, double* %76, i64 %80
%82 = load double, double* %81
store double %82, double* %7
%83 = load double*, double** %4
%84 = load i32, i32* %9
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double, double* %83, i64 %85
%87 = load double, double* %86
%88 = load double*, double** %5
%89 = load i32, i32* %10
%90 = load i32, i32* %9
%91 = add nsw i32 %89, %90
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds double, double* %88, i64 %92
store double %87, double* %93
%94 = load double, double* %7
%95 = load double*, double** %5
%96 = load i32, i32* %9
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds double, double* %95, i64 %97
store double %94, double* %98
br label %99
99: ; preds = %75
%100 = load i32, i32* %9
%101 = add nsw i32 %100, 1
store i32 %101, i32* %9
br label %71
102: ; preds = %71
br label %103
103: ; preds = %102, %63
ret i32 0
}

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