unsigned int rand32(unsigned int seed) {
  static unsigned int last, ran = 0x12345678;
  static unsigned int pvs[2843];
  static int pvs_inited = 0;
  int i;
  if (seed != 0) {
    pvs_inited = 0;
    ran = seed;
    ;
  }
  if (pvs_inited == 0) {
    for (i = 0; i < 2843; i++)
      pvs[i] = ran =
          (((ran)&0x80000000) ? (((ran) << 1) ^ 0xa398655d) : ((ran) << 1));
    last = ran;
    pvs_inited = 1;
  }
  i = last % 2843;
  last = pvs[i];
  pvs[i] = ran =
      (((ran)&0x80000000) ? (((ran) << 1) ^ 0xa398655d) : ((ran) << 1));
  return last - 1;
}


x86 assembly (clang, -O0):
<rand32>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     1124 <rand32+0x24>
movl   $0x0,0x5ba1(%rip)
mov    -0x4(%rbp),%eax
mov    %eax,0x2efc(%rip)
cmpl   $0x0,0x5b91(%rip)
jne    11b6 <rand32+0xb6>
movl   $0x0,-0x8(%rbp)
cmpl   $0xb1b,-0x8(%rbp)
jge    11a0 <rand32+0xa0>
mov    0x2ed5(%rip),%eax
and    $0x80000000,%eax
cmp    $0x0,%eax
je     116f <rand32+0x6f>
mov    0x2ec1(%rip),%eax
shl    $0x1,%eax
xor    $0xa398655d,%eax
mov    %eax,-0xc(%rbp)
jmp    117b <rand32+0x7b>
mov    0x2eab(%rip),%eax
shl    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%edx
mov    %edx,0x2e9c(%rip)
movslq -0x8(%rbp),%rcx
lea    0x2ec1(%rip),%rax
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1138 <rand32+0x38>
mov    0x2e7a(%rip),%eax
mov    %eax,0x2e94(%rip)
movl   $0x1,0x5b06(%rip)
mov    0x2e84(%rip),%eax
mov    $0xb1b,%ecx
xor    %edx,%edx
div    %ecx
mov    %edx,-0x8(%rbp)
movslq -0x8(%rbp),%rcx
lea    0x2e7d(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,0x2e64(%rip)
mov    0x2e3e(%rip),%eax
and    $0x80000000,%eax
cmp    $0x0,%eax
je     1206 <rand32+0x106>
mov    0x2e2a(%rip),%eax
shl    $0x1,%eax
xor    $0xa398655d,%eax
mov    %eax,-0x10(%rbp)
jmp    1212 <rand32+0x112>
mov    0x2e14(%rip),%eax
shl    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%edx
mov    %edx,0x2e05(%rip)
movslq -0x8(%rbp),%rcx
lea    0x2e2a(%rip),%rax
mov    %edx,(%rax,%rcx,4)
mov    0x2e11(%rip),%eax
sub    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<rand32>:
test   %edi,%edi
jne    1121 <rand32+0x21>
cmpb   $0x1,0x5bb1(%rip)
jne    111b <rand32+0x1b>
mov    0x2f2d(%rip),%edx
mov    0x2f07(%rip),%ecx
jmp    116e <rand32+0x6e>
mov    0x2eff(%rip),%edi
mov    $0x1,%eax
lea    0x2f23(%rip),%rdx
nopl   (%rax)
lea    (%rdi,%rdi,1),%esi
mov    %esi,%ecx
xor    $0xa398655d,%ecx
test   %edi,%edi
cmovns %esi,%ecx
mov    %ecx,-0x4(%rdx,%rax,4)
cmp    $0xb1b,%rax
je     1165 <rand32+0x65>
lea    (%rcx,%rcx,1),%esi
mov    %esi,%edi
xor    $0xa398655d,%edi
test   %ecx,%ecx
cmovns %esi,%edi
mov    %edi,(%rdx,%rax,4)
add    $0x2,%rax
jmp    1130 <rand32+0x30>
movb   $0x1,0x5b50(%rip)
mov    %ecx,%edx
mov    %edx,%eax
mov    $0xb869e4cf,%esi
imul   %rax,%rsi
shr    $0x2b,%rsi
imul   $0xb1b,%esi,%eax
sub    %eax,%edx
lea    0x2ec4(%rip),%r8
mov    (%r8,%rdx,4),%eax
lea    (%rcx,%rcx,1),%esi
mov    %esi,%edi
xor    $0xa398655d,%edi
test   %ecx,%ecx
cmovns %esi,%edi
mov    %eax,0x2e9a(%rip)
mov    %edi,0x2e74(%rip)
mov    %edi,(%r8,%rdx,4)
add    $0xffffffff,%eax
ret

LLVM IR (-O0):
@rand32.last = internal global i32 0
@rand32.ran = internal global i32 305419896
@rand32.pvs = internal global [2843 x i32] zeroinitializer
@rand32.pvs_inited = internal global i32 0
define i32 @rand32(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
%4 = load i32, i32* %2
%5 = icmp ne i32 %4, 0
br i1 %5, label %6, label %8
6: ; preds = %1
store i32 0, i32* @rand32.pvs_inited
%7 = load i32, i32* %2
store i32 %7, i32* @rand32.ran
br label %8
8: ; preds = %6, %1
%9 = load i32, i32* @rand32.pvs_inited
%10 = icmp eq i32 %9, 0
br i1 %10, label %11, label %36
11: ; preds = %8
store i32 0, i32* %3
br label %12
12: ; preds = %31, %11
%13 = load i32, i32* %3
%14 = icmp slt i32 %13, 2843
br i1 %14, label %15, label %34
15: ; preds = %12
%16 = load i32, i32* @rand32.ran
%17 = and i32 %16, -2147483648
%18 = icmp ne i32 %17, 0
br i1 %18, label %19, label %23
19: ; preds = %15
%20 = load i32, i32* @rand32.ran
%21 = shl i32 %20, 1
%22 = xor i32 %21, -1550293667
br label %26
23: ; preds = %15
%24 = load i32, i32* @rand32.ran
%25 = shl i32 %24, 1
br label %26
26: ; preds = %23, %19
%27 = phi i32 [ %22, %19 ], [ %25, %23 ]
store i32 %27, i32* @rand32.ran
%28 = load i32, i32* %3
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %29
store i32 %27, i32* %30
br label %31
31: ; preds = %26
%32 = load i32, i32* %3
%33 = add nsw i32 %32, 1
store i32 %33, i32* %3
br label %12
34: ; preds = %12
%35 = load i32, i32* @rand32.ran
store i32 %35, i32* @rand32.last
store i32 1, i32* @rand32.pvs_inited
br label %36
36: ; preds = %34, %8
%37 = load i32, i32* @rand32.last
%38 = urem i32 %37, 2843
store i32 %38, i32* %3
%39 = load i32, i32* %3
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %40
%42 = load i32, i32* %41
store i32 %42, i32* @rand32.last
%43 = load i32, i32* @rand32.ran
%44 = and i32 %43, -2147483648
%45 = icmp ne i32 %44, 0
br i1 %45, label %46, label %50
46: ; preds = %36
%47 = load i32, i32* @rand32.ran
%48 = shl i32 %47, 1
%49 = xor i32 %48, -1550293667
br label %53
50: ; preds = %36
%51 = load i32, i32* @rand32.ran
%52 = shl i32 %51, 1
br label %53
53: ; preds = %50, %46
%54 = phi i32 [ %49, %46 ], [ %52, %50 ]
store i32 %54, i32* @rand32.ran
%55 = load i32, i32* %3
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %56
store i32 %54, i32* %57
%58 = load i32, i32* @rand32.last
%59 = sub i32 %58, 1
ret i32 %59
}

LLVM IR (-O2):
@rand32.last = internal unnamed_addr global i32 0
@rand32.ran = internal unnamed_addr global i32 305419896
@rand32.pvs = internal unnamed_addr global [2843 x i32] zeroinitializer
@rand32.pvs_inited = internal unnamed_addr global i1 false
define i32 @rand32(i32 %0) {
%2 = icmp eq i32 %0, 0
br i1 %2, label %3, label %10
3: ; preds = %1
%4 = load i1, i1* @rand32.pvs_inited
br i1 %4, label %5, label %8
5: ; preds = %3
%6 = load i32, i32* @rand32.last
%7 = load i32, i32* @rand32.ran
br label %30
8: ; preds = %3
%9 = load i32, i32* @rand32.ran
br label %10
10: ; preds = %1, %8
%11 = phi i32 [ %9, %8 ], [ %0, %1 ]
br label %12
12: ; preds = %22, %10
%13 = phi i64 [ 0, %10 ], [ %28, %22 ]
%14 = phi i32 [ %11, %10 ], [ %26, %22 ]
%15 = icmp sgt i32 %14, -1
%16 = shl i32 %14, 1
%17 = xor i32 %16, -1550293667
%18 = select i1 %15, i32 %16, i32 %17
%19 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %13
store i32 %18, i32* %19
%20 = or i64 %13, 1
%21 = icmp eq i64 %20, 2843
br i1 %21, label %29, label %22
22: ; preds = %12
%23 = icmp sgt i32 %18, -1
%24 = shl i32 %18, 1
%25 = xor i32 %24, -1550293667
%26 = select i1 %23, i32 %24, i32 %25
%27 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %20
store i32 %26, i32* %27
%28 = add nuw nsw i64 %13, 2
br label %12
29: ; preds = %12
store i1 true, i1* @rand32.pvs_inited
br label %30
30: ; preds = %5, %29
%31 = phi i32 [ %7, %5 ], [ %18, %29 ]
%32 = phi i32 [ %6, %5 ], [ %18, %29 ]
%33 = urem i32 %32, 2843
%34 = zext i32 %33 to i64
%35 = getelementptr inbounds [2843 x i32], [2843 x i32]* @rand32.pvs, i64 0, i64 %34
%36 = load i32, i32* %35
store i32 %36, i32* @rand32.last
%37 = icmp sgt i32 %31, -1
%38 = shl i32 %31, 1
%39 = xor i32 %38, -1550293667
%40 = select i1 %37, i32 %38, i32 %39
store i32 %40, i32* @rand32.ran
store i32 %40, i32* %35
%41 = add i32 %36, -1
ret i32 %41
}