#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 */
scalar_t__ RAND_MAX;
int log(int);
scalar_t__ rand();
void sm_ssa(int steps, double tmax, int nstates, int initialstate,
            double *flat_rates, int *states, double *dwells, int *last) {
  int i, j;
  double r1, r2;
  double rates[nstates][nstates], cumulatives[nstates][nstates];
  double outrates[nstates];
  int currentstate = initialstate;
  double timetotal = 0.;
  for (i = 0; i < nstates; i++) {
    outrates[i] = 0.;
    cumulatives[i][0] = 0.;
    for (j = 0; j < nstates; j++) {
      rates[i][j] = flat_rates[nstates * i + j];
      cumulatives[i][j] = flat_rates[nstates * i + j];
      if (j > 0) {
        cumulatives[i][j] += cumulatives[i][j - 1];
      }
    }
    outrates[i] = cumulatives[i][nstates - 1];
  }
  for (i = 0; i < steps; i++) {
    states[i] = currentstate;
    r1 = ((double)rand()) / ((double)RAND_MAX);
    r2 = ((double)rand()) / ((double)RAND_MAX);
    dwells[i] = 1. / outrates[states[i]] * log(1. / r1);
    if (i == 0) {
      dwells[i] *= (((double)rand()) / ((double)RAND_MAX));
    }
    timetotal += dwells[i];
    for (j = 0; j < nstates; j++) {
      currentstate = j;
      if (cumulatives[states[i]][j] > r2 * outrates[states[i]]) {
        break;
      }
    }
    if (timetotal > tmax) {
      last[0] = i + 1;
      break;
    }
  }
}


x86 assembly (clang, -O0):
<sm_ssa>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x14(%rbp),%eax
mov    %rax,-0xb0(%rbp)
mov    %rsp,%rcx
mov    %rcx,-0x50(%rbp)
mov    %rax,%rcx
imul   %rcx,%rcx
lea    0xf(,%rcx,8),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0xa8(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x58(%rbp)
mov    %rax,-0x60(%rbp)
mov    -0x14(%rbp),%eax
mov    %rax,-0xa0(%rbp)
mov    %rax,%rcx
imul   %rcx,%rcx
lea    0xf(,%rcx,8),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x98(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x68(%rbp)
mov    %rax,-0x70(%rbp)
mov    -0x14(%rbp),%eax
lea    0xf(,%rax,8),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x90(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x78(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x7c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1372 <sm_ssa+0x252>
mov    -0x98(%rbp),%rax
mov    -0xa0(%rbp),%rdx
mov    -0x90(%rbp),%rcx
movslq -0x34(%rbp),%rsi
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rcx,%rsi,8)
movslq -0x34(%rbp),%rcx
imul   %rdx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1329 <sm_ssa+0x209>
mov    -0x98(%rbp),%rax
mov    -0xa0(%rbp),%rdx
mov    -0xa8(%rbp),%rcx
mov    -0xb0(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x14(%rbp),%r8d
imul   -0x34(%rbp),%r8d
add    -0x38(%rbp),%r8d
movslq %r8d,%r8
movsd  (%rsi,%r8,8),%xmm0
movslq -0x34(%rbp),%rsi
imul   %rdi,%rsi
shl    $0x3,%rsi
add    %rsi,%rcx
movslq -0x38(%rbp),%rsi
movsd  %xmm0,(%rcx,%rsi,8)
mov    -0x20(%rbp),%rcx
mov    -0x14(%rbp),%esi
imul   -0x34(%rbp),%esi
add    -0x38(%rbp),%esi
movslq %esi,%rsi
movsd  (%rcx,%rsi,8),%xmm0
movslq -0x34(%rbp),%rcx
imul   %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x0,-0x38(%rbp)
jle    1316 <sm_ssa+0x1f6>
mov    -0x98(%rbp),%rax
mov    -0xa0(%rbp),%rdx
movslq -0x34(%rbp),%rsi
imul   %rdx,%rsi
shl    $0x3,%rsi
mov    %rax,%rcx
add    %rsi,%rcx
mov    -0x38(%rbp),%esi
sub    $0x1,%esi
movslq %esi,%rsi
movsd  (%rcx,%rsi,8),%xmm0
movslq -0x34(%rbp),%rcx
imul   %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x38(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    131b <sm_ssa+0x1fb>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1239 <sm_ssa+0x119>
mov    -0x90(%rbp),%rax
mov    -0x98(%rbp),%rcx
mov    -0xa0(%rbp),%rsi
movslq -0x34(%rbp),%rdx
imul   %rsi,%rdx
shl    $0x3,%rdx
add    %rdx,%rcx
mov    -0x14(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsd  (%rcx,%rdx,8),%xmm0
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11f5 <sm_ssa+0xd5>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1545 <sm_ssa+0x425>
mov    -0x7c(%rbp),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    $0x0,%al
call   1040 <rand@plt>
cvtsi2sd %rax,%xmm0
mov    0x2c42(%rip),%rax
cvtsi2sdq (%rax),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    $0x0,%al
call   1040 <rand@plt>
mov    %rax,%rcx
mov    -0x90(%rbp),%rax
cvtsi2sd %rcx,%xmm0
mov    0x2c17(%rip),%rcx
cvtsi2sdq (%rcx),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  0xc0d(%rip),%xmm0
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  0xbf8(%rip),%xmm0
divsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
movsd  -0xb8(%rbp),%xmm0
ff
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x0,-0x34(%rbp)
jne    146b <sm_ssa+0x34b>
mov    $0x0,%al
call   1040 <rand@plt>
cvtsi2sd %rax,%xmm0
mov    0x2b98(%rip),%rax
cvtsi2sdq (%rax),%xmm1
divsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    150e <sm_ssa+0x3ee>
mov    -0x90(%rbp),%rax
mov    -0x98(%rbp),%rcx
mov    -0xa0(%rbp),%rsi
mov    -0x38(%rbp),%edx
mov    %edx,-0x7c(%rbp)
mov    -0x28(%rbp),%rdx
movslq -0x34(%rbp),%rdi
movslq (%rdx,%rdi,4),%rdx
imul   %rsi,%rdx
shl    $0x3,%rdx
add    %rdx,%rcx
movslq -0x38(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
movsd  -0x48(%rbp),%xmm1
mov    -0x28(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
mulsd  (%rax,%rcx,8),%xmm1
ucomisd %xmm1,%xmm0
jbe    14fb <sm_ssa+0x3db>
jmp    150e <sm_ssa+0x3ee>
jmp    1500 <sm_ssa+0x3e0>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    148f <sm_ssa+0x36f>
movsd  -0x88(%rbp),%xmm0
ff
ucomisd -0x10(%rbp),%xmm0
jbe    1532 <sm_ssa+0x412>
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    1545 <sm_ssa+0x425>
jmp    1537 <sm_ssa+0x417>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1379 <sm_ssa+0x259>
mov    -0x50(%rbp),%rax
mov    %rax,%rsp
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sm_ssa>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r9,-0x68(%rbp)
mov    %r8,-0x70(%rbp)
mov    %rcx,-0x30(%rbp)
mov    %edx,%ebx
movsd  %xmm0,-0x88(%rbp)
ff
mov    %edi,-0x40(%rbp)
mov    %esi,%r14d
mov    %r14,%rax
imul   %r14,%rax
mov    %rsp,%r9
lea    0xf(,%rax,8),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%r9
mov    %r9,%rsp
mov    %rsp,%rcx
lea    0xf(,%r14,8),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%rcx
mov    %rcx,-0x58(%rbp)
mov    %rcx,%rsp
mov    %rsi,-0x38(%rbp)
test   %esi,%esi
mov    %r9,-0x60(%rbp)
jle    12b9 <sm_ssa+0x199>
mov    -0x38(%rbp),%rax
add    $0xffffffff,%eax
mov    %rax,-0x50(%rbp)
lea    -0x1(%r14),%r11
lea    -0x2(%r14),%rax
mov    %rax,-0x48(%rbp)
mov    %r11d,%r15d
and    $0x3,%r15d
and    $0xfffffffffffffffc,%r11
lea    0x20(%r9),%rax
lea    0x0(,%r14,8),%r10
mov    -0x30(%rbp),%r12
lea    0x20(%r12),%rsi
xor    %edx,%edx
mov    %r9,%r13
jmp    1203 <sm_ssa+0xe3>
mov    -0x60(%rbp),%r9
lea    (%r9,%r8,8),%rcx
mov    -0x50(%rbp),%rdi
movsd  (%rcx,%rdi,8),%xmm0
mov    -0x58(%rbp),%rcx
movsd  %xmm0,(%rcx,%rdx,8)
add    $0x1,%rdx
add    %r10,%rax
add    %r10,%rsi
add    %r10,%r13
add    %r10,%r12
cmp    %r14,%rdx
je     12b9 <sm_ssa+0x199>
mov    %rdx,%r8
imul   %r14,%r8
mov    %rdx,%rcx
imul   %r14,%rcx
mov    -0x30(%rbp),%rdi
movsd  (%rdi,%rcx,8),%xmm0
movsd  %xmm0,(%r9,%r8,8)
cmpl   $0x1,-0x38(%rbp)
je     11d0 <sm_ssa+0xb0>
mov    -0x60(%rbp),%rcx
movsd  (%rcx,%r8,8),%xmm0
mov    $0x1,%edi
cmpq   $0x3,-0x48(%rbp)
jb     127b <sm_ssa+0x15b>
xor    %edi,%edi
xchg   %ax,%ax
addsd  -0x18(%rsi,%rdi,8),%xmm0
movsd  %xmm0,-0x18(%rax,%rdi,8)
addsd  -0x10(%rsi,%rdi,8),%xmm0
movsd  %xmm0,-0x10(%rax,%rdi,8)
addsd  -0x8(%rsi,%rdi,8),%xmm0
movsd  %xmm0,-0x8(%rax,%rdi,8)
addsd  (%rsi,%rdi,8),%xmm0
movsd  %xmm0,(%rax,%rdi,8)
add    $0x4,%rdi
cmp    %rdi,%r11
jne    1240 <sm_ssa+0x120>
add    $0x1,%rdi
test   %r15,%r15
je     11d0 <sm_ssa+0xb0>
lea    0x0(,%rdi,8),%r9
add    %r13,%r9
lea    (%r12,%rdi,8),%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
addsd  (%rdi,%rcx,8),%xmm0
movsd  %xmm0,(%r9,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%r15
jne    12a0 <sm_ssa+0x180>
jmp    11d0 <sm_ssa+0xb0>
mov    -0x40(%rbp),%eax
test   %eax,%eax
jle    143d <sm_ssa+0x31d>
movslq -0x38(%rbp),%r12
mov    %eax,%eax
mov    %rax,-0x78(%rbp)
xorpd  %xmm0,%xmm0
xor    %r15d,%r15d
mov    %r14,-0x80(%rbp)
nopl   0x0(%rax)
movsd  %xmm0,-0x30(%rbp)
mov    -0x70(%rbp),%r13
mov    %ebx,0x0(%r13,%r15,4)
xor    %eax,%eax
call   1040 <rand@plt>
xorps  %xmm1,%xmm1
cvtsi2sd %rax,%xmm1
mov    0x2ce4(%rip),%r14
xorps  %xmm0,%xmm0
cvtsi2sdq (%r14),%xmm0
divsd  %xmm0,%xmm1
movsd  %xmm1,-0x48(%rbp)
xor    %eax,%eax
call   1040 <rand@plt>
xorps  %xmm0,%xmm0
cvtsi2sdq (%r14),%xmm0
movsd  %xmm0,-0x40(%rbp)
movslq 0x0(%r13,%r15,4),%rcx
movsd  0xcca(%rip),%xmm0
movapd %xmm0,%xmm1
mov    -0x58(%rbp),%rdx
divsd  (%rdx,%rcx,8),%xmm1
movsd  %xmm1,-0x50(%rbp)
mov    %rax,%r13
divsd  -0x48(%rbp),%xmm0
cvttsd2si %xmm0,%edi
call   1030 <log@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax,%r15,8)
test   %r15,%r15
jne    13a6 <sm_ssa+0x286>
xor    %eax,%eax
call   1040 <rand@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    0x2c5e(%rip),%rax
xorps  %xmm1,%xmm1
cvtsi2sdq (%rax),%xmm1
divsd  %xmm1,%xmm0
mov    -0x68(%rbp),%rax
mulsd  (%rax,%r15,8),%xmm0
movsd  %xmm0,(%rax,%r15,8)
cmpl   $0x0,-0x38(%rbp)
mov    -0x60(%rbp),%rcx
mov    -0x80(%rbp),%r14
jle    140b <sm_ssa+0x2eb>
xorps  %xmm1,%xmm1
cvtsi2sd %r13,%xmm1
divsd  -0x40(%rbp),%xmm1
mov    -0x70(%rbp),%rax
movslq (%rax,%r15,4),%rax
mov    -0x58(%rbp),%rdx
mulsd  (%rdx,%rax,8),%xmm1
imul   %r14,%rax
lea    (%rcx,%rax,8),%rax
mov    $0xffffffff,%ebx
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  -0x8(%rax,%rcx,8),%xmm2
add    $0x1,%ebx
ucomisd %xmm1,%xmm2
ja     140b <sm_ssa+0x2eb>
lea    0x1(%rcx),%rdx
cmp    %r12,%rcx
mov    %rdx,%rcx
jl     13f0 <sm_ssa+0x2d0>
movsd  -0x30(%rbp),%xmm1
addsd  %xmm0,%xmm1
ucomisd -0x88(%rbp),%xmm1
ff
ja     1432 <sm_ssa+0x312>
movapd %xmm1,%xmm0
add    $0x1,%r15
cmp    -0x78(%rbp),%r15
jne    12e0 <sm_ssa+0x1c0>
jmp    143d <sm_ssa+0x31d>
add    $0x1,%r15d
mov    0x10(%rbp),%rax
mov    %r15d,(%rax)
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@RAND_MAX = global i64 0
define void @sm_ssa(i32 %0, double %1, i32 %2, i32 %3, double* nocapture %4, i32* nocapture %5, double* nocapture %6, i32* nocapture writeonly %7) {
%9 = zext i32 %2 to i64
%10 = mul nuw i64 %9, %9
%11 = alloca double, i64 %10
%12 = alloca double, i64 %9
%13 = icmp sgt i32 %2, 0
br i1 %13, label %14, label %25
14: ; preds = %8
%15 = add nsw i32 %2, -1
%16 = zext i32 %15 to i64
%17 = zext i32 %2 to i64
%18 = icmp eq i32 %2, 1
%19 = add nsw i64 %9, -1
%20 = add nsw i64 %9, -2
%21 = and i64 %19, 3
%22 = icmp ult i64 %20, 3
%23 = and i64 %19, -4
%24 = icmp eq i64 %21, 0
br label %30
25: ; preds = %87, %8
%26 = icmp sgt i32 %0, 0
br i1 %26, label %27, label %157
27: ; preds = %25
%28 = sext i32 %2 to i64
%29 = zext i32 %0 to i64
br label %92
30: ; preds = %14, %87
%31 = phi i64 [ 0, %14 ], [ %90, %87 ]
%32 = getelementptr inbounds double, double* %12, i64 %31
%33 = mul nuw nsw i64 %31, %9
%34 = getelementptr inbounds double, double* %11, i64 %33
%35 = mul nsw i64 %31, %17
%36 = getelementptr inbounds double, double* %4, i64 %35
%37 = load double, double* %36
store double %37, double* %34
br i1 %18, label %87, label %38
38: ; preds = %30
%39 = mul i64 %31, %9
%40 = getelementptr double, double* %11, i64 %39
%41 = load double, double* %40
br i1 %22, label %72, label %42
42: ; preds = %38, %42
%43 = phi double [ %68, %42 ], [ %41, %38 ]
%44 = phi i64 [ %69, %42 ], [ 1, %38 ]
%45 = phi i64 [ %70, %42 ], [ 0, %38 ]
%46 = add nuw nsw i64 %44, %35
%47 = getelementptr inbounds double, double* %4, i64 %46
%48 = load double, double* %47
%49 = getelementptr inbounds double, double* %34, i64 %44
%50 = fadd double %48, %43
store double %50, double* %49
%51 = add nuw nsw i64 %44, 1
%52 = add nuw nsw i64 %51, %35
%53 = getelementptr inbounds double, double* %4, i64 %52
%54 = load double, double* %53
%55 = getelementptr inbounds double, double* %34, i64 %51
%56 = fadd double %54, %50
store double %56, double* %55
%57 = add nuw nsw i64 %44, 2
%58 = add nuw nsw i64 %57, %35
%59 = getelementptr inbounds double, double* %4, i64 %58
%60 = load double, double* %59
%61 = getelementptr inbounds double, double* %34, i64 %57
%62 = fadd double %60, %56
store double %62, double* %61
%63 = add nuw nsw i64 %44, 3
%64 = add nuw nsw i64 %63, %35
%65 = getelementptr inbounds double, double* %4, i64 %64
%66 = load double, double* %65
%67 = getelementptr inbounds double, double* %34, i64 %63
%68 = fadd double %66, %62
store double %68, double* %67
%69 = add nuw nsw i64 %44, 4
%70 = add i64 %45, 4
%71 = icmp eq i64 %70, %23
br i1 %71, label %72, label %42
72: ; preds = %42, %38
%73 = phi double [ %41, %38 ], [ %68, %42 ]
%74 = phi i64 [ 1, %38 ], [ %69, %42 ]
br i1 %24, label %87, label %75
75: ; preds = %72, %75
%76 = phi double [ %83, %75 ], [ %73, %72 ]
%77 = phi i64 [ %84, %75 ], [ %74, %72 ]
%78 = phi i64 [ %85, %75 ], [ 0, %72 ]
%79 = add nuw nsw i64 %77, %35
%80 = getelementptr inbounds double, double* %4, i64 %79
%81 = load double, double* %80
%82 = getelementptr inbounds double, double* %34, i64 %77
%83 = fadd double %81, %76
store double %83, double* %82
%84 = add nuw nsw i64 %77, 1
%85 = add i64 %78, 1
%86 = icmp eq i64 %85, %21
br i1 %86, label %87, label %75
87: ; preds = %72, %75, %30
%88 = getelementptr inbounds double, double* %34, i64 %16
%89 = load double, double* %88
store double %89, double* %32
%90 = add nuw nsw i64 %31, 1
%91 = icmp eq i64 %90, %9
br i1 %91, label %25, label %30
92: ; preds = %27, %154
%93 = phi i64 [ 0, %27 ], [ %155, %154 ]
%94 = phi double [ 0.000000e+00, %27 ], [ %129, %154 ]
%95 = phi i32 [ %3, %27 ], [ %149, %154 ]
%96 = getelementptr inbounds i32, i32* %5, i64 %93
store i32 %95, i32* %96
%97 = tail call i64 (...) @rand()
%98 = sitofp i64 %97 to double
%99 = load i64, i64* @RAND_MAX
%100 = sitofp i64 %99 to double
%101 = fdiv double %98, %100
%102 = tail call i64 (...) @rand()
%103 = sitofp i64 %102 to double
%104 = load i64, i64* @RAND_MAX
%105 = sitofp i64 %104 to double
%106 = fdiv double %103, %105
%107 = load i32, i32* %96
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds double, double* %12, i64 %108
%110 = load double, double* %109
%111 = fdiv double 1.000000e+00, %110
%112 = fdiv double 1.000000e+00, %101
%113 = fptosi double %112 to i32
%114 = tail call i32 @log(i32 %113)
%115 = sitofp i32 %114 to double
%116 = fmul double %111, %115
%117 = getelementptr inbounds double, double* %6, i64 %93
store double %116, double* %117
%118 = icmp eq i64 %93, 0
br i1 %118, label %119, label %127
119: ; preds = %92
%120 = tail call i64 (...) @rand()
%121 = sitofp i64 %120 to double
%122 = load i64, i64* @RAND_MAX
%123 = sitofp i64 %122 to double
%124 = fdiv double %121, %123
%125 = load double, double* %117
%126 = fmul double %125, %124
store double %126, double* %117
br label %127
127: ; preds = %119, %92
%128 = phi double [ %126, %119 ], [ %116, %92 ]
%129 = fadd double %94, %128
br i1 %13, label %130, label %148
130: ; preds = %127
%131 = load i32, i32* %96
%132 = sext i32 %131 to i64
%133 = mul nsw i64 %132, %9
%134 = getelementptr inbounds double, double* %11, i64 %133
%135 = getelementptr inbounds double, double* %12, i64 %132
%136 = load double, double* %135
%137 = fmul double %106, %136
br label %138
138: ; preds = %138, %130
%139 = phi i64 [ %143, %138 ], [ 0, %130 ]
%140 = getelementptr inbounds double, double* %134, i64 %139
%141 = load double, double* %140
%142 = fcmp ule double %141, %137
%143 = add nuw nsw i64 %139, 1
%144 = icmp slt i64 %143, %28
%145 = select i1 %142, i1 %144, i1 false
br i1 %145, label %138, label %146
146: ; preds = %138
%147 = trunc i64 %139 to i32
br label %148
148: ; preds = %146, %127
%149 = phi i32 [ %95, %127 ], [ %147, %146 ]
%150 = fcmp ogt double %129, %1
br i1 %150, label %151, label %154
151: ; preds = %148
%152 = trunc i64 %93 to i32
%153 = add nuw nsw i32 %152, 1
store i32 %153, i32* %7
br label %157
154: ; preds = %148
%155 = add nuw nsw i64 %93, 1
%156 = icmp eq i64 %155, %29
br i1 %156, label %157, label %92
157: ; preds = %154, %25, %151
ret void
}