#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 */
double _fff_pth_element(double *x, size_t p, size_t stride, size_t n) {
  double a, tmp;
  double *bufl, *bufr;
  size_t i, j, il, jr, stop1, stop2;
  int same_extremities;
  stop1 = 0;
  il = 0;
  jr = n - 1;
  while (stop1 == 0) {
    same_extremities = 0;
    bufl = x + stride * il;
    bufr = x + stride * jr;
    if (*bufl > *bufr) {
      tmp = (*bufl);
      (*bufl) = (*bufr);
      (*bufr) = tmp;
    } else if (*bufl == *bufr)
      same_extremities = 1;
    a = *bufl;
    if (il == jr)
      return a;
    bufl += stride;
    i = il + 1;
    j = jr;
    stop2 = 0;
    while (stop2 == 0) {
      while (*bufl < a) {
        i++;
        bufl += stride;
      }
      while (*bufr > a) {
        j--;
        bufr -= stride;
      }
      if (j <= i)
        stop2 = 1;
      else {
        {
          tmp = (*bufl);
          (*bufl) = (*bufr);
          (*bufr) = tmp;
        }
        j--;
        bufr -= stride;
        i++;
        bufl += stride;
      }
      if ((same_extremities) && (j == jr)) {
        j--;
        bufr -= stride;
        {
          tmp = (x[il * stride]);
          (x[il * stride]) = (*bufr);
          (*bufr) = tmp;
        }
        stop2 = 1;
      }
    }
    if (j > p)
      jr = j;
    else if (j < p)
      il = i;
    else
      stop1 = 1;
  }
  return a;
}


x86 assembly (clang, -O0):
<_fff_pth_element>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movq   $0x0,-0x70(%rbp)
movq   $0x0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x70(%rbp)
jne    1412 <_fff_pth_element+0x312>
movl   $0x0,-0x7c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
imul   -0x60(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
imul   -0x68(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
ucomisd (%rax),%xmm0
jbe    11b7 <_fff_pth_element+0xb7>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    11df <_fff_pth_element+0xdf>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
ucomisd (%rax),%xmm0
jne    11da <_fff_pth_element+0xda>
jp     11da <_fff_pth_element+0xda>
movl   $0x1,-0x7c(%rbp)
jmp    11df <_fff_pth_element+0xdf>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x60(%rbp),%rax
cmp    -0x68(%rbp),%rax
jne    1209 <_fff_pth_element+0x109>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    141c <_fff_pth_element+0x31c>
mov    -0x20(%rbp),%rax
shl    $0x3,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x60(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,-0x58(%rbp)
movq   $0x0,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    13ca <_fff_pth_element+0x2ca>
jmp    1245 <_fff_pth_element+0x145>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    127d <_fff_pth_element+0x17d>
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x3,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    1245 <_fff_pth_element+0x145>
jmp    1282 <_fff_pth_element+0x182>
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    12be <_fff_pth_element+0x1be>
mov    -0x58(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rdx
mov    -0x48(%rbp),%rax
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
jmp    1282 <_fff_pth_element+0x182>
mov    -0x58(%rbp),%rax
cmp    -0x50(%rbp),%rax
ja     12d9 <_fff_pth_element+0x1d9>
movq   $0x1,-0x78(%rbp)
jmp    1343 <_fff_pth_element+0x243>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rdx
mov    -0x48(%rbp),%rax
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x3,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpl   $0x0,-0x7c(%rbp)
je     13c5 <_fff_pth_element+0x2c5>
mov    -0x58(%rbp),%rax
cmp    -0x68(%rbp),%rax
jne    13c5 <_fff_pth_element+0x2c5>
mov    -0x58(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rdx
mov    -0x48(%rbp),%rax
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x60(%rbp),%rcx
imul   -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x60(%rbp),%rcx
imul   -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
movq   $0x1,-0x78(%rbp)
jmp    1235 <_fff_pth_element+0x135>
mov    -0x58(%rbp),%rax
cmp    -0x18(%rbp),%rax
jbe    13e5 <_fff_pth_element+0x2e5>
mov    -0x58(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    140d <_fff_pth_element+0x30d>
mov    -0x58(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1400 <_fff_pth_element+0x300>
mov    -0x50(%rbp),%rax
mov    %rax,-0x60(%rbp)
jmp    1408 <_fff_pth_element+0x308>
movq   $0x1,-0x70(%rbp)
jmp    140d <_fff_pth_element+0x30d>
jmp    1130 <_fff_pth_element+0x30>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<_fff_pth_element>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,%r10
mov    %rsi,-0x20(%rsp)
add    $0xffffffffffffffff,%r10
mov    %rdx,%r8
neg    %r8
lea    0x0(,%rdx,8),%r9
mov    %r9,%r13
neg    %r13
xor    %r15d,%r15d
mov    %r15,%rax
imul   %rdx,%rax
lea    (%rdi,%rax,8),%r11
lea    (%r11,%rdx,8),%rax
mov    %rax,-0x10(%rsp)
mov    %r15,-0x8(%rsp)
lea    0x1(%r15),%rax
mov    %rax,-0x18(%rsp)
mov    %r10,%rcx
jmp    1185 <_fff_pth_element+0x85>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x1(%r10),%rcx
movsd  (%r11),%xmm1
movsd  (%rbx,%r8,8),%xmm2
movsd  %xmm2,(%r11)
movsd  %xmm1,(%rbx,%r8,8)
cmp    -0x20(%rsp),%rcx
jbe    12a0 <_fff_pth_element+0x1a0>
mov    %rcx,%r10
mov    %rcx,%rax
imul   %rdx,%rax
lea    (%rdi,%rax,8),%rbx
movsd  (%r11),%xmm0
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm1,%xmm0
jbe    11c0 <_fff_pth_element+0xc0>
movsd  %xmm1,(%r11)
movsd  %xmm0,(%rbx)
movsd  (%r11),%xmm0
jmp    11e0 <_fff_pth_element+0xe0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
ucomisd %xmm1,%xmm0
jne    11e0 <_fff_pth_element+0xe0>
jp     11e0 <_fff_pth_element+0xe0>
mov    $0x1,%r12b
cmp    %r10,-0x8(%rsp)
jne    11ee <_fff_pth_element+0xee>
jmp    12a6 <_fff_pth_element+0x1a6>
nopw   0x0(%rax,%rax,1)
xor    %r12d,%r12d
cmp    %r10,-0x8(%rsp)
je     12a6 <_fff_pth_element+0x1a6>
mov    %r10,%rbp
mov    -0x18(%rsp),%r15
mov    -0x10(%rsp),%rax
nopl   0x0(%rax,%rax,1)
movsd  (%rax),%xmm1
ucomisd %xmm1,%xmm0
mov    %r15,%r14
jbe    1223 <_fff_pth_element+0x123>
nopl   (%rax)
add    $0x1,%r14
movsd  (%rax,%r9,1),%xmm1
add    %r9,%rax
ucomisd %xmm1,%xmm0
ja     1210 <_fff_pth_element+0x110>
movsd  (%rbx),%xmm2
ucomisd %xmm0,%xmm2
jbe    1243 <_fff_pth_element+0x143>
nopl   (%rax)
add    $0xffffffffffffffff,%rbp
movsd  (%rbx,%r13,1),%xmm2
add    %r13,%rbx
ucomisd %xmm0,%xmm2
ja     1230 <_fff_pth_element+0x130>
cmp    %r14,%rbp
jbe    1270 <_fff_pth_element+0x170>
movsd  %xmm2,(%rax)
movsd  %xmm1,(%rbx)
lea    -0x1(%rbp),%rcx
lea    (%rbx,%r8,8),%rbx
lea    0x1(%r14),%r15
lea    (%rax,%rdx,8),%rax
jmp    1276 <_fff_pth_element+0x176>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r14,%r15
mov    %rbp,%rcx
cmp    %r10,%rcx
sete   %sil
and    %r12b,%sil
cmp    $0x1,%sil
je     1160 <_fff_pth_element+0x60>
cmp    %r14,%rbp
mov    %rcx,%rbp
ja     1200 <_fff_pth_element+0x100>
jmp    117a <_fff_pth_element+0x7a>
nopl   0x0(%rax,%rax,1)
jb     112d <_fff_pth_element+0x2d>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @_fff_pth_element(double* %0, i64 %1, i64 %2, i64 %3) {
%5 = alloca double
%6 = alloca double*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca double
%11 = alloca double
%12 = alloca double*
%13 = alloca double*
%14 = alloca i64
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i64
%20 = alloca i32
store double* %0, double** %6
store i64 %1, i64* %7
store i64 %2, i64* %8
store i64 %3, i64* %9
store i64 0, i64* %18
store i64 0, i64* %16
%21 = load i64, i64* %9
%22 = sub i64 %21, 1
store i64 %22, i64* %17
br label %23
23: ; preds = %169, %4
%24 = load i64, i64* %18
%25 = icmp eq i64 %24, 0
br i1 %25, label %26, label %170
26: ; preds = %23
store i32 0, i32* %20
%27 = load double*, double** %6
%28 = load i64, i64* %8
%29 = load i64, i64* %16
%30 = mul i64 %28, %29
%31 = getelementptr inbounds double, double* %27, i64 %30
store double* %31, double** %12
%32 = load double*, double** %6
%33 = load i64, i64* %8
%34 = load i64, i64* %17
%35 = mul i64 %33, %34
%36 = getelementptr inbounds double, double* %32, i64 %35
store double* %36, double** %13
%37 = load double*, double** %12
%38 = load double, double* %37
%39 = load double*, double** %13
%40 = load double, double* %39
%41 = fcmp ogt double %38, %40
br i1 %41, label %42, label %50
42: ; preds = %26
%43 = load double*, double** %12
%44 = load double, double* %43
store double %44, double* %11
%45 = load double*, double** %13
%46 = load double, double* %45
%47 = load double*, double** %12
store double %46, double* %47
%48 = load double, double* %11
%49 = load double*, double** %13
store double %48, double* %49
br label %58
50: ; preds = %26
%51 = load double*, double** %12
%52 = load double, double* %51
%53 = load double*, double** %13
%54 = load double, double* %53
%55 = fcmp oeq double %52, %54
br i1 %55, label %56, label %57
56: ; preds = %50
store i32 1, i32* %20
br label %57
57: ; preds = %56, %50
br label %58
58: ; preds = %57, %42
%59 = load double*, double** %12
%60 = load double, double* %59
store double %60, double* %10
%61 = load i64, i64* %16
%62 = load i64, i64* %17
%63 = icmp eq i64 %61, %62
br i1 %63, label %64, label %66
64: ; preds = %58
%65 = load double, double* %10
store double %65, double* %5
br label %172
66: ; preds = %58
%67 = load i64, i64* %8
%68 = load double*, double** %12
%69 = getelementptr inbounds double, double* %68, i64 %67
store double* %69, double** %12
%70 = load i64, i64* %16
%71 = add i64 %70, 1
store i64 %71, i64* %14
%72 = load i64, i64* %17
store i64 %72, i64* %15
store i64 0, i64* %19
br label %73
73: ; preds = %154, %66
%74 = load i64, i64* %19
%75 = icmp eq i64 %74, 0
br i1 %75, label %76, label %155
76: ; preds = %73
br label %77
77: ; preds = %82, %76
%78 = load double*, double** %12
%79 = load double, double* %78
%80 = load double, double* %10
%81 = fcmp olt double %79, %80
br i1 %81, label %82, label %88
82: ; preds = %77
%83 = load i64, i64* %14
%84 = add i64 %83, 1
store i64 %84, i64* %14
%85 = load i64, i64* %8
%86 = load double*, double** %12
%87 = getelementptr inbounds double, double* %86, i64 %85
store double* %87, double** %12
br label %77
88: ; preds = %77
br label %89
89: ; preds = %94, %88
%90 = load double*, double** %13
%91 = load double, double* %90
%92 = load double, double* %10
%93 = fcmp ogt double %91, %92
br i1 %93, label %94, label %101
94: ; preds = %89
%95 = load i64, i64* %15
%96 = add i64 %95, -1
store i64 %96, i64* %15
%97 = load i64, i64* %8
%98 = load double*, double** %13
%99 = sub i64 0, %97
%100 = getelementptr inbounds double, double* %98, i64 %99
store double* %100, double** %13
br label %89
101: ; preds = %89
%102 = load i64, i64* %15
%103 = load i64, i64* %14
%104 = icmp ule i64 %102, %103
br i1 %104, label %105, label %106
105: ; preds = %101
store i64 1, i64* %19
br label %125
106: ; preds = %101
%107 = load double*, double** %12
%108 = load double, double* %107
store double %108, double* %11
%109 = load double*, double** %13
%110 = load double, double* %109
%111 = load double*, double** %12
store double %110, double* %111
%112 = load double, double* %11
%113 = load double*, double** %13
store double %112, double* %113
%114 = load i64, i64* %15
%115 = add i64 %114, -1
store i64 %115, i64* %15
%116 = load i64, i64* %8
%117 = load double*, double** %13
%118 = sub i64 0, %116
%119 = getelementptr inbounds double, double* %117, i64 %118
store double* %119, double** %13
%120 = load i64, i64* %14
%121 = add i64 %120, 1
store i64 %121, i64* %14
%122 = load i64, i64* %8
%123 = load double*, double** %12
%124 = getelementptr inbounds double, double* %123, i64 %122
store double* %124, double** %12
br label %125
125: ; preds = %106, %105
%126 = load i32, i32* %20
%127 = icmp ne i32 %126, 0
br i1 %127, label %128, label %154
128: ; preds = %125
%129 = load i64, i64* %15
%130 = load i64, i64* %17
%131 = icmp eq i64 %129, %130
br i1 %131, label %132, label %154
132: ; preds = %128
%133 = load i64, i64* %15
%134 = add i64 %133, -1
store i64 %134, i64* %15
%135 = load i64, i64* %8
%136 = load double*, double** %13
%137 = sub i64 0, %135
%138 = getelementptr inbounds double, double* %136, i64 %137
store double* %138, double** %13
%139 = load double*, double** %6
%140 = load i64, i64* %16
%141 = load i64, i64* %8
%142 = mul i64 %140, %141
%143 = getelementptr inbounds double, double* %139, i64 %142
%144 = load double, double* %143
store double %144, double* %11
%145 = load double*, double** %13
%146 = load double, double* %145
%147 = load double*, double** %6
%148 = load i64, i64* %16
%149 = load i64, i64* %8
%150 = mul i64 %148, %149
%151 = getelementptr inbounds double, double* %147, i64 %150
store double %146, double* %151
%152 = load double, double* %11
%153 = load double*, double** %13
store double %152, double* %153
store i64 1, i64* %19
br label %154
154: ; preds = %132, %128, %125
br label %73
155: ; preds = %73
%156 = load i64, i64* %15
%157 = load i64, i64* %7
%158 = icmp ugt i64 %156, %157
br i1 %158, label %159, label %161
159: ; preds = %155
%160 = load i64, i64* %15
store i64 %160, i64* %17
br label %169
161: ; preds = %155
%162 = load i64, i64* %15
%163 = load i64, i64* %7
%164 = icmp ult i64 %162, %163
br i1 %164, label %165, label %167
165: ; preds = %161
%166 = load i64, i64* %14
store i64 %166, i64* %16
br label %168
167: ; preds = %161
store i64 1, i64* %18
br label %168
168: ; preds = %167, %165
br label %169
169: ; preds = %168, %159
br label %23
170: ; preds = %23
%171 = load double, double* %10
store double %171, double* %5
br label %172
172: ; preds = %170, %64
%173 = load double, double* %5
ret double %173
}

LLVM IR (-O2):
define double @_fff_pth_element(double* nocapture %0, i64 %1, i64 %2, i64 %3) {
%5 = add i64 %3, -1
%6 = sub i64 0, %2
br label %9
7: ; preds = %82
%8 = icmp ult i64 %83, %1
br i1 %8, label %9, label %85
9: ; preds = %4, %7
%10 = phi i64 [ %5, %4 ], [ %17, %7 ]
%11 = phi i64 [ 0, %4 ], [ %72, %7 ]
%12 = mul i64 %11, %2
%13 = getelementptr inbounds double, double* %0, i64 %12
%14 = getelementptr inbounds double, double* %13, i64 %2
%15 = add i64 %11, 1
br label %16
16: ; preds = %82, %9
%17 = phi i64 [ %10, %9 ], [ %83, %82 ]
%18 = mul i64 %17, %2
%19 = getelementptr inbounds double, double* %0, i64 %18
%20 = load double, double* %13
%21 = load double, double* %19
%22 = fcmp ogt double %20, %21
br i1 %22, label %23, label %25
23: ; preds = %16
store double %21, double* %13
store double %20, double* %19
%24 = load double, double* %13
br label %28
25: ; preds = %16
%26 = fcmp oeq double %20, %21
br i1 %26, label %27, label %28
27: ; preds = %25
br label %28
28: ; preds = %25, %27, %23
%29 = phi double [ %20, %25 ], [ %20, %27 ], [ %24, %23 ]
%30 = phi i1 [ false, %25 ], [ true, %27 ], [ false, %23 ]
%31 = icmp eq i64 %11, %17
br i1 %31, label %85, label %32
32: ; preds = %28, %81
%33 = phi i64 [ %73, %81 ], [ %17, %28 ]
%34 = phi i64 [ %72, %81 ], [ %15, %28 ]
%35 = phi double* [ %71, %81 ], [ %19, %28 ]
%36 = phi double* [ %70, %81 ], [ %14, %28 ]
%37 = load double, double* %36
%38 = fcmp olt double %37, %29
br i1 %38, label %45, label %39
39: ; preds = %45, %32
%40 = phi double* [ %36, %32 ], [ %49, %45 ]
%41 = phi i64 [ %34, %32 ], [ %48, %45 ]
%42 = phi double [ %37, %32 ], [ %50, %45 ]
%43 = load double, double* %35
%44 = fcmp ogt double %43, %29
br i1 %44, label %52, label %59
45: ; preds = %32, %45
%46 = phi i64 [ %48, %45 ], [ %34, %32 ]
%47 = phi double* [ %49, %45 ], [ %36, %32 ]
%48 = add i64 %46, 1
%49 = getelementptr inbounds double, double* %47, i64 %2
%50 = load double, double* %49
%51 = fcmp olt double %50, %29
br i1 %51, label %45, label %39
52: ; preds = %39, %52
%53 = phi i64 [ %55, %52 ], [ %33, %39 ]
%54 = phi double* [ %56, %52 ], [ %35, %39 ]
%55 = add i64 %53, -1
%56 = getelementptr inbounds double, double* %54, i64 %6
%57 = load double, double* %56
%58 = fcmp ogt double %57, %29
br i1 %58, label %52, label %59
59: ; preds = %52, %39
%60 = phi double* [ %35, %39 ], [ %56, %52 ]
%61 = phi i64 [ %33, %39 ], [ %55, %52 ]
%62 = phi double [ %43, %39 ], [ %57, %52 ]
%63 = icmp ugt i64 %61, %41
br i1 %63, label %64, label %69
64: ; preds = %59
store double %62, double* %40
store double %42, double* %60
%65 = add i64 %61, -1
%66 = getelementptr inbounds double, double* %60, i64 %6
%67 = add nuw i64 %41, 1
%68 = getelementptr inbounds double, double* %40, i64 %2
br label %69
69: ; preds = %59, %64
%70 = phi double* [ %68, %64 ], [ %40, %59 ]
%71 = phi double* [ %66, %64 ], [ %60, %59 ]
%72 = phi i64 [ %67, %64 ], [ %41, %59 ]
%73 = phi i64 [ %65, %64 ], [ %61, %59 ]
%74 = icmp eq i64 %73, %17
%75 = select i1 %30, i1 %74, i1 false
br i1 %75, label %76, label %81
76: ; preds = %69
%77 = add i64 %17, -1
%78 = getelementptr inbounds double, double* %71, i64 %6
%79 = load double, double* %13
%80 = load double, double* %78
store double %80, double* %13
store double %79, double* %78
br label %82
81: ; preds = %69
br i1 %63, label %32, label %82
82: ; preds = %81, %76
%83 = phi i64 [ %77, %76 ], [ %73, %81 ]
%84 = icmp ugt i64 %83, %1
br i1 %84, label %16, label %7
85: ; preds = %7, %28
ret double %29
}