float integrate(float *y, float time_step, int sample_size) {
  float sum = 0, h, temp;
  int i, j, k = 0, l = 0;
  sum = sum + y[0];
  for (i = 1; i < (sample_size - 1); i++) {
    if (k == 0 || l == 0) {
      sum = sum + 3 * y[i];
      if (k == 1)
        l = 1;
      k = 1;
    } else {
      sum = sum + 2 * y[i];
      k = 0;
      l = 0;
    }
  }
  sum = sum + y[i];
  sum = sum * (3 * time_step / 8);
  return sum;
}


x86 assembly (clang, -O0):
<integrate>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
addss  (%rax),%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11e8 <integrate+0xe8>
cmpl   $0x0,-0x28(%rbp)
je     1164 <integrate+0x64>
cmpl   $0x0,-0x2c(%rbp)
jne    11a8 <integrate+0xa8>
movss  -0x14(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  0xe86(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
cmpl   $0x1,-0x28(%rbp)
jne    119c <integrate+0x9c>
movl   $0x1,-0x2c(%rbp)
movl   $0x1,-0x28(%rbp)
jmp    11d5 <integrate+0xd5>
movss  -0x14(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
jmp    11da <integrate+0xda>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    113f <integrate+0x3f>
movss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
movss  0xdf8(%rip),%xmm1
mulss  -0xc(%rbp),%xmm1
movss  0xde7(%rip),%xmm2
divss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<integrate>:
xorps  %xmm1,%xmm1
addss  (%rdi),%xmm1
mov    $0x1,%eax
cmp    $0x3,%esi
jl     116a <integrate+0x6a>
add    $0xffffffff,%esi
xor    %ecx,%ecx
mov    $0x1,%eax
movss  0xedd(%rip),%xmm2
xor    %edx,%edx
jmp    114c <integrate+0x4c>
nopw   0x0(%rax,%rax,1)
mulss  %xmm2,%xmm3
addss  %xmm3,%xmm1
cmp    $0x1,%edx
cmove  %edx,%ecx
mov    $0x1,%edx
add    $0x1,%rax
cmp    %rax,%rsi
je     1167 <integrate+0x67>
movss  (%rdi,%rax,4),%xmm3
test   %edx,%edx
je     1130 <integrate+0x30>
test   %ecx,%ecx
je     1130 <integrate+0x30>
addss  %xmm3,%xmm3
addss  %xmm3,%xmm1
xor    %edx,%edx
xor    %ecx,%ecx
jmp    1143 <integrate+0x43>
mov    %rsi,%rax
addss  (%rdi,%rax,4),%xmm1
mulss  0xe89(%rip),%xmm0
mulss  0xe85(%rip),%xmm0
mulss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @integrate(float* %0, float %1, i32 %2) {
%4 = alloca float*
%5 = alloca float
%6 = alloca i32
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store float* %0, float** %4
store float %1, float* %5
store i32 %2, i32* %6
store float 0.000000e+00, float* %7
store i32 0, i32* %12
store i32 0, i32* %13
%14 = load float, float* %7
%15 = load float*, float** %4
%16 = getelementptr inbounds float, float* %15, i64 0
%17 = load float, float* %16
%18 = fadd float %14, %17
store float %18, float* %7
store i32 1, i32* %10
br label %19
19: ; preds = %51, %3
%20 = load i32, i32* %10
%21 = load i32, i32* %6
%22 = sub nsw i32 %21, 1
%23 = icmp slt i32 %20, %22
br i1 %23, label %24, label %54
24: ; preds = %19
%25 = load i32, i32* %12
%26 = icmp eq i32 %25, 0
br i1 %26, label %30, label %27
27: ; preds = %24
%28 = load i32, i32* %13
%29 = icmp eq i32 %28, 0
br i1 %29, label %30, label %42
30: ; preds = %27, %24
%31 = load float, float* %7
%32 = load float*, float** %4
%33 = load i32, i32* %10
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds float, float* %32, i64 %34
%36 = load float, float* %35
%37 = call float @llvm.fmuladd.f32(float 3.000000e+00, float %36, float %31)
store float %37, float* %7
%38 = load i32, i32* %12
%39 = icmp eq i32 %38, 1
br i1 %39, label %40, label %41
40: ; preds = %30
store i32 1, i32* %13
br label %41
41: ; preds = %40, %30
store i32 1, i32* %12
br label %50
42: ; preds = %27
%43 = load float, float* %7
%44 = load float*, float** %4
%45 = load i32, i32* %10
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
%49 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %48, float %43)
store float %49, float* %7
store i32 0, i32* %12
store i32 0, i32* %13
br label %50
50: ; preds = %42, %41
br label %51
51: ; preds = %50
%52 = load i32, i32* %10
%53 = add nsw i32 %52, 1
store i32 %53, i32* %10
br label %19
54: ; preds = %19
%55 = load float, float* %7
%56 = load float*, float** %4
%57 = load i32, i32* %10
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds float, float* %56, i64 %58
%60 = load float, float* %59
%61 = fadd float %55, %60
store float %61, float* %7
%62 = load float, float* %7
%63 = load float, float* %5
%64 = fmul float 3.000000e+00, %63
%65 = fdiv float %64, 8.000000e+00
%66 = fmul float %62, %65
store float %66, float* %7
%67 = load float, float* %7
ret float %67
}

LLVM IR (-O2):
define float @integrate(float* nocapture %0, float %1, i32 %2) {
%4 = load float, float* %0
%5 = fadd float %4, 0.000000e+00
%6 = icmp sgt i32 %2, 2
br i1 %6, label %7, label %35
7: ; preds = %3
%8 = add nsw i32 %2, -1
%9 = zext i32 %8 to i64
br label %10
10: ; preds = %7, %26
%11 = phi i64 [ 1, %7 ], [ %30, %26 ]
%12 = phi i32 [ 0, %7 ], [ %29, %26 ]
%13 = phi i32 [ 0, %7 ], [ %28, %26 ]
%14 = phi float [ %5, %7 ], [ %27, %26 ]
%15 = icmp eq i32 %13, 0
%16 = icmp eq i32 %12, 0
%17 = select i1 %15, i1 true, i1 %16
%18 = getelementptr inbounds float, float* %0, i64 %11
%19 = load float, float* %18
br i1 %17, label %20, label %24
20: ; preds = %10
%21 = tail call float @llvm.fmuladd.f32(float %19, float 3.000000e+00, float %14)
%22 = icmp eq i32 %13, 1
%23 = select i1 %22, i32 1, i32 %12
br label %26
24: ; preds = %10
%25 = tail call float @llvm.fmuladd.f32(float %19, float 2.000000e+00, float %14)
br label %26
26: ; preds = %20, %24
%27 = phi float [ %21, %20 ], [ %25, %24 ]
%28 = phi i32 [ 1, %20 ], [ 0, %24 ]
%29 = phi i32 [ %23, %20 ], [ 0, %24 ]
%30 = add nuw nsw i64 %11, 1
%31 = icmp eq i64 %30, %9
br i1 %31, label %32, label %10
32: ; preds = %26
%33 = add i32 %2, -1
%34 = zext i32 %33 to i64
br label %35
35: ; preds = %32, %3
%36 = phi i64 [ 1, %3 ], [ %34, %32 ]
%37 = phi float [ %5, %3 ], [ %27, %32 ]
%38 = getelementptr inbounds float, float* %0, i64 %36
%39 = load float, float* %38
%40 = fadd float %37, %39
%41 = fmul float %1, 3.000000e+00
%42 = fmul float %41, 1.250000e-01
%43 = fmul float %42, %40
ret float %43
}