#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 exp(double);
double log(double);
int pre_processing_func(double *values, long length, long pre_processing,
                        double *pre_processing_parameter, int mode) {
  int i;
  int ret = 0;
  double min = values[0];
  double next_min = values[0];
  switch (pre_processing) {
  case 0:
    break;
  case 1:
    if (mode == 0) {
      for (i = 0; i < length; i++) {
        if (values[i] < min)
          min = values[i];
        if (values[i] > next_min)
          next_min = values[i];
      }
      for (i = 0; i < length; i++) {
        if (values[i] > min && values[i] < next_min)
          next_min = values[i];
      }
      if (min > 0) {
        *pre_processing_parameter = 0;
        for (i = 0; i < length; i++)
          values[i] = log(values[i]);
      } else {
        *pre_processing_parameter = next_min - 2 * min;
        if (next_min == min)
          return ret;
        for (i = 0; i < length; i++)
          values[i] = log(values[i] + *pre_processing_parameter);
      }
    } else {
      if (*pre_processing_parameter == 0) {
        for (i = 0; i < length; i++)
          values[i] = exp(values[i]);
      } else {
        for (i = 0; i < length; i++)
          values[i] = exp(values[i]) - *pre_processing_parameter;
      }
    }
    break;
  default:
    ret = -4;
    break;
  }
  return ret;
}


x86 assembly (clang, -O0):
<pre_processing_func>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x50(%rbp)
test   %rax,%rax
je     1186 <pre_processing_func+0x66>
jmp    1173 <pre_processing_func+0x53>
mov    -0x50(%rbp),%rax
sub    $0x1,%rax
je     118b <pre_processing_func+0x6b>
jmp    1431 <pre_processing_func+0x311>
jmp    1438 <pre_processing_func+0x318>
cmpl   $0x0,-0x2c(%rbp)
jne    1376 <pre_processing_func+0x256>
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1215 <pre_processing_func+0xf5>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11d8 <pre_processing_func+0xb8>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    1202 <pre_processing_func+0xe2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1207 <pre_processing_func+0xe7>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    119c <pre_processing_func+0x7c>
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1283 <pre_processing_func+0x163>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1270 <pre_processing_func+0x150>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x48(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1270 <pre_processing_func+0x150>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1275 <pre_processing_func+0x155>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    121c <pre_processing_func+0xfc>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12e7 <pre_processing_func+0x1c7>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    12e2 <pre_processing_func+0x1c2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1040 <log@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12a7 <pre_processing_func+0x187>
jmp    1371 <pre_processing_func+0x251>
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jne    1322 <pre_processing_func+0x202>
jp     1322 <pre_processing_func+0x202>
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    143e <pre_processing_func+0x31e>
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    136c <pre_processing_func+0x24c>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
addsd  (%rax),%xmm0
call   1040 <log@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1329 <pre_processing_func+0x209>
jmp    1371 <pre_processing_func+0x251>
jmp    142c <pre_processing_func+0x30c>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13d8 <pre_processing_func+0x2b8>
jp     13d8 <pre_processing_func+0x2b8>
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    13d3 <pre_processing_func+0x2b3>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1030 <exp@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1398 <pre_processing_func+0x278>
jmp    1427 <pre_processing_func+0x307>
movl   $0x0,-0x30(%rbp)
movslq -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1422 <pre_processing_func+0x302>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1030 <exp@plt>
mov    -0x28(%rbp),%rax
subsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    13df <pre_processing_func+0x2bf>
jmp    1427 <pre_processing_func+0x307>
jmp    142c <pre_processing_func+0x30c>
jmp    1438 <pre_processing_func+0x318>
movl   $0xfffffffc,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pre_processing_func>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
xor    %r14d,%r14d
test   %rdx,%rdx
je     11a4 <pre_processing_func+0x84>
cmp    $0x1,%rdx
jne    119e <pre_processing_func+0x7e>
mov    %rcx,%r12
mov    %rsi,%r15
mov    %rdi,%r13
movsd  (%rdi),%xmm0
test   %r8d,%r8d
je     11b1 <pre_processing_func+0x91>
movsd  (%r12),%xmm1
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    11f1 <pre_processing_func+0xd1>
jp     11f1 <pre_processing_func+0xd1>
test   %r15,%r15
jle    11a4 <pre_processing_func+0x84>
call   1030 <exp@plt>
movsd  %xmm0,0x0(%r13)
cmp    $0x1,%r15
je     11a4 <pre_processing_func+0x84>
mov    $0x1,%ebx
xchg   %ax,%ax
movsd  0x0(%r13,%rbx,8),%xmm0
call   1030 <exp@plt>
movsd  %xmm0,0x0(%r13,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1180 <pre_processing_func+0x60>
jmp    11a4 <pre_processing_func+0x84>
mov    $0xfffffffc,%r14d
mov    %r14d,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
test   %r15,%r15
jle    1247 <pre_processing_func+0x127>
movapd %xmm0,%xmm2
movapd %xmm0,%xmm1
cmp    $0x1,%r15
je     1302 <pre_processing_func+0x1e2>
lea    -0x1(%r15),%rdx
lea    -0x2(%r15),%rcx
mov    %edx,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    1250 <pre_processing_func+0x130>
mov    $0x1,%ecx
movapd %xmm0,%xmm3
movapd %xmm0,%xmm4
jmp    12b9 <pre_processing_func+0x199>
test   %r15,%r15
jle    11a4 <pre_processing_func+0x84>
call   1030 <exp@plt>
subsd  (%r12),%xmm0
movsd  %xmm0,0x0(%r13)
cmp    $0x1,%r15
je     11a4 <pre_processing_func+0x84>
mov    $0x1,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  0x0(%r13,%rbx,8),%xmm0
call   1030 <exp@plt>
subsd  (%r12),%xmm0
movsd  %xmm0,0x0(%r13,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1220 <pre_processing_func+0x100>
jmp    11a4 <pre_processing_func+0x84>
movapd %xmm0,%xmm1
jmp    143f <pre_processing_func+0x31f>
and    $0xfffffffffffffffc,%rdx
xor    %ecx,%ecx
movapd %xmm0,%xmm3
movapd %xmm0,%xmm4
xchg   %ax,%ax
movsd  0x8(%r13,%rcx,8),%xmm1
movsd  0x10(%r13,%rcx,8),%xmm2
movapd %xmm1,%xmm5
minsd  %xmm4,%xmm5
maxsd  %xmm3,%xmm1
movapd %xmm2,%xmm3
minsd  %xmm5,%xmm3
maxsd  %xmm1,%xmm2
movsd  0x18(%r13,%rcx,8),%xmm1
movapd %xmm1,%xmm5
minsd  %xmm3,%xmm5
maxsd  %xmm2,%xmm1
movsd  0x20(%r13,%rcx,8),%xmm3
movapd %xmm3,%xmm4
minsd  %xmm5,%xmm4
maxsd  %xmm1,%xmm3
add    $0x4,%rcx
cmp    %rcx,%rdx
jne    1260 <pre_processing_func+0x140>
add    $0x1,%rcx
movapd %xmm4,%xmm2
movapd %xmm3,%xmm1
test   %rax,%rax
je     1302 <pre_processing_func+0x1e2>
lea    0x0(,%rcx,8),%rcx
add    %r13,%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rcx,%rdx,8),%xmm1
movapd %xmm1,%xmm2
minsd  %xmm4,%xmm2
maxsd  %xmm3,%xmm1
add    $0x1,%rdx
movapd %xmm1,%xmm3
movapd %xmm2,%xmm4
cmp    %rdx,%rax
jne    12e0 <pre_processing_func+0x1c0>
test   %r15,%r15
jle    143b <pre_processing_func+0x31b>
movapd %xmm2,%xmm3
cmpltsd %xmm0,%xmm3
minsd  %xmm1,%xmm0
andpd  %xmm3,%xmm0
andnpd %xmm1,%xmm3
orpd   %xmm0,%xmm3
movapd %xmm3,%xmm1
cmp    $0x1,%r15
je     143b <pre_processing_func+0x31b>
lea    -0x1(%r15),%rdx
lea    -0x2(%r15),%rcx
mov    %edx,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    134f <pre_processing_func+0x22f>
mov    $0x1,%ecx
jmp    13f1 <pre_processing_func+0x2d1>
and    $0xfffffffffffffffc,%rdx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x8(%r13,%rcx,8),%xmm0
movsd  0x10(%r13,%rcx,8),%xmm3
movapd %xmm2,%xmm4
cmpltsd %xmm0,%xmm4
minsd  %xmm1,%xmm0
andpd  %xmm4,%xmm0
andnpd %xmm1,%xmm4
orpd   %xmm0,%xmm4
movapd %xmm2,%xmm0
cmpltsd %xmm3,%xmm0
minsd  %xmm4,%xmm3
andpd  %xmm0,%xmm3
andnpd %xmm4,%xmm0
orpd   %xmm0,%xmm3
movsd  0x18(%r13,%rcx,8),%xmm0
movapd %xmm2,%xmm1
cmpltsd %xmm0,%xmm1
minsd  %xmm3,%xmm0
andpd  %xmm1,%xmm0
andnpd %xmm3,%xmm1
orpd   %xmm1,%xmm0
movsd  0x20(%r13,%rcx,8),%xmm1
movapd %xmm2,%xmm3
cmpltsd %xmm1,%xmm3
minsd  %xmm0,%xmm1
andpd  %xmm3,%xmm1
andnpd %xmm0,%xmm3
orpd   %xmm3,%xmm1
add    $0x4,%rcx
cmp    %rcx,%rdx
jne    1360 <pre_processing_func+0x240>
add    $0x1,%rcx
test   %rax,%rax
je     143b <pre_processing_func+0x31b>
lea    0x0(,%rcx,8),%rcx
add    %r13,%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rcx,%rdx,8),%xmm0
movapd %xmm2,%xmm3
cmpltsd %xmm0,%xmm3
minsd  %xmm1,%xmm0
andpd  %xmm3,%xmm0
andnpd %xmm1,%xmm3
orpd   %xmm0,%xmm3
movapd %xmm3,%xmm1
add    $0x1,%rdx
cmp    %rdx,%rax
jne    1410 <pre_processing_func+0x2f0>
movapd %xmm2,%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
jbe    1481 <pre_processing_func+0x361>
movq   $0x0,(%r12)
test   %r15,%r15
jle    11a4 <pre_processing_func+0x84>
xor    %r14d,%r14d
xor    %ebx,%ebx
nop
movsd  0x0(%r13,%rbx,8),%xmm0
call   1040 <log@plt>
movsd  %xmm0,0x0(%r13,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1460 <pre_processing_func+0x340>
jmp    11a4 <pre_processing_func+0x84>
movapd %xmm0,%xmm2
addsd  %xmm0,%xmm2
ucomisd %xmm0,%xmm1
subsd  %xmm2,%xmm1
movsd  %xmm1,(%r12)
jne    149f <pre_processing_func+0x37f>
jnp    11a4 <pre_processing_func+0x84>
test   %r15,%r15
jle    11a4 <pre_processing_func+0x84>
addsd  0x0(%r13),%xmm1
movapd %xmm1,%xmm0
call   1040 <log@plt>
movsd  %xmm0,0x0(%r13)
cmp    $0x1,%r15
je     11a4 <pre_processing_func+0x84>
mov    $0x1,%ebx
nopl   0x0(%rax)
movsd  0x0(%r13,%rbx,8),%xmm0
addsd  (%r12),%xmm0
call   1040 <log@plt>
movsd  %xmm0,0x0(%r13,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r15
jne    14d0 <pre_processing_func+0x3b0>
jmp    11a4 <pre_processing_func+0x84>

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

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