double ran3(idum)
int *idum;
{
  static int inext, inextp;
  static long ma[56];
  static int iff = 0;
  long mj, mk;
  int i, ii, k;
  if (*idum < 0 || iff == 0) {
    iff = 1;
    mj = 161803398 - (*idum < 0 ? -*idum : *idum);
    mj %= 1000000000;
    ma[55] = mj;
    mk = 1;
    for (i = 1; i <= 54; i++) {
      ii = (21 * i) % 55;
      ma[ii] = mk;
      mk = mj - mk;
      if (mk < 0)
        mk += 1000000000;
      mj = ma[ii];
    }
    for (k = 1; k <= 4; k++)
      for (i = 1; i <= 55; i++) {
        ma[i] -= ma[1 + (i + 30) % 55];
        if (ma[i] < 0)
          ma[i] += 1000000000;
      }
    inext = 0;
    inextp = 31;
    *idum = 1;
  }
  if (++inext == 56)
    inext = 1;
  if (++inextp == 56)
    inextp = 1;
  mj = ma[inext] - ma[inextp];
  if (mj < 0)
    mj += 1000000000;
  ma[inext] = mj;
  return mj * (1.0 / 1000000000);
}


x86 assembly (clang, -O0):
<ran3>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
cmpl   $0x0,(%rax)
jl     1122 <ran3+0x22>
cmpl   $0x0,0x30e4(%rip)
jne    12d9 <ran3+0x1d9>
movl   $0x1,0x30d4(%rip)
mov    -0x8(%rbp),%rax
cmpl   $0x0,(%rax)
jge    1149 <ran3+0x49>
mov    -0x8(%rbp),%rcx
xor    %eax,%eax
sub    (%rcx),%eax
mov    %eax,-0x28(%rbp)
jmp    1152 <ran3+0x52>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    $0x9a4ec86,%eax
sub    %ecx,%eax
cltq
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    $0x3b9aca00,%ecx
cqto
idiv   %rcx
mov    %rdx,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,0x3079(%rip)
movq   $0x1,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
cmpl   $0x36,-0x1c(%rbp)
jg     1200 <ran3+0x100>
imul   $0x15,-0x1c(%rbp),%eax
mov    $0x37,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
mov    -0x18(%rbp),%rdx
movslq -0x20(%rbp),%rcx
lea    0x2e8a(%rip),%rax
mov    %rdx,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
sub    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jge    11df <ran3+0xdf>
mov    -0x18(%rbp),%rax
add    $0x3b9aca00,%rax
mov    %rax,-0x18(%rbp)
movslq -0x20(%rbp),%rcx
lea    0x2e56(%rip),%rax
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    118e <ran3+0x8e>
movl   $0x1,-0x24(%rbp)
cmpl   $0x4,-0x24(%rbp)
jg     12bb <ran3+0x1bb>
movl   $0x1,-0x1c(%rbp)
cmpl   $0x37,-0x1c(%rbp)
jg     12a8 <ran3+0x1a8>
mov    -0x1c(%rbp),%eax
add    $0x1e,%eax
mov    $0x37,%ecx
cltd
idiv   %ecx
add    $0x1,%edx
movslq %edx,%rcx
lea    0x2e03(%rip),%rax
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
lea    0x2df4(%rip),%rdx
mov    (%rdx,%rcx,8),%rdx
sub    %rax,%rdx
lea    0x2de6(%rip),%rax
mov    %rdx,(%rax,%rcx,8)
movslq -0x1c(%rbp),%rcx
lea    0x2dd7(%rip),%rax
cmpq   $0x0,(%rax,%rcx,8)
jge    1295 <ran3+0x195>
movslq -0x1c(%rbp),%rcx
lea    0x2dc1(%rip),%rax
mov    (%rax,%rcx,8),%rdx
add    $0x3b9aca00,%rdx
lea    0x2daf(%rip),%rax
mov    %rdx,(%rax,%rcx,8)
jmp    129a <ran3+0x19a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1218 <ran3+0x118>
jmp    12ad <ran3+0x1ad>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1207 <ran3+0x107>
movl   $0x0,0x2d6b(%rip)
movl   $0x1f,0x2d65(%rip)
mov    -0x8(%rbp),%rax
movl   $0x1,(%rax)
mov    0x2d51(%rip),%eax
add    $0x1,%eax
mov    %eax,0x2d48(%rip)
cmp    $0x38,%eax
jne    12fb <ran3+0x1fb>
movl   $0x1,0x2d35(%rip)
mov    0x2d33(%rip),%eax
add    $0x1,%eax
mov    %eax,0x2d2a(%rip)
cmp    $0x38,%eax
jne    131d <ran3+0x21d>
movl   $0x1,0x2d17(%rip)
movslq 0x2d0c(%rip),%rcx
lea    0x2d15(%rip),%rax
mov    (%rax,%rcx,8),%rax
movslq 0x2cfe(%rip),%rdx
lea    0x2d03(%rip),%rcx
sub    (%rcx,%rdx,8),%rax
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jge    135e <ran3+0x25e>
mov    -0x10(%rbp),%rax
add    $0x3b9aca00,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdx
movslq 0x2cc7(%rip),%rcx
lea    0x2cd0(%rip),%rax
mov    %rdx,(%rax,%rcx,8)
cvtsi2sdq -0x10(%rbp),%xmm0
movsd  0xc7e(%rip),%xmm1
mulsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ran3>:
mov    (%rdi),%eax
test   %eax,%eax
js     1140 <ran3+0x40>
testb  $0x1,0x30f3(%rip)
je     1140 <ran3+0x40>
mov    0x2f1b(%rip),%ecx
mov    0x2f19(%rip),%eax
add    $0x1,%ecx
add    $0x1,%eax
cmp    $0x38,%ecx
mov    $0x1,%edx
cmove  %edx,%ecx
mov    %ecx,0x2efe(%rip)
cmp    $0x38,%eax
cmove  %edx,%eax
movslq %ecx,%rcx
jmp    134e <ran3+0x24e>
mov    %eax,%ecx
neg    %ecx
cmovns %eax,%ecx
movb   $0x1,0x30b2(%rip)
add    $0x9a4ec86,%ecx
movslq %ecx,%rax
imul   $0x44b82fa1,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x3c,%rcx
add    %edx,%ecx
imul   $0x3b9aca00,%ecx,%ecx
sub    %ecx,%eax
movslq %eax,%rsi
mov    %rsi,0x307b(%rip)
mov    $0x1,%r9d
mov    $0x36,%r8d
lea    0x2f58(%rip),%r11
mov    $0x15,%ecx
movabs $0x29e4129e4129e413,%r10
12 e4 29
nop
mov    %rcx,%rax
mul    %r10
mov    %rcx,%rax
sub    %rdx,%rax
shr    %rax
add    %rdx,%rax
shr    $0x5,%rax
imul   $0xfffffffffffffe48,%rax,%rax
sub    %r9,%rsi
lea    0x3b9aca00(%rsi),%rdx
test   %rsi,%rsi
cmovns %rsi,%rdx
mov    %r9,(%r11,%rax,1)
add    $0xa8,%r11
add    $0x15,%rcx
mov    %r9,%rsi
mov    %rdx,%r9
add    $0xffffffff,%r8d
jne    11a0 <ran3+0xa0>
mov    $0x1,%ecx
mov    $0x20,%r9b
mov    $0x1f,%sil
lea    0x2e45(%rip),%r8
nopl   0x0(%rax,%rax,1)
movzbl %sil,%esi
imul   $0x95,%esi,%eax
shr    $0xd,%eax
imul   $0x37,%eax,%eax
mov    %r9d,%edx
sub    %al,%dl
movzbl %dl,%eax
mov    (%r8,%rcx,8),%rdx
sub    (%r8,%rax,8),%rdx
lea    0x3b9aca00(%rdx),%rax
test   %rdx,%rdx
cmovns %rdx,%rax
mov    %rax,(%r8,%rcx,8)
add    $0x1,%rcx
add    $0x1,%r9b
add    $0x1,%sil
cmp    $0x38,%rcx
jne    1200 <ran3+0x100>
mov    $0x1,%ecx
mov    $0x20,%r9b
mov    $0x1f,%sil
nop
movzbl %sil,%esi
imul   $0x95,%esi,%eax
shr    $0xd,%eax
imul   $0x37,%eax,%eax
mov    %r9d,%edx
sub    %al,%dl
movzbl %dl,%eax
mov    (%r8,%rcx,8),%rdx
sub    (%r8,%rax,8),%rdx
lea    0x3b9aca00(%rdx),%rax
test   %rdx,%rdx
cmovns %rdx,%rax
mov    %rax,(%r8,%rcx,8)
add    $0x1,%rcx
add    $0x1,%r9b
add    $0x1,%sil
cmp    $0x38,%rcx
jne    1250 <ran3+0x150>
mov    $0x1,%ecx
mov    $0x20,%r9b
mov    $0x1f,%sil
nop
movzbl %sil,%esi
imul   $0x95,%esi,%eax
shr    $0xd,%eax
imul   $0x37,%eax,%eax
mov    %r9d,%edx
sub    %al,%dl
movzbl %dl,%eax
mov    (%r8,%rcx,8),%rdx
sub    (%r8,%rax,8),%rdx
lea    0x3b9aca00(%rdx),%rax
test   %rdx,%rdx
cmovns %rdx,%rax
mov    %rax,(%r8,%rcx,8)
add    $0x1,%rcx
add    $0x1,%r9b
add    $0x1,%sil
cmp    $0x38,%rcx
jne    12a0 <ran3+0x1a0>
mov    $0x1,%ecx
mov    $0x20,%r9b
mov    $0x1f,%sil
nop
movzbl %sil,%esi
imul   $0x95,%esi,%eax
shr    $0xd,%eax
imul   $0x37,%eax,%eax
mov    %r9d,%edx
sub    %al,%dl
movzbl %dl,%eax
mov    (%r8,%rcx,8),%rdx
sub    (%r8,%rax,8),%rdx
lea    0x3b9aca00(%rdx),%rax
test   %rdx,%rdx
cmovns %rdx,%rax
mov    %rax,(%r8,%rcx,8)
add    $0x1,%rcx
add    $0x1,%r9b
add    $0x1,%sil
cmp    $0x38,%rcx
jne    12f0 <ran3+0x1f0>
movl   $0x1,(%rdi)
movl   $0x1,0x2cec(%rip)
mov    $0x20,%eax
mov    $0x1,%ecx
mov    %eax,0x2ce0(%rip)
lea    0x2ce5(%rip),%rdx
mov    (%rdx,%rcx,8),%rsi
cltq
sub    (%rdx,%rax,8),%rsi
lea    0x3b9aca00(%rsi),%rax
test   %rsi,%rsi
cmovns %rsi,%rax
mov    %rax,(%rdx,%rcx,8)
cvtsi2sd %rax,%xmm0
mulsd  0xc7c(%rip),%xmm0
ret

LLVM IR (-O0):
@ran3.inext = internal global i32 0
@ran3.inextp = internal global i32 0
@ran3.ma = internal global [56 x i64] zeroinitializer
@ran3.iff = internal global i32 0
define double @ran3(i32* %0) {
%2 = alloca i32*
%3 = alloca i64
%4 = alloca i64
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i32* %0, i32** %2
%8 = load i32*, i32** %2
%9 = load i32, i32* %8
%10 = icmp slt i32 %9, 0
br i1 %10, label %14, label %11
11: ; preds = %1
%12 = load i32, i32* @ran3.iff
%13 = icmp eq i32 %12, 0
br i1 %13, label %14, label %101
14: ; preds = %11, %1
store i32 1, i32* @ran3.iff
%15 = load i32*, i32** %2
%16 = load i32, i32* %15
%17 = icmp slt i32 %16, 0
br i1 %17, label %18, label %22
18: ; preds = %14
%19 = load i32*, i32** %2
%20 = load i32, i32* %19
%21 = sub nsw i32 0, %20
br label %25
22: ; preds = %14
%23 = load i32*, i32** %2
%24 = load i32, i32* %23
br label %25
25: ; preds = %22, %18
%26 = phi i32 [ %21, %18 ], [ %24, %22 ]
%27 = sub nsw i32 161803398, %26
%28 = sext i32 %27 to i64
store i64 %28, i64* %3
%29 = load i64, i64* %3
%30 = srem i64 %29, 1000000000
store i64 %30, i64* %3
%31 = load i64, i64* %3
store i64 %31, i64* getelementptr inbounds ([56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 55)
store i64 1, i64* %4
store i32 1, i32* %5
br label %32
32: ; preds = %56, %25
%33 = load i32, i32* %5
%34 = icmp sle i32 %33, 54
br i1 %34, label %35, label %59
35: ; preds = %32
%36 = load i32, i32* %5
%37 = mul nsw i32 21, %36
%38 = srem i32 %37, 55
store i32 %38, i32* %6
%39 = load i64, i64* %4
%40 = load i32, i32* %6
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %41
store i64 %39, i64* %42
%43 = load i64, i64* %3
%44 = load i64, i64* %4
%45 = sub nsw i64 %43, %44
store i64 %45, i64* %4
%46 = load i64, i64* %4
%47 = icmp slt i64 %46, 0
br i1 %47, label %48, label %51
48: ; preds = %35
%49 = load i64, i64* %4
%50 = add nsw i64 %49, 1000000000
store i64 %50, i64* %4
br label %51
51: ; preds = %48, %35
%52 = load i32, i32* %6
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %53
%55 = load i64, i64* %54
store i64 %55, i64* %3
br label %56
56: ; preds = %51
%57 = load i32, i32* %5
%58 = add nsw i32 %57, 1
store i32 %58, i32* %5
br label %32
59: ; preds = %32
store i32 1, i32* %7
br label %60
60: ; preds = %96, %59
%61 = load i32, i32* %7
%62 = icmp sle i32 %61, 4
br i1 %62, label %63, label %99
63: ; preds = %60
store i32 1, i32* %5
br label %64
64: ; preds = %92, %63
%65 = load i32, i32* %5
%66 = icmp sle i32 %65, 55
br i1 %66, label %67, label %95
67: ; preds = %64
%68 = load i32, i32* %5
%69 = add nsw i32 %68, 30
%70 = srem i32 %69, 55
%71 = add nsw i32 1, %70
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %72
%74 = load i64, i64* %73
%75 = load i32, i32* %5
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %76
%78 = load i64, i64* %77
%79 = sub nsw i64 %78, %74
store i64 %79, i64* %77
%80 = load i32, i32* %5
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %81
%83 = load i64, i64* %82
%84 = icmp slt i64 %83, 0
br i1 %84, label %85, label %91
85: ; preds = %67
%86 = load i32, i32* %5
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %87
%89 = load i64, i64* %88
%90 = add nsw i64 %89, 1000000000
store i64 %90, i64* %88
br label %91
91: ; preds = %85, %67
br label %92
92: ; preds = %91
%93 = load i32, i32* %5
%94 = add nsw i32 %93, 1
store i32 %94, i32* %5
br label %64
95: ; preds = %64
br label %96
96: ; preds = %95
%97 = load i32, i32* %7
%98 = add nsw i32 %97, 1
store i32 %98, i32* %7
br label %60
99: ; preds = %60
store i32 0, i32* @ran3.inext
store i32 31, i32* @ran3.inextp
%100 = load i32*, i32** %2
store i32 1, i32* %100
br label %101
101: ; preds = %99, %11
%102 = load i32, i32* @ran3.inext
%103 = add nsw i32 %102, 1
store i32 %103, i32* @ran3.inext
%104 = icmp eq i32 %103, 56
br i1 %104, label %105, label %106
105: ; preds = %101
store i32 1, i32* @ran3.inext
br label %106
106: ; preds = %105, %101
%107 = load i32, i32* @ran3.inextp
%108 = add nsw i32 %107, 1
store i32 %108, i32* @ran3.inextp
%109 = icmp eq i32 %108, 56
br i1 %109, label %110, label %111
110: ; preds = %106
store i32 1, i32* @ran3.inextp
br label %111
111: ; preds = %110, %106
%112 = load i32, i32* @ran3.inext
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %113
%115 = load i64, i64* %114
%116 = load i32, i32* @ran3.inextp
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %117
%119 = load i64, i64* %118
%120 = sub nsw i64 %115, %119
store i64 %120, i64* %3
%121 = load i64, i64* %3
%122 = icmp slt i64 %121, 0
br i1 %122, label %123, label %126
123: ; preds = %111
%124 = load i64, i64* %3
%125 = add nsw i64 %124, 1000000000
store i64 %125, i64* %3
br label %126
126: ; preds = %123, %111
%127 = load i64, i64* %3
%128 = load i32, i32* @ran3.inext
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %129
store i64 %127, i64* %130
%131 = load i64, i64* %3
%132 = sitofp i64 %131 to double
%133 = fmul double %132, 1.000000e-09
ret double %133
}

LLVM IR (-O2):
@ran3.inext = internal unnamed_addr global i32 0
@ran3.inextp = internal unnamed_addr global i32 0
@ran3.ma = internal unnamed_addr global [56 x i64] zeroinitializer
@ran3.iff = internal unnamed_addr global i1 false
define double @ran3(i32* nocapture %0) {
%2 = load i32, i32* %0
%3 = icmp slt i32 %2, 0
%4 = load i1, i1* @ran3.iff
%5 = xor i1 %4, true
%6 = select i1 %3, i1 true, i1 %5
br i1 %6, label %7, label %97
7: ; preds = %1
store i1 true, i1* @ran3.iff
%8 = sub nsw i32 0, %2
%9 = select i1 %3, i32 %2, i32 %8
%10 = add nsw i32 %9, 161803398
%11 = srem i32 %10, 1000000000
%12 = sext i32 %11 to i64
store i64 %12, i64* getelementptr inbounds ([56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 55)
br label %13
13: ; preds = %7, %13
%14 = phi i64 [ %12, %7 ], [ %16, %13 ]
%15 = phi i32 [ 1, %7 ], [ %26, %13 ]
%16 = phi i64 [ 1, %7 ], [ %25, %13 ]
%17 = trunc i32 %15 to i16
%18 = mul i16 %17, 21
%19 = urem i16 %18, 55
%20 = zext i16 %19 to i64
%21 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %20
store i64 %16, i64* %21
%22 = sub nsw i64 %14, %16
%23 = icmp slt i64 %22, 0
%24 = add nsw i64 %22, 1000000000
%25 = select i1 %23, i64 %24, i64 %22
%26 = add nuw nsw i32 %15, 1
%27 = icmp eq i32 %26, 55
br i1 %27, label %28, label %13
28: ; preds = %13, %28
%29 = phi i64 [ %43, %28 ], [ 1, %13 ]
%30 = trunc i64 %29 to i8
%31 = add i8 %30, 30
%32 = urem i8 %31, 55
%33 = add nuw nsw i8 %32, 1
%34 = zext i8 %33 to i64
%35 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %34
%36 = load i64, i64* %35
%37 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %29
%38 = load i64, i64* %37
%39 = sub nsw i64 %38, %36
%40 = icmp slt i64 %39, 0
%41 = add nsw i64 %39, 1000000000
%42 = select i1 %40, i64 %41, i64 %39
store i64 %42, i64* %37
%43 = add nuw nsw i64 %29, 1
%44 = icmp eq i64 %43, 56
br i1 %44, label %45, label %28
45: ; preds = %28, %45
%46 = phi i64 [ %60, %45 ], [ 1, %28 ]
%47 = trunc i64 %46 to i8
%48 = add i8 %47, 30
%49 = urem i8 %48, 55
%50 = add nuw nsw i8 %49, 1
%51 = zext i8 %50 to i64
%52 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %51
%53 = load i64, i64* %52
%54 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %46
%55 = load i64, i64* %54
%56 = sub nsw i64 %55, %53
%57 = icmp slt i64 %56, 0
%58 = add nsw i64 %56, 1000000000
%59 = select i1 %57, i64 %58, i64 %56
store i64 %59, i64* %54
%60 = add nuw nsw i64 %46, 1
%61 = icmp eq i64 %60, 56
br i1 %61, label %62, label %45
62: ; preds = %45, %62
%63 = phi i64 [ %77, %62 ], [ 1, %45 ]
%64 = trunc i64 %63 to i8
%65 = add i8 %64, 30
%66 = urem i8 %65, 55
%67 = add nuw nsw i8 %66, 1
%68 = zext i8 %67 to i64
%69 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %68
%70 = load i64, i64* %69
%71 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %63
%72 = load i64, i64* %71
%73 = sub nsw i64 %72, %70
%74 = icmp slt i64 %73, 0
%75 = add nsw i64 %73, 1000000000
%76 = select i1 %74, i64 %75, i64 %73
store i64 %76, i64* %71
%77 = add nuw nsw i64 %63, 1
%78 = icmp eq i64 %77, 56
br i1 %78, label %79, label %62
79: ; preds = %62, %79
%80 = phi i64 [ %94, %79 ], [ 1, %62 ]
%81 = trunc i64 %80 to i8
%82 = add i8 %81, 30
%83 = urem i8 %82, 55
%84 = add nuw nsw i8 %83, 1
%85 = zext i8 %84 to i64
%86 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %85
%87 = load i64, i64* %86
%88 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %80
%89 = load i64, i64* %88
%90 = sub nsw i64 %89, %87
%91 = icmp slt i64 %90, 0
%92 = add nsw i64 %90, 1000000000
%93 = select i1 %91, i64 %92, i64 %90
store i64 %93, i64* %88
%94 = add nuw nsw i64 %80, 1
%95 = icmp eq i64 %94, 56
br i1 %95, label %96, label %79
96: ; preds = %79
store i32 1, i32* %0
store i32 1, i32* @ran3.inext
br label %107
97: ; preds = %1
%98 = load i32, i32* @ran3.inext
%99 = load i32, i32* @ran3.inextp
%100 = add i32 %98, 1
%101 = add i32 %99, 1
%102 = icmp eq i32 %100, 56
%103 = select i1 %102, i32 1, i32 %100
store i32 %103, i32* @ran3.inext
%104 = icmp eq i32 %101, 56
%105 = select i1 %104, i32 1, i32 %101
%106 = sext i32 %103 to i64
br label %107
107: ; preds = %97, %96
%108 = phi i64 [ 1, %96 ], [ %106, %97 ]
%109 = phi i32 [ 32, %96 ], [ %105, %97 ]
store i32 %109, i32* @ran3.inextp
%110 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %108
%111 = load i64, i64* %110
%112 = sext i32 %109 to i64
%113 = getelementptr inbounds [56 x i64], [56 x i64]* @ran3.ma, i64 0, i64 %112
%114 = load i64, i64* %113
%115 = sub nsw i64 %111, %114
%116 = icmp slt i64 %115, 0
%117 = add nsw i64 %115, 1000000000
%118 = select i1 %116, i64 %117, i64 %115
store i64 %118, i64* %110
%119 = sitofp i64 %118 to double
%120 = fmul double %119, 1.000000e-09
ret double %120
}