void integrate(float *s, int nt, float *dt) {
  float s0, s1;
  int it;
  s0 = 0.5 * (s[0]) * (*dt);
  for (it = 1; it < nt; it++) {
    s1 = 0.5 * (s[it - 1] + s[it]) * (*dt) + s0;
    s[it - 1] = s0;
    s0 = s1;
  }
  s[nt - 1] = s1;
}


x86 assembly (clang, -O0):
<integrate>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xedd(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11d7 <integrate+0xd7>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe82(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm2
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x1c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1147 <integrate+0x47>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<integrate>:
cmp    $0x2,%esi
jl     11b4 <integrate+0xb4>
movss  (%rdi),%xmm1
movss  (%rdx),%xmm2
xorps  %xmm3,%xmm3
cvtss2sd %xmm1,%xmm3
movsd  0xee0(%rip),%xmm0
mulsd  %xmm0,%xmm3
cvtss2sd %xmm2,%xmm4
mulsd  %xmm4,%xmm3
cvtsd2ss %xmm3,%xmm3
movss  0x4(%rdi),%xmm2
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm0,%xmm1
cvtss2sd %xmm3,%xmm5
mulsd  %xmm4,%xmm1
addsd  %xmm5,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm3,(%rdi)
jne    115c <integrate+0x5c>
movaps %xmm1,%xmm3
jmp    11b4 <integrate+0xb4>
mov    %esi,%eax
mov    $0x2,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movss  (%rdx),%xmm3
movss  (%rdi,%rcx,4),%xmm4
addss  %xmm4,%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm0,%xmm2
cvtss2sd %xmm3,%xmm3
mulsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
addsd  %xmm3,%xmm2
xorps  %xmm3,%xmm3
cvtsd2ss %xmm2,%xmm3
movss  %xmm1,-0x4(%rdi,%rcx,4)
add    $0x1,%rcx
movaps %xmm3,%xmm1
movaps %xmm4,%xmm2
cmp    %rcx,%rax
jne    1170 <integrate+0x70>
movslq %esi,%rax
movss  %xmm3,-0x4(%rdi,%rax,4)
ret

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

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