unsigned int lfsr(void) {
  static unsigned int a = 12345, b = 23456, c = 34567, d = 45678, e = 56789;
  unsigned int x = 0;
  x = ((a << 5) ^ a) >> 7;
  a = ((a & 97587842537U) << 8) ^ x;
  x = ((b << 9) ^ b) >> 11;
  b = ((b & 17436597364U) << 12) ^ x;
  x = ((c << 13) ^ c) >> 15;
  c = ((c & 78156613458U) << 16) ^ x;
  x = ((d << 17) ^ d) >> 19;
  d = ((d & 23455357684U) << 20) ^ x;
  x = ((e << 21) ^ e) >> 23;
  e = ((e & 45634657864U) << 24) ^ x;
  return (a ^ b ^ c ^ d ^ e);
}


x86 assembly (clang, -O0):
<lfsr>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
mov    0x2f0f(%rip),%eax
shl    $0x5,%eax
xor    0x2f06(%rip),%eax
shr    $0x7,%eax
mov    %eax,-0x4(%rbp)
mov    0x2efa(%rip),%eax
movabs $0x16b8b04de9,%rcx
and    %rcx,%rax
shl    $0x8,%rax
mov    -0x4(%rbp),%ecx
xor    %rcx,%rax
mov    %eax,0x2edd(%rip)
mov    0x2edb(%rip),%eax
shl    $0x9,%eax
xor    0x2ed2(%rip),%eax
shr    $0xb,%eax
mov    %eax,-0x4(%rbp)
mov    0x2ec6(%rip),%eax
movabs $0x40f4d5c74,%rcx
and    %rcx,%rax
shl    $0xc,%rax
mov    -0x4(%rbp),%ecx
xor    %rcx,%rax
mov    %eax,0x2ea9(%rip)
mov    0x2ea7(%rip),%eax
shl    $0xd,%eax
xor    0x2e9e(%rip),%eax
shr    $0xf,%eax
mov    %eax,-0x4(%rbp)
mov    0x2e92(%rip),%eax
movabs $0x12327f4752,%rcx
and    %rcx,%rax
shl    $0x10,%rax
mov    -0x4(%rbp),%ecx
xor    %rcx,%rax
mov    %eax,0x2e75(%rip)
mov    0x2e73(%rip),%eax
shl    $0x11,%eax
xor    0x2e6a(%rip),%eax
shr    $0x13,%eax
mov    %eax,-0x4(%rbp)
mov    0x2e5e(%rip),%eax
movabs $0x5760c5af4,%rcx
and    %rcx,%rax
shl    $0x14,%rax
mov    -0x4(%rbp),%ecx
xor    %rcx,%rax
mov    %eax,0x2e41(%rip)
mov    0x2e3f(%rip),%eax
shl    $0x15,%eax
xor    0x2e36(%rip),%eax
shr    $0x17,%eax
mov    %eax,-0x4(%rbp)
mov    0x2e2a(%rip),%eax
movabs $0xaa0099e48,%rcx
and    %rcx,%rax
shl    $0x18,%rax
mov    -0x4(%rbp),%ecx
xor    %rcx,%rax
mov    %eax,0x2e0d(%rip)
mov    0x2df7(%rip),%eax
xor    0x2df5(%rip),%eax
xor    0x2df3(%rip),%eax
xor    0x2df1(%rip),%eax
xor    0x2def(%rip),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<lfsr>:
mov    0x2f19(%rip),%r8d
mov    %r8d,%eax
shl    $0x5,%eax
xor    %r8d,%eax
shr    $0x7,%eax
shl    $0x8,%r8d
and    $0xb04de900,%r8d
xor    %eax,%r8d
mov    %r8d,0x2ef8(%rip)
mov    0x2ef6(%rip),%edx
mov    %edx,%eax
shl    $0x9,%eax
xor    %edx,%eax
shr    $0xb,%eax
shl    $0xc,%edx
and    $0xd5c74000,%edx
xor    %eax,%edx
mov    %edx,0x2edb(%rip)
mov    0x2ed9(%rip),%esi
mov    %esi,%eax
shl    $0xd,%eax
xor    %esi,%eax
shr    $0xf,%eax
shl    $0x10,%esi
and    $0x47520000,%esi
or     %eax,%esi
mov    %esi,0x2ebe(%rip)
mov    0x2ebc(%rip),%eax
mov    %eax,%edi
shl    $0x11,%edi
xor    %eax,%edi
shr    $0x13,%edi
shl    $0x14,%eax
and    $0xaf400000,%eax
or     %edi,%eax
mov    %eax,0x2ea2(%rip)
mov    0x2ea0(%rip),%edi
mov    %edi,%ecx
shl    $0x15,%ecx
xor    %edi,%ecx
shr    $0x17,%ecx
and    $0x48,%edi
shl    $0x18,%edi
or     %ecx,%edi
mov    %edi,0x2e88(%rip)
xor    %r8d,%edx
xor    %esi,%eax
xor    %edx,%eax
xor    %edi,%eax
ret

LLVM IR (-O0):
@lfsr.a = internal global i32 12345
@lfsr.b = internal global i32 23456
@lfsr.c = internal global i32 34567
@lfsr.d = internal global i32 45678
@lfsr.e = internal global i32 56789
define i32 @lfsr() {
%1 = alloca i32
store i32 0, i32* %1
%2 = load i32, i32* @lfsr.a
%3 = shl i32 %2, 5
%4 = load i32, i32* @lfsr.a
%5 = xor i32 %3, %4
%6 = lshr i32 %5, 7
store i32 %6, i32* %1
%7 = load i32, i32* @lfsr.a
%8 = zext i32 %7 to i64
%9 = and i64 %8, 97587842537
%10 = shl i64 %9, 8
%11 = load i32, i32* %1
%12 = zext i32 %11 to i64
%13 = xor i64 %10, %12
%14 = trunc i64 %13 to i32
store i32 %14, i32* @lfsr.a
%15 = load i32, i32* @lfsr.b
%16 = shl i32 %15, 9
%17 = load i32, i32* @lfsr.b
%18 = xor i32 %16, %17
%19 = lshr i32 %18, 11
store i32 %19, i32* %1
%20 = load i32, i32* @lfsr.b
%21 = zext i32 %20 to i64
%22 = and i64 %21, 17436597364
%23 = shl i64 %22, 12
%24 = load i32, i32* %1
%25 = zext i32 %24 to i64
%26 = xor i64 %23, %25
%27 = trunc i64 %26 to i32
store i32 %27, i32* @lfsr.b
%28 = load i32, i32* @lfsr.c
%29 = shl i32 %28, 13
%30 = load i32, i32* @lfsr.c
%31 = xor i32 %29, %30
%32 = lshr i32 %31, 15
store i32 %32, i32* %1
%33 = load i32, i32* @lfsr.c
%34 = zext i32 %33 to i64
%35 = and i64 %34, 78156613458
%36 = shl i64 %35, 16
%37 = load i32, i32* %1
%38 = zext i32 %37 to i64
%39 = xor i64 %36, %38
%40 = trunc i64 %39 to i32
store i32 %40, i32* @lfsr.c
%41 = load i32, i32* @lfsr.d
%42 = shl i32 %41, 17
%43 = load i32, i32* @lfsr.d
%44 = xor i32 %42, %43
%45 = lshr i32 %44, 19
store i32 %45, i32* %1
%46 = load i32, i32* @lfsr.d
%47 = zext i32 %46 to i64
%48 = and i64 %47, 23455357684
%49 = shl i64 %48, 20
%50 = load i32, i32* %1
%51 = zext i32 %50 to i64
%52 = xor i64 %49, %51
%53 = trunc i64 %52 to i32
store i32 %53, i32* @lfsr.d
%54 = load i32, i32* @lfsr.e
%55 = shl i32 %54, 21
%56 = load i32, i32* @lfsr.e
%57 = xor i32 %55, %56
%58 = lshr i32 %57, 23
store i32 %58, i32* %1
%59 = load i32, i32* @lfsr.e
%60 = zext i32 %59 to i64
%61 = and i64 %60, 45634657864
%62 = shl i64 %61, 24
%63 = load i32, i32* %1
%64 = zext i32 %63 to i64
%65 = xor i64 %62, %64
%66 = trunc i64 %65 to i32
store i32 %66, i32* @lfsr.e
%67 = load i32, i32* @lfsr.a
%68 = load i32, i32* @lfsr.b
%69 = xor i32 %67, %68
%70 = load i32, i32* @lfsr.c
%71 = xor i32 %69, %70
%72 = load i32, i32* @lfsr.d
%73 = xor i32 %71, %72
%74 = load i32, i32* @lfsr.e
%75 = xor i32 %73, %74
ret i32 %75
}

LLVM IR (-O2):
@lfsr.a = internal unnamed_addr global i32 12345
@lfsr.b = internal unnamed_addr global i32 23456
@lfsr.c = internal unnamed_addr global i32 34567
@lfsr.d = internal unnamed_addr global i32 45678
@lfsr.e = internal unnamed_addr global i32 56789
define i32 @lfsr() {
%1 = load i32, i32* @lfsr.a
%2 = shl i32 %1, 5
%3 = xor i32 %2, %1
%4 = lshr i32 %3, 7
%5 = shl i32 %1, 8
%6 = and i32 %5, -1337071360
%7 = xor i32 %4, %6
store i32 %7, i32* @lfsr.a
%8 = load i32, i32* @lfsr.b
%9 = shl i32 %8, 9
%10 = xor i32 %9, %8
%11 = lshr i32 %10, 11
%12 = shl i32 %8, 12
%13 = and i32 %12, -708362240
%14 = xor i32 %11, %13
store i32 %14, i32* @lfsr.b
%15 = load i32, i32* @lfsr.c
%16 = shl i32 %15, 13
%17 = xor i32 %16, %15
%18 = lshr i32 %17, 15
%19 = shl i32 %15, 16
%20 = and i32 %19, 1196556288
%21 = or i32 %18, %20
store i32 %21, i32* @lfsr.c
%22 = load i32, i32* @lfsr.d
%23 = shl i32 %22, 17
%24 = xor i32 %23, %22
%25 = lshr i32 %24, 19
%26 = shl i32 %22, 20
%27 = and i32 %26, -1354760192
%28 = or i32 %25, %27
store i32 %28, i32* @lfsr.d
%29 = load i32, i32* @lfsr.e
%30 = shl i32 %29, 21
%31 = xor i32 %30, %29
%32 = lshr i32 %31, 23
%33 = shl i32 %29, 24
%34 = and i32 %33, 1207959552
%35 = or i32 %32, %34
store i32 %35, i32* @lfsr.e
%36 = xor i32 %14, %7
%37 = xor i32 %36, %21
%38 = xor i32 %37, %28
%39 = xor i32 %38, %35
ret i32 %39
}