#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);
void updatePre(double *sue, double *sui, double *psp, double *pspS,
               double *pspTilde, double pre) {
  *sue = exp(-.1 * .1) * *sue + pre;
  *sui = exp(-.3 * .1) * *sui + pre;
  *psp = .1 * .3 / (.3 - .1) * (*sue - *sui);
  *pspS = *psp;
  *pspTilde = exp(-.1 / 9) * *pspTilde + *pspS;
}


x86 assembly (clang, -O0):
<updatePre>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movsd  %xmm0,-0x30(%rbp)
movsd  0xedf(%rip),%xmm0
call   1030 <exp@plt>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xead(%rip),%xmm0
call   1030 <exp@plt>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
subsd  (%rax),%xmm1
movsd  0xe6b(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0xe3f(%rip),%xmm0
call   1030 <exp@plt>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<updatePre>:
movsd  (%rdi),%xmm1
mulsd  0xef4(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi)
movsd  (%rsi),%xmm1
mulsd  0xee8(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi)
movsd  (%rdi),%xmm0
subsd  %xmm1,%xmm0
mulsd  0xed8(%rip),%xmm0
movsd  %xmm0,(%rdx)
movsd  %xmm0,(%rcx)
movsd  (%r8),%xmm1
mulsd  0xecb(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r8)
ret

LLVM IR (-O0):
define void @updatePre(double* %0, double* %1, double* %2, double* %3, double* %4, double %5) {
%7 = alloca double*
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double
store double* %0, double** %7
store double* %1, double** %8
store double* %2, double** %9
store double* %3, double** %10
store double* %4, double** %11
store double %5, double* %12
%13 = call double @exp(double 0xBF847AE147AE147C)
%14 = load double*, double** %7
%15 = load double, double* %14
%16 = load double, double* %12
%17 = call double @llvm.fmuladd.f64(double %13, double %15, double %16)
%18 = load double*, double** %7
store double %17, double* %18
%19 = call double @exp(double -3.000000e-02)
%20 = load double*, double** %8
%21 = load double, double* %20
%22 = load double, double* %12
%23 = call double @llvm.fmuladd.f64(double %19, double %21, double %22)
%24 = load double*, double** %8
store double %23, double* %24
%25 = load double*, double** %7
%26 = load double, double* %25
%27 = load double*, double** %8
%28 = load double, double* %27
%29 = fsub double %26, %28
%30 = fmul double 1.500000e-01, %29
%31 = load double*, double** %9
store double %30, double* %31
%32 = load double*, double** %9
%33 = load double, double* %32
%34 = load double*, double** %10
store double %33, double* %34
%35 = call double @exp(double 0xBF86C16C16C16C17)
%36 = load double*, double** %11
%37 = load double, double* %36
%38 = load double*, double** %10
%39 = load double, double* %38
%40 = call double @llvm.fmuladd.f64(double %35, double %37, double %39)
%41 = load double*, double** %11
store double %40, double* %41
ret void
}

LLVM IR (-O2):
define void @updatePre(double* nocapture %0, double* nocapture %1, double* nocapture writeonly %2, double* nocapture writeonly %3, double* nocapture %4, double %5) {
%7 = load double, double* %0
%8 = tail call double @llvm.fmuladd.f64(double %7, double 0x3FEFAE7CFD2B9CFE, double %5)
store double %8, double* %0
%9 = load double, double* %1
%10 = tail call double @llvm.fmuladd.f64(double %9, double 0x3FEF0DE3CAA47BCF, double %5)
store double %10, double* %1
%11 = load double, double* %0
%12 = fsub double %11, %10
%13 = fmul double %12, 1.500000e-01
store double %13, double* %2
store double %13, double* %3
%14 = load double, double* %4
%15 = tail call double @llvm.fmuladd.f64(double %14, double 0x3FEFA57B496C489F, double %13)
store double %15, double* %4
ret void
}