#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 fade(double t, size_t n_count, double t_arr[], double y_arr[]) {
  if (t < t_arr[0])
    return y_arr[0];
  for (size_t i = 1; i < n_count; i++) {
    if (t < t_arr[i])
      return y_arr[i - 1] + (y_arr[i] - y_arr[i - 1]) * (t - t_arr[i - 1]) /
                                (t_arr[i] - t_arr[i - 1]);
  }
  return y_arr[n_count - 1];
}


x86 assembly (clang, -O0):
<fade>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    113e <fade+0x3e>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1215 <fade+0x115>
movq   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    11ff <fade+0xff>
movsd  -0x10(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    11e9 <fade+0xe9>
mov    -0x28(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm1
movsd  -0x10(%rbp),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1215 <fade+0x115>
jmp    11ee <fade+0xee>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1146 <fade+0x46>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fade>:
movsd  (%rsi),%xmm1
ucomisd %xmm0,%xmm1
jbe    110f <fade+0xf>
movsd  (%rdx),%xmm0
ret
cmp    $0x2,%rdi
jb     1134 <fade+0x34>
mov    $0x1,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
ja     113b <fade+0x3b>
add    $0x1,%rax
cmp    %rax,%rdi
jne    1120 <fade+0x20>
movsd  -0x8(%rdx,%rdi,8),%xmm0
ret
movsd  -0x8(%rdx,%rax,8),%xmm2
movsd  (%rdx,%rax,8),%xmm3
subsd  %xmm2,%xmm3
movsd  -0x8(%rsi,%rax,8),%xmm4
subsd  %xmm4,%xmm0
mulsd  %xmm3,%xmm0
subsd  %xmm4,%xmm1
divsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
ret

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

LLVM IR (-O2):
define double @fade(double %0, i64 %1, double* nocapture %2, double* nocapture %3) {
%5 = load double, double* %2
%6 = fcmp ogt double %5, %0
br i1 %6, label %9, label %7
7: ; preds = %4
%8 = icmp ugt i64 %1, 1
br i1 %8, label %11, label %33
9: ; preds = %4
%10 = load double, double* %3
br label %37
11: ; preds = %7, %16
%12 = phi i64 [ %17, %16 ], [ 1, %7 ]
%13 = getelementptr inbounds double, double* %2, i64 %12
%14 = load double, double* %13
%15 = fcmp ogt double %14, %0
br i1 %15, label %19, label %16
16: ; preds = %11
%17 = add nuw i64 %12, 1
%18 = icmp eq i64 %17, %1
br i1 %18, label %33, label %11
19: ; preds = %11
%20 = add i64 %12, -1
%21 = getelementptr inbounds double, double* %3, i64 %20
%22 = load double, double* %21
%23 = getelementptr inbounds double, double* %3, i64 %12
%24 = load double, double* %23
%25 = fsub double %24, %22
%26 = getelementptr inbounds double, double* %2, i64 %20
%27 = load double, double* %26
%28 = fsub double %0, %27
%29 = fmul double %25, %28
%30 = fsub double %14, %27
%31 = fdiv double %29, %30
%32 = fadd double %22, %31
br label %37
33: ; preds = %16, %7
%34 = add i64 %1, -1
%35 = getelementptr inbounds double, double* %3, i64 %34
%36 = load double, double* %35
br label %37
37: ; preds = %19, %33, %9
%38 = phi double [ %10, %9 ], [ %32, %19 ], [ %36, %33 ]
ret double %38
}