#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ COLOR_BLACK;
int /*<<< orphan*/ COLOR_PAIR(int);
int /*<<< orphan*/ COLOR_RED;
int /*<<< orphan*/ FALSE;
int /*<<< orphan*/ LC_ALL;
scalar_t__ RAND_MAX;
int /*<<< orphan*/ TRUE;
int /*<<< orphan*/ attroff(int /*<<< orphan*/);
int /*<<< orphan*/ attron(int /*<<< orphan*/);
int /*<<< orphan*/ clear();
int /*<<< orphan*/ curs_set(int /*<<< orphan*/);
int /*<<< orphan*/ endwin();
int /*<<< orphan*/ fclose(int /*<<< orphan*/ *);
int /*<<< orphan*/ *fopen(char *, char *);
int fscanf(int /*<<< orphan*/ *, char *, int *, int *);
int getch();
int /*<<< orphan*/ getmaxyx(int /*<<< orphan*/, int, int);
int /*<<< orphan*/ init_pair(int, int /*<<< orphan*/, int /*<<< orphan*/);
int /*<<< orphan*/ initscr();
scalar_t__ malloc(int);
int /*<<< orphan*/ mvprintw(int, int, char *, ...);
int /*<<< orphan*/ nodelay(int /*<<< orphan*/, int /*<<< orphan*/);
int /*<<< orphan*/ noecho();
scalar_t__ rand();
int /*<<< orphan*/ refresh();
int /*<<< orphan*/ setlocale(int /*<<< orphan*/, char *);
int /*<<< orphan*/ srand(int /*<<< orphan*/);
int /*<<< orphan*/ start_color();
int /*<<< orphan*/ stdscr;
int /*<<< orphan*/ time(int /*<<< orphan*/);
int /*<<< orphan*/ usleep(int);
int main(int argc, const char *argv[]) {
  int dispMode = 2;
  int ch = 114;
  short border = 0;
  int speed = 10;
  int delay = 1000000 / speed;
  setlocale(LC_ALL, "");
  initscr();
  noecho();
  curs_set(FALSE);
  clear();
  start_color();
  init_pair(1, COLOR_RED, COLOR_BLACK);
  int h, w;
  getmaxyx(stdscr, h, w);
  h -= 1;
  short *map;
  map = (short *)malloc(sizeof(short) * h * w);
  short *next;
  next = (short *)malloc(sizeof(short) * h * w);
  int iter = 0, living = 0;
  short paused = 0;
  while (ch != 113) {
    if (ch == 114) {
      iter = 0;
      for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
          map[i * w + j] = 0;
          next[i * w + j] = 0;
        }
      }
      int initCond = 0;
      if (initCond == 0) {
        float density = 0.2;
        srand(time(0));
        for (int i = 0; i < h; i++) {
          for (int j = 0; j < w; j++) {
            if ((float)rand() / (float)(RAND_MAX) < density)
              map[i * w + j] = 1;
          }
        }
      } else if (initCond == 1) {
        FILE *fp = fopen("initBoard", "r");
        int x, y;
        while (fscanf(fp, "%d %d", &x, &y) == 2) {
          map[y * w + x] = 1;
        }
        fclose(fp);
      }
      nodelay(stdscr, TRUE);
    }
    if (ch)
      ch = 0;
    ch = getch();
    if (!paused && ch == 32)
      paused = 1;
    else if (paused && ch == 32)
      paused = 0;
    if (ch == 44 && speed - 5 > 0)
      speed -= 5;
    if (ch == 46 && speed < 50)
      speed += 5;
    delay = 1000000 / speed;
    if (!paused || (paused && ch == 93)) {
      iter++;
      clear();
      living = 0;
      for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
          if (border && (i == 0 || i == h - 1 || j == 0 || j == w - 1)) {
            map[i * w + j] = 0;
            attroff(COLOR_PAIR(1));
            mvprintw(i, j, "\u2593");
          } else if (map[i * w + j]) {
            if (map[i * w + j]) {
              if (dispMode == 0)
                mvprintw(i, j, "\u2588");
              else if (dispMode == 1)
                mvprintw(i, j, "%d", map[i * w + j]);
              else if (dispMode == 2) {
                if (map[i * w + j] > 1)
                  attron(COLOR_PAIR(1));
                else
                  attroff(COLOR_PAIR(1));
                mvprintw(i, j, "\u2588");
                attroff(COLOR_PAIR(1));
              }
              living++;
            } else
              mvprintw(i, j, " ");
          }
        }
      }
      short alive, n = 0, u, d, l, r;
      for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
          u = (h + i - 1) % h;
          d = (i + 1) % h;
          l = (w + j - 1) % w;
          r = (j + 1) % w;
          n = (map[u * w + j] > 0) + (map[u * w + r] > 0) +
              (map[i * w + r] > 0) + (map[d * w + r] > 0) +
              (map[d * w + j] > 0) + (map[d * w + l] > 0) +
              (map[i * w + l] > 0) + (map[u * w + l] > 0);
          alive = map[i * w + j];
          if (alive && n < 2)
            next[i * w + j] = 0;
          else if (alive && n >= 2 && n <= 3)
            next[i * w + j] += 1;
          else if (alive && n > 3)
            next[i * w + j] = 0;
          else if (!alive && n == 3)
            next[i * w + j] += 1;
          if (next[i * w + j] > 9)
            next[i * w + j] = 9;
        }
      }
      for (int i = 0; i < h * w; i++)
        map[i] = next[i];
    }
    if (paused) {
      mvprintw(h, 0, "iteration %d, %d living cells, %d iter/s, paused", iter,
               living, speed);
    } else {
      mvprintw(h, 0, "iteration %d, %d living cells, %d iter/s", iter, living,
               speed);
    }
    refresh();
    if (ch != 93)
      usleep(delay);
  }
  endwin();
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x2,-0x14(%rbp)
movl   $0x72,-0x18(%rbp)
movw   $0x0,-0x1a(%rbp)
movl   $0xa,-0x20(%rbp)
mov    $0xf4240,%eax
cltd
idivl  -0x20(%rbp)
mov    %eax,-0x24(%rbp)
mov    0x2ce9(%rip),%rax
mov    (%rax),%edi
lea    0xd4f(%rip),%rsi
call   1110 <setlocale@plt>
mov    $0x0,%al
call   1060 <initscr@plt>
mov    $0x0,%al
call   1150 <noecho@plt>
mov    0x2cd6(%rip),%rax
mov    (%rax),%edi
call   1170 <curs_set@plt>
mov    $0x0,%al
call   1160 <clear@plt>
mov    $0x0,%al
call   1070 <start_color@plt>
mov    0x2cb2(%rip),%rax
mov    (%rax),%esi
mov    0x2cc1(%rip),%rax
mov    (%rax),%edx
mov    $0x1,%edi
call   1050 <init_pair@plt>
mov    0x2cbe(%rip),%rax
mov    (%rax),%edi
mov    -0x28(%rbp),%esi
mov    -0x2c(%rbp),%edx
call   10b0 <getmaxyx@plt>
mov    -0x28(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
movslq -0x28(%rbp),%rax
shl    $0x1,%rax
movslq -0x2c(%rbp),%rcx
imul   %rcx,%rax
mov    %eax,%edi
call   10e0 <malloc@plt>
mov    %rax,-0x38(%rbp)
movslq -0x28(%rbp),%rax
shl    $0x1,%rax
movslq -0x2c(%rbp),%rcx
imul   %rcx,%rax
mov    %eax,%edi
call   10e0 <malloc@plt>
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
movw   $0x0,-0x4a(%rbp)
cmpl   $0x71,-0x18(%rbp)
je     1cc1 <main+0xa41>
cmpl   $0x72,-0x18(%rbp)
jne    1553 <main+0x2d3>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1412 <main+0x192>
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13ff <main+0x17f>
mov    -0x38(%rbp),%rax
mov    -0x50(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x54(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
mov    -0x40(%rbp),%rax
mov    -0x50(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x54(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    13b7 <main+0x137>
jmp    1404 <main+0x184>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    13a4 <main+0x124>
movl   $0x0,-0x58(%rbp)
cmpl   $0x0,-0x58(%rbp)
jne    14d0 <main+0x250>
movss  0xbd5(%rip),%xmm0
movss  %xmm0,-0x5c(%rbp)
xor    %edi,%edi
call   10c0 <time@plt>
mov    %eax,%edi
call   1090 <srand@plt>
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    14cb <main+0x24b>
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    14b8 <main+0x238>
mov    $0x0,%al
call   1190 <rand@plt>
cvtsi2ss %rax,%xmm1
mov    0x2b71(%rip),%rax
cvtsi2ssq (%rax),%xmm0
divss  %xmm0,%xmm1
movss  -0x5c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    14a5 <main+0x225>
mov    -0x38(%rbp),%rax
mov    -0x60(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x64(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x1,(%rax,%rcx,2)
jmp    14aa <main+0x22a>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1458 <main+0x1d8>
jmp    14bd <main+0x23d>
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    1445 <main+0x1c5>
jmp    153c <main+0x2bc>
cmpl   $0x1,-0x58(%rbp)
jne    1537 <main+0x2b7>
lea    0xb23(%rip),%rdi
lea    0xb26(%rip),%rsi
call   1140 <fopen@plt>
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rdi
lea    0xb14(%rip),%rsi
lea    -0x74(%rbp),%rdx
lea    -0x78(%rbp),%rcx
call   1080 <fscanf@plt>
cmp    $0x2,%eax
jne    152e <main+0x2ae>
mov    -0x38(%rbp),%rax
mov    -0x78(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x74(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x1,(%rax,%rcx,2)
jmp    14f1 <main+0x271>
mov    -0x70(%rbp),%rdi
call   1040 <fclose@plt>
jmp    153c <main+0x2bc>
mov    0x2a9d(%rip),%rax
mov    (%rax),%edi
mov    0x2a8c(%rip),%rax
mov    (%rax),%esi
call   10f0 <nodelay@plt>
cmpl   $0x0,-0x18(%rbp)
je     1564 <main+0x2e4>
movl   $0x0,-0x18(%rbp)
mov    $0x0,%al
call   1120 <getch@plt>
mov    %eax,-0x18(%rbp)
cmpw   $0x0,-0x4a(%rbp)
jne    158e <main+0x30e>
cmpl   $0x20,-0x18(%rbp)
jne    158e <main+0x30e>
movw   $0x1,-0x4a(%rbp)
jmp    15b0 <main+0x330>
movswl -0x4a(%rbp),%eax
cmp    $0x0,%eax
je     15ab <main+0x32b>
cmpl   $0x20,-0x18(%rbp)
jne    15ab <main+0x32b>
movw   $0x0,-0x4a(%rbp)
jmp    15b0 <main+0x330>
cmpl   $0x2c,-0x18(%rbp)
jne    15d2 <main+0x352>
mov    -0x20(%rbp),%eax
sub    $0x5,%eax
cmp    $0x0,%eax
jle    15d2 <main+0x352>
mov    -0x20(%rbp),%eax
sub    $0x5,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x2e,-0x18(%rbp)
jne    15ef <main+0x36f>
cmpl   $0x32,-0x20(%rbp)
jge    15ef <main+0x36f>
mov    -0x20(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x20(%rbp)
mov    $0xf4240,%eax
cltd
idivl  -0x20(%rbp)
mov    %eax,-0x24(%rbp)
cmpw   $0x0,-0x4a(%rbp)
je     161d <main+0x39d>
movswl -0x4a(%rbp),%eax
cmp    $0x0,%eax
je     1c57 <main+0x9d7>
cmpl   $0x5d,-0x18(%rbp)
jne    1c57 <main+0x9d7>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    $0x0,%al
call   1160 <clear@plt>
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1841 <main+0x5c1>
movl   $0x0,-0x80(%rbp)
mov    -0x80(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    182e <main+0x5ae>
movswl -0x1a(%rbp),%eax
cmp    $0x0,%eax
je     16de <main+0x45e>
cmpl   $0x0,-0x7c(%rbp)
je     169d <main+0x41d>
mov    -0x7c(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
je     169d <main+0x41d>
cmpl   $0x0,-0x80(%rbp)
je     169d <main+0x41d>
mov    -0x80(%rbp),%eax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    16de <main+0x45e>
mov    -0x38(%rbp),%rax
mov    -0x7c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x80(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
mov    $0x1,%edi
call   10d0 <COLOR_PAIR@plt>
mov    %eax,%edi
call   1030 <attroff@plt>
mov    -0x7c(%rbp),%edi
mov    -0x80(%rbp),%esi
lea    0x944(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
jmp    181b <main+0x59b>
mov    -0x38(%rbp),%rax
mov    -0x7c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x80(%rbp),%ecx
movslq %ecx,%rcx
cmpw   $0x0,(%rax,%rcx,2)
je     1816 <main+0x596>
mov    -0x38(%rbp),%rax
mov    -0x7c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x80(%rbp),%ecx
movslq %ecx,%rcx
cmpw   $0x0,(%rax,%rcx,2)
je     17fd <main+0x57d>
cmpl   $0x0,-0x14(%rbp)
jne    1739 <main+0x4b9>
mov    -0x7c(%rbp),%edi
mov    -0x80(%rbp),%esi
lea    0x8ed(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
jmp    17ef <main+0x56f>
cmpl   $0x1,-0x14(%rbp)
jne    1771 <main+0x4f1>
mov    -0x7c(%rbp),%edi
mov    -0x80(%rbp),%esi
mov    -0x38(%rbp),%rax
mov    -0x7c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x80(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%ecx
lea    0x8ae(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
jmp    17ea <main+0x56a>
cmpl   $0x2,-0x14(%rbp)
jne    17e5 <main+0x565>
mov    -0x38(%rbp),%rax
mov    -0x7c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x80(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x1,%eax
jle    17af <main+0x52f>
mov    $0x1,%edi
call   10d0 <COLOR_PAIR@plt>
mov    %eax,%edi
call   10a0 <attron@plt>
jmp    17c0 <main+0x540>
mov    $0x1,%edi
call   10d0 <COLOR_PAIR@plt>
mov    %eax,%edi
call   1030 <attroff@plt>
mov    -0x7c(%rbp),%edi
mov    -0x80(%rbp),%esi
lea    0x84d(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
mov    $0x1,%edi
call   10d0 <COLOR_PAIR@plt>
mov    %eax,%edi
call   1030 <attroff@plt>
jmp    17ea <main+0x56a>
jmp    17ef <main+0x56f>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1811 <main+0x591>
mov    -0x7c(%rbp),%edi
mov    -0x80(%rbp),%esi
lea    0x814(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
jmp    1816 <main+0x596>
jmp    181b <main+0x59b>
jmp    1820 <main+0x5a0>
mov    -0x80(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x80(%rbp)
jmp    164e <main+0x3ce>
jmp    1833 <main+0x5b3>
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
jmp    163b <main+0x3bb>
movw   $0x0,-0x84(%rbp)
movl   $0x0,-0x90(%rbp)
mov    -0x90(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1c01 <main+0x981>
movl   $0x0,-0x94(%rbp)
mov    -0x94(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1be8 <main+0x968>
mov    -0x28(%rbp),%eax
add    -0x90(%rbp),%eax
sub    $0x1,%eax
cltd
idivl  -0x28(%rbp)
mov    %dx,%ax
mov    %ax,-0x86(%rbp)
mov    -0x90(%rbp),%eax
add    $0x1,%eax
cltd
idivl  -0x28(%rbp)
mov    %dx,%ax
mov    %ax,-0x88(%rbp)
mov    -0x2c(%rbp),%eax
add    -0x94(%rbp),%eax
sub    $0x1,%eax
cltd
idivl  -0x2c(%rbp)
mov    %dx,%ax
mov    %ax,-0x8a(%rbp)
mov    -0x94(%rbp),%eax
add    $0x1,%eax
cltd
idivl  -0x2c(%rbp)
mov    %dx,%ax
mov    %ax,-0x8c(%rbp)
mov    -0x38(%rbp),%rax
movswl -0x86(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
setg   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x38(%rbp),%rcx
movswl -0x86(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8c(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
mov    -0x90(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8c(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
movswl -0x88(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8c(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
movswl -0x88(%rbp),%edx
imul   -0x2c(%rbp),%edx
add    -0x94(%rbp),%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
movswl -0x88(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8a(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
mov    -0x90(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8a(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x38(%rbp),%rcx
movswl -0x86(%rbp),%edx
imul   -0x2c(%rbp),%edx
movswl -0x8a(%rbp),%esi
add    %esi,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    $0x0,%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    %ax,-0x84(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x82(%rbp)
movswl -0x82(%rbp),%eax
cmp    $0x0,%eax
je     1aa6 <main+0x826>
movswl -0x84(%rbp),%eax
cmp    $0x2,%eax
jge    1aa6 <main+0x826>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
jmp    1b8e <main+0x90e>
movswl -0x82(%rbp),%eax
cmp    $0x0,%eax
je     1afd <main+0x87d>
movswl -0x84(%rbp),%eax
cmp    $0x2,%eax
jl     1afd <main+0x87d>
movswl -0x84(%rbp),%eax
cmp    $0x3,%eax
jg     1afd <main+0x87d>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edx
add    $0x1,%edx
mov    %dx,(%rax,%rcx,2)
jmp    1b89 <main+0x909>
movswl -0x82(%rbp),%eax
cmp    $0x0,%eax
je     1b3f <main+0x8bf>
movswl -0x84(%rbp),%eax
cmp    $0x3,%eax
jle    1b3f <main+0x8bf>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
jmp    1b84 <main+0x904>
cmpw   $0x0,-0x82(%rbp)
jne    1b7f <main+0x8ff>
movswl -0x84(%rbp),%eax
cmp    $0x3,%eax
jne    1b7f <main+0x8ff>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edx
add    $0x1,%edx
mov    %dx,(%rax,%rcx,2)
jmp    1b84 <main+0x904>
jmp    1b89 <main+0x909>
jmp    1b8e <main+0x90e>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x9,%eax
jle    1bcf <main+0x94f>
mov    -0x40(%rbp),%rax
mov    -0x90(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x94(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x9,(%rax,%rcx,2)
jmp    1bd4 <main+0x954>
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    186d <main+0x5ed>
jmp    1bed <main+0x96d>
mov    -0x90(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x90(%rbp)
jmp    1854 <main+0x5d4>
movl   $0x0,-0x98(%rbp)
mov    -0x98(%rbp),%eax
mov    -0x28(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
cmp    %ecx,%eax
jge    1c52 <main+0x9d2>
mov    -0x40(%rbp),%rax
movslq -0x98(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x38(%rbp),%rax
movslq -0x98(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x98(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x98(%rbp)
jmp    1c0b <main+0x98b>
jmp    1c57 <main+0x9d7>
cmpw   $0x0,-0x4a(%rbp)
je     1c85 <main+0xa05>
mov    -0x28(%rbp),%edi
mov    -0x44(%rbp),%ecx
mov    -0x48(%rbp),%r8d
mov    -0x20(%rbp),%r9d
xor    %esi,%esi
lea    0x3a7(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
jmp    1ca3 <main+0xa23>
mov    -0x28(%rbp),%edi
mov    -0x44(%rbp),%ecx
mov    -0x48(%rbp),%r8d
mov    -0x20(%rbp),%r9d
xor    %esi,%esi
lea    0x3b5(%rip),%rdx
mov    $0x0,%al
call   1180 <mvprintw@plt>
mov    $0x0,%al
call   1100 <refresh@plt>
cmpl   $0x5d,-0x18(%rbp)
je     1cbc <main+0xa3c>
mov    -0x24(%rbp),%edi
call   11a0 <usleep@plt>
jmp    1382 <main+0x102>
mov    $0x0,%al
call   1130 <endwin@plt>
mov    -0x4(%rbp),%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    0x2d96(%rip),%rax
mov    (%rax),%edi
lea    0xe05(%rip),%rsi
call   10c0 <setlocale@plt>
xor    %eax,%eax
call   1040 <initscr@plt>
xor    %eax,%eax
call   10f0 <noecho@plt>
mov    0x2d83(%rip),%rax
mov    (%rax),%edi
call   1110 <curs_set@plt>
xor    %eax,%eax
call   1100 <clear@plt>
xor    %eax,%eax
call   1050 <start_color@plt>
mov    0x2d5f(%rip),%rax
mov    (%rax),%esi
mov    0x2d6e(%rip),%rax
mov    (%rax),%edx
mov    $0x1,%edi
call   1030 <init_pair@plt>
mov    0x2d6b(%rip),%rax
mov    (%rax),%edi
call   1070 <getmaxyx@plt>
xor    %edi,%edi
call   1090 <malloc@plt>
xor    %edi,%edi
call   1090 <malloc@plt>
mov    $0x72,%ebp
mov    $0xa,%ebx
lea    0xd5d(%rip),%r13
xor    %r12d,%r12d
xor    %r14d,%r14d
nopl   0x0(%rax)
cmp    $0x72,%ebp
je     12c0 <main+0xb0>
cmp    $0x71,%ebp
jne    12e8 <main+0xd8>
jmp    139e <main+0x18e>
nop
xor    %r14d,%r14d
xor    %edi,%edi
call   1080 <time@plt>
mov    %eax,%edi
call   1060 <srand@plt>
mov    0x2d10(%rip),%rax
mov    (%rax),%edi
mov    0x2cff(%rip),%rax
mov    (%rax),%esi
call   10a0 <nodelay@plt>
xor    %eax,%eax
call   10d0 <getch@plt>
mov    %eax,%ebp
cmp    $0x20,%eax
mov    %r12d,%eax
mov    $0x0,%ecx
cmove  %ecx,%eax
test   %r12w,%r12w
cmove  %r12d,%eax
cmp    $0x20,%ebp
mov    %eax,%ecx
mov    $0x1,%edx
cmove  %edx,%ecx
test   %r12w,%r12w
cmovne %eax,%ecx
lea    -0x5(%rbx),%eax
cmp    $0x6,%ebx
cmovl  %ebx,%eax
cmp    $0x2c,%ebp
cmovne %ebx,%eax
lea    0x5(%rax),%ebx
cmp    $0x32,%eax
cmovge %eax,%ebx
mov    %ecx,%r12d
cmp    $0x2e,%ebp
cmovne %eax,%ebx
mov    $0xf4240,%eax
xor    %edx,%edx
idiv   %ebx
mov    %eax,%r15d
test   %cx,%cx
je     1352 <main+0x142>
cmp    $0x5d,%ebp
jne    135d <main+0x14d>
add    $0x1,%r14d
xor    %eax,%eax
call   1100 <clear@plt>
test   %r12w,%r12w
mov    %r13,%rdx
lea    0xcc6(%rip),%rax
cmove  %rax,%rdx
xor    %esi,%esi
mov    %r14d,%ecx
xor    %r8d,%r8d
mov    %ebx,%r9d
xor    %eax,%eax
call   1120 <mvprintw@plt>
xor    %eax,%eax
call   10b0 <refresh@plt>
cmp    $0x5d,%ebp
je     12b0 <main+0xa0>
mov    %r15d,%edi
call   1130 <usleep@plt>
jmp    12b0 <main+0xa0>
xor    %eax,%eax
call   10e0 <endwin@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@LC_ALL = global i32 0
@.str = [1 x i8] zeroinitializer
@FALSE = global i32 0
@COLOR_RED = global i32 0
@COLOR_BLACK = global i32 0
@stdscr = global i32 0
@RAND_MAX = global i64 0
@.str.1 = [10 x i8] c"initBoard\00"
@.str.2 = [2 x i8] c"r\00"
@.str.3 = [6 x i8] c"%d %d\00"
@TRUE = global i32 0
@.str.4 = [4 x i8] c"\E2\96\93\00"
@.str.5 = [4 x i8] c"\E2\96\88\00"
@.str.6 = [3 x i8] c"%d\00"
@.str.7 = [2 x i8] c" \00"
@.str.8 = [49 x i8] c"iteration %d, %d living cells, %d iter/s, paused\00"
@.str.9 = [41 x i8] c"iteration %d, %d living cells, %d iter/s\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i16
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i16*
%14 = alloca i16*
%15 = alloca i32
%16 = alloca i32
%17 = alloca i16
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca float
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32*
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i16
%30 = alloca i16
%31 = alloca i16
%32 = alloca i16
%33 = alloca i16
%34 = alloca i16
%35 = alloca i32
%36 = alloca i32
%37 = alloca i32
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
store i32 2, i32* %6
store i32 114, i32* %7
store i16 0, i16* %8
store i32 10, i32* %9
%38 = load i32, i32* %9
%39 = sdiv i32 1000000, %38
store i32 %39, i32* %10
%40 = load i32, i32* @LC_ALL
%41 = call i32 @setlocale(i32 %40, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0))
%42 = call i32 (...) @initscr()
%43 = call i32 (...) @noecho()
%44 = load i32, i32* @FALSE
%45 = call i32 @curs_set(i32 %44)
%46 = call i32 (...) @clear()
%47 = call i32 (...) @start_color()
%48 = load i32, i32* @COLOR_RED
%49 = load i32, i32* @COLOR_BLACK
%50 = call i32 @init_pair(i32 1, i32 %48, i32 %49)
%51 = load i32, i32* @stdscr
%52 = load i32, i32* %11
%53 = load i32, i32* %12
%54 = call i32 @getmaxyx(i32 %51, i32 %52, i32 %53)
%55 = load i32, i32* %11
%56 = sub nsw i32 %55, 1
store i32 %56, i32* %11
%57 = load i32, i32* %11
%58 = sext i32 %57 to i64
%59 = mul i64 2, %58
%60 = load i32, i32* %12
%61 = sext i32 %60 to i64
%62 = mul i64 %59, %61
%63 = trunc i64 %62 to i32
%64 = call i64 @malloc(i32 %63)
%65 = inttoptr i64 %64 to i16*
store i16* %65, i16** %13
%66 = load i32, i32* %11
%67 = sext i32 %66 to i64
%68 = mul i64 2, %67
%69 = load i32, i32* %12
%70 = sext i32 %69 to i64
%71 = mul i64 %68, %70
%72 = trunc i64 %71 to i32
%73 = call i64 @malloc(i32 %72)
%74 = inttoptr i64 %73 to i16*
store i16* %74, i16** %14
store i32 0, i32* %15
store i32 0, i32* %16
store i16 0, i16* %17
br label %75
75: ; preds = %686, %2
%76 = load i32, i32* %7
%77 = icmp ne i32 %76, 113
br i1 %77, label %78, label %687
78: ; preds = %75
%79 = load i32, i32* %7
%80 = icmp eq i32 %79, 114
br i1 %80, label %81, label %182
81: ; preds = %78
store i32 0, i32* %15
store i32 0, i32* %18
br label %82
82: ; preds = %112, %81
%83 = load i32, i32* %18
%84 = load i32, i32* %11
%85 = icmp slt i32 %83, %84
br i1 %85, label %86, label %115
86: ; preds = %82
store i32 0, i32* %19
br label %87
87: ; preds = %108, %86
%88 = load i32, i32* %19
%89 = load i32, i32* %12
%90 = icmp slt i32 %88, %89
br i1 %90, label %91, label %111
91: ; preds = %87
%92 = load i16*, i16** %13
%93 = load i32, i32* %18
%94 = load i32, i32* %12
%95 = mul nsw i32 %93, %94
%96 = load i32, i32* %19
%97 = add nsw i32 %95, %96
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i16, i16* %92, i64 %98
store i16 0, i16* %99
%100 = load i16*, i16** %14
%101 = load i32, i32* %18
%102 = load i32, i32* %12
%103 = mul nsw i32 %101, %102
%104 = load i32, i32* %19
%105 = add nsw i32 %103, %104
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i16, i16* %100, i64 %106
store i16 0, i16* %107
br label %108
108: ; preds = %91
%109 = load i32, i32* %19
%110 = add nsw i32 %109, 1
store i32 %110, i32* %19
br label %87
111: ; preds = %87
br label %112
112: ; preds = %111
%113 = load i32, i32* %18
%114 = add nsw i32 %113, 1
store i32 %114, i32* %18
br label %82
115: ; preds = %82
store i32 0, i32* %20
%116 = load i32, i32* %20
%117 = icmp eq i32 %116, 0
br i1 %117, label %118, label %156
118: ; preds = %115
store float 0x3FC99999A0000000, float* %21
%119 = call i32 @time(i32 0)
%120 = call i32 @srand(i32 %119)
store i32 0, i32* %22
br label %121
121: ; preds = %152, %118
%122 = load i32, i32* %22
%123 = load i32, i32* %11
%124 = icmp slt i32 %122, %123
br i1 %124, label %125, label %155
125: ; preds = %121
store i32 0, i32* %23
br label %126
126: ; preds = %148, %125
%127 = load i32, i32* %23
%128 = load i32, i32* %12
%129 = icmp slt i32 %127, %128
br i1 %129, label %130, label %151
130: ; preds = %126
%131 = call i64 (...) @rand()
%132 = sitofp i64 %131 to float
%133 = load i64, i64* @RAND_MAX
%134 = sitofp i64 %133 to float
%135 = fdiv float %132, %134
%136 = load float, float* %21
%137 = fcmp olt float %135, %136
br i1 %137, label %138, label %147
138: ; preds = %130
%139 = load i16*, i16** %13
%140 = load i32, i32* %22
%141 = load i32, i32* %12
%142 = mul nsw i32 %140, %141
%143 = load i32, i32* %23
%144 = add nsw i32 %142, %143
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds i16, i16* %139, i64 %145
store i16 1, i16* %146
br label %147
147: ; preds = %138, %130
br label %148
148: ; preds = %147
%149 = load i32, i32* %23
%150 = add nsw i32 %149, 1
store i32 %150, i32* %23
br label %126
151: ; preds = %126
br label %152
152: ; preds = %151
%153 = load i32, i32* %22
%154 = add nsw i32 %153, 1
store i32 %154, i32* %22
br label %121
155: ; preds = %121
br label %178
156: ; preds = %115
%157 = load i32, i32* %20
%158 = icmp eq i32 %157, 1
br i1 %158, label %159, label %177
159: ; preds = %156
%160 = call i32* @fopen(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
store i32* %160, i32** %24
br label %161
161: ; preds = %165, %159
%162 = load i32*, i32** %24
%163 = call i32 @fscanf(i32* %162, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i64 0, i64 0), i32* %25, i32* %26)
%164 = icmp eq i32 %163, 2
br i1 %164, label %165, label %174
165: ; preds = %161
%166 = load i16*, i16** %13
%167 = load i32, i32* %26
%168 = load i32, i32* %12
%169 = mul nsw i32 %167, %168
%170 = load i32, i32* %25
%171 = add nsw i32 %169, %170
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds i16, i16* %166, i64 %172
store i16 1, i16* %173
br label %161
174: ; preds = %161
%175 = load i32*, i32** %24
%176 = call i32 @fclose(i32* %175)
br label %177
177: ; preds = %174, %156
br label %178
178: ; preds = %177, %155
%179 = load i32, i32* @stdscr
%180 = load i32, i32* @TRUE
%181 = call i32 @nodelay(i32 %179, i32 %180)
br label %182
182: ; preds = %178, %78
%183 = load i32, i32* %7
%184 = icmp ne i32 %183, 0
br i1 %184, label %185, label %186
185: ; preds = %182
store i32 0, i32* %7
br label %186
186: ; preds = %185, %182
%187 = call i32 (...) @getch()
store i32 %187, i32* %7
%188 = load i16, i16* %17
%189 = icmp ne i16 %188, 0
br i1 %189, label %194, label %190
190: ; preds = %186
%191 = load i32, i32* %7
%192 = icmp eq i32 %191, 32
br i1 %192, label %193, label %194
193: ; preds = %190
store i16 1, i16* %17
br label %203
194: ; preds = %190, %186
%195 = load i16, i16* %17
%196 = sext i16 %195 to i32
%197 = icmp ne i32 %196, 0
br i1 %197, label %198, label %202
198: ; preds = %194
%199 = load i32, i32* %7
%200 = icmp eq i32 %199, 32
br i1 %200, label %201, label %202
201: ; preds = %198
store i16 0, i16* %17
br label %202
202: ; preds = %201, %198, %194
br label %203
203: ; preds = %202, %193
%204 = load i32, i32* %7
%205 = icmp eq i32 %204, 44
br i1 %205, label %206, label %213
206: ; preds = %203
%207 = load i32, i32* %9
%208 = sub nsw i32 %207, 5
%209 = icmp sgt i32 %208, 0
br i1 %209, label %210, label %213
210: ; preds = %206
%211 = load i32, i32* %9
%212 = sub nsw i32 %211, 5
store i32 %212, i32* %9
br label %213
213: ; preds = %210, %206, %203
%214 = load i32, i32* %7
%215 = icmp eq i32 %214, 46
br i1 %215, label %216, label %222
216: ; preds = %213
%217 = load i32, i32* %9
%218 = icmp slt i32 %217, 50
br i1 %218, label %219, label %222
219: ; preds = %216
%220 = load i32, i32* %9
%221 = add nsw i32 %220, 5
store i32 %221, i32* %9
br label %222
222: ; preds = %219, %216, %213
%223 = load i32, i32* %9
%224 = sdiv i32 1000000, %223
store i32 %224, i32* %10
%225 = load i16, i16* %17
%226 = icmp ne i16 %225, 0
br i1 %226, label %227, label %234
227: ; preds = %222
%228 = load i16, i16* %17
%229 = sext i16 %228 to i32
%230 = icmp ne i32 %229, 0
br i1 %230, label %231, label %664
231: ; preds = %227
%232 = load i32, i32* %7
%233 = icmp eq i32 %232, 93
br i1 %233, label %234, label %664
234: ; preds = %231, %222
%235 = load i32, i32* %15
%236 = add nsw i32 %235, 1
store i32 %236, i32* %15
%237 = call i32 (...) @clear()
store i32 0, i32* %16
store i32 0, i32* %27
br label %238
238: ; preds = %370, %234
%239 = load i32, i32* %27
%240 = load i32, i32* %11
%241 = icmp slt i32 %239, %240
br i1 %241, label %242, label %373
242: ; preds = %238
store i32 0, i32* %28
br label %243
243: ; preds = %366, %242
%244 = load i32, i32* %28
%245 = load i32, i32* %12
%246 = icmp slt i32 %244, %245
br i1 %246, label %247, label %369
247: ; preds = %243
%248 = load i16, i16* %8
%249 = sext i16 %248 to i32
%250 = icmp ne i32 %249, 0
br i1 %250, label %251, label %281
251: ; preds = %247
%252 = load i32, i32* %27
%253 = icmp eq i32 %252, 0
br i1 %253, label %267, label %254
254: ; preds = %251
%255 = load i32, i32* %27
%256 = load i32, i32* %11
%257 = sub nsw i32 %256, 1
%258 = icmp eq i32 %255, %257
br i1 %258, label %267, label %259
259: ; preds = %254
%260 = load i32, i32* %28
%261 = icmp eq i32 %260, 0
br i1 %261, label %267, label %262
262: ; preds = %259
%263 = load i32, i32* %28
%264 = load i32, i32* %12
%265 = sub nsw i32 %264, 1
%266 = icmp eq i32 %263, %265
br i1 %266, label %267, label %281
267: ; preds = %262, %259, %254, %251
%268 = load i16*, i16** %13
%269 = load i32, i32* %27
%270 = load i32, i32* %12
%271 = mul nsw i32 %269, %270
%272 = load i32, i32* %28
%273 = add nsw i32 %271, %272
%274 = sext i32 %273 to i64
%275 = getelementptr inbounds i16, i16* %268, i64 %274
store i16 0, i16* %275
%276 = call i32 @COLOR_PAIR(i32 1)
%277 = call i32 @attroff(i32 %276)
%278 = load i32, i32* %27
%279 = load i32, i32* %28
%280 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %278, i32 %279, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i64 0, i64 0))
br label %365
281: ; preds = %262, %247
%282 = load i16*, i16** %13
%283 = load i32, i32* %27
%284 = load i32, i32* %12
%285 = mul nsw i32 %283, %284
%286 = load i32, i32* %28
%287 = add nsw i32 %285, %286
%288 = sext i32 %287 to i64
%289 = getelementptr inbounds i16, i16* %282, i64 %288
%290 = load i16, i16* %289
%291 = icmp ne i16 %290, 0
br i1 %291, label %292, label %364
292: ; preds = %281
%293 = load i16*, i16** %13
%294 = load i32, i32* %27
%295 = load i32, i32* %12
%296 = mul nsw i32 %294, %295
%297 = load i32, i32* %28
%298 = add nsw i32 %296, %297
%299 = sext i32 %298 to i64
%300 = getelementptr inbounds i16, i16* %293, i64 %299
%301 = load i16, i16* %300
%302 = icmp ne i16 %301, 0
br i1 %302, label %303, label %359
303: ; preds = %292
%304 = load i32, i32* %6
%305 = icmp eq i32 %304, 0
br i1 %305, label %306, label %310
306: ; preds = %303
%307 = load i32, i32* %27
%308 = load i32, i32* %28
%309 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %307, i32 %308, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0))
br label %356
310: ; preds = %303
%311 = load i32, i32* %6
%312 = icmp eq i32 %311, 1
br i1 %312, label %313, label %327
313: ; preds = %310
%314 = load i32, i32* %27
%315 = load i32, i32* %28
%316 = load i16*, i16** %13
%317 = load i32, i32* %27
%318 = load i32, i32* %12
%319 = mul nsw i32 %317, %318
%320 = load i32, i32* %28
%321 = add nsw i32 %319, %320
%322 = sext i32 %321 to i64
%323 = getelementptr inbounds i16, i16* %316, i64 %322
%324 = load i16, i16* %323
%325 = sext i16 %324 to i32
%326 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %314, i32 %315, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0), i32 %325)
br label %355
327: ; preds = %310
%328 = load i32, i32* %6
%329 = icmp eq i32 %328, 2
br i1 %329, label %330, label %354
330: ; preds = %327
%331 = load i16*, i16** %13
%332 = load i32, i32* %27
%333 = load i32, i32* %12
%334 = mul nsw i32 %332, %333
%335 = load i32, i32* %28
%336 = add nsw i32 %334, %335
%337 = sext i32 %336 to i64
%338 = getelementptr inbounds i16, i16* %331, i64 %337
%339 = load i16, i16* %338
%340 = sext i16 %339 to i32
%341 = icmp sgt i32 %340, 1
br i1 %341, label %342, label %345
342: ; preds = %330
%343 = call i32 @COLOR_PAIR(i32 1)
%344 = call i32 @attron(i32 %343)
br label %348
345: ; preds = %330
%346 = call i32 @COLOR_PAIR(i32 1)
%347 = call i32 @attroff(i32 %346)
br label %348
348: ; preds = %345, %342
%349 = load i32, i32* %27
%350 = load i32, i32* %28
%351 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %349, i32 %350, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0))
%352 = call i32 @COLOR_PAIR(i32 1)
%353 = call i32 @attroff(i32 %352)
br label %354
354: ; preds = %348, %327
br label %355
355: ; preds = %354, %313
br label %356
356: ; preds = %355, %306
%357 = load i32, i32* %16
%358 = add nsw i32 %357, 1
store i32 %358, i32* %16
br label %363
359: ; preds = %292
%360 = load i32, i32* %27
%361 = load i32, i32* %28
%362 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %360, i32 %361, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
br label %363
363: ; preds = %359, %356
br label %364
364: ; preds = %363, %281
br label %365
365: ; preds = %364, %267
br label %366
366: ; preds = %365
%367 = load i32, i32* %28
%368 = add nsw i32 %367, 1
store i32 %368, i32* %28
br label %243
369: ; preds = %243
br label %370
370: ; preds = %369
%371 = load i32, i32* %27
%372 = add nsw i32 %371, 1
store i32 %372, i32* %27
br label %238
373: ; preds = %238
store i16 0, i16* %30
store i32 0, i32* %35
br label %374
374: ; preds = %640, %373
%375 = load i32, i32* %35
%376 = load i32, i32* %11
%377 = icmp slt i32 %375, %376
br i1 %377, label %378, label %643
378: ; preds = %374
store i32 0, i32* %36
br label %379
379: ; preds = %636, %378
%380 = load i32, i32* %36
%381 = load i32, i32* %12
%382 = icmp slt i32 %380, %381
br i1 %382, label %383, label %639
383: ; preds = %379
%384 = load i32, i32* %11
%385 = load i32, i32* %35
%386 = add nsw i32 %384, %385
%387 = sub nsw i32 %386, 1
%388 = load i32, i32* %11
%389 = srem i32 %387, %388
%390 = trunc i32 %389 to i16
store i16 %390, i16* %31
%391 = load i32, i32* %35
%392 = add nsw i32 %391, 1
%393 = load i32, i32* %11
%394 = srem i32 %392, %393
%395 = trunc i32 %394 to i16
store i16 %395, i16* %32
%396 = load i32, i32* %12
%397 = load i32, i32* %36
%398 = add nsw i32 %396, %397
%399 = sub nsw i32 %398, 1
%400 = load i32, i32* %12
%401 = srem i32 %399, %400
%402 = trunc i32 %401 to i16
store i16 %402, i16* %33
%403 = load i32, i32* %36
%404 = add nsw i32 %403, 1
%405 = load i32, i32* %12
%406 = srem i32 %404, %405
%407 = trunc i32 %406 to i16
store i16 %407, i16* %34
%408 = load i16*, i16** %13
%409 = load i16, i16* %31
%410 = sext i16 %409 to i32
%411 = load i32, i32* %12
%412 = mul nsw i32 %410, %411
%413 = load i32, i32* %36
%414 = add nsw i32 %412, %413
%415 = sext i32 %414 to i64
%416 = getelementptr inbounds i16, i16* %408, i64 %415
%417 = load i16, i16* %416
%418 = sext i16 %417 to i32
%419 = icmp sgt i32 %418, 0
%420 = zext i1 %419 to i32
%421 = load i16*, i16** %13
%422 = load i16, i16* %31
%423 = sext i16 %422 to i32
%424 = load i32, i32* %12
%425 = mul nsw i32 %423, %424
%426 = load i16, i16* %34
%427 = sext i16 %426 to i32
%428 = add nsw i32 %425, %427
%429 = sext i32 %428 to i64
%430 = getelementptr inbounds i16, i16* %421, i64 %429
%431 = load i16, i16* %430
%432 = sext i16 %431 to i32
%433 = icmp sgt i32 %432, 0
%434 = zext i1 %433 to i32
%435 = add nsw i32 %420, %434
%436 = load i16*, i16** %13
%437 = load i32, i32* %35
%438 = load i32, i32* %12
%439 = mul nsw i32 %437, %438
%440 = load i16, i16* %34
%441 = sext i16 %440 to i32
%442 = add nsw i32 %439, %441
%443 = sext i32 %442 to i64
%444 = getelementptr inbounds i16, i16* %436, i64 %443
%445 = load i16, i16* %444
%446 = sext i16 %445 to i32
%447 = icmp sgt i32 %446, 0
%448 = zext i1 %447 to i32
%449 = add nsw i32 %435, %448
%450 = load i16*, i16** %13
%451 = load i16, i16* %32
%452 = sext i16 %451 to i32
%453 = load i32, i32* %12
%454 = mul nsw i32 %452, %453
%455 = load i16, i16* %34
%456 = sext i16 %455 to i32
%457 = add nsw i32 %454, %456
%458 = sext i32 %457 to i64
%459 = getelementptr inbounds i16, i16* %450, i64 %458
%460 = load i16, i16* %459
%461 = sext i16 %460 to i32
%462 = icmp sgt i32 %461, 0
%463 = zext i1 %462 to i32
%464 = add nsw i32 %449, %463
%465 = load i16*, i16** %13
%466 = load i16, i16* %32
%467 = sext i16 %466 to i32
%468 = load i32, i32* %12
%469 = mul nsw i32 %467, %468
%470 = load i32, i32* %36
%471 = add nsw i32 %469, %470
%472 = sext i32 %471 to i64
%473 = getelementptr inbounds i16, i16* %465, i64 %472
%474 = load i16, i16* %473
%475 = sext i16 %474 to i32
%476 = icmp sgt i32 %475, 0
%477 = zext i1 %476 to i32
%478 = add nsw i32 %464, %477
%479 = load i16*, i16** %13
%480 = load i16, i16* %32
%481 = sext i16 %480 to i32
%482 = load i32, i32* %12
%483 = mul nsw i32 %481, %482
%484 = load i16, i16* %33
%485 = sext i16 %484 to i32
%486 = add nsw i32 %483, %485
%487 = sext i32 %486 to i64
%488 = getelementptr inbounds i16, i16* %479, i64 %487
%489 = load i16, i16* %488
%490 = sext i16 %489 to i32
%491 = icmp sgt i32 %490, 0
%492 = zext i1 %491 to i32
%493 = add nsw i32 %478, %492
%494 = load i16*, i16** %13
%495 = load i32, i32* %35
%496 = load i32, i32* %12
%497 = mul nsw i32 %495, %496
%498 = load i16, i16* %33
%499 = sext i16 %498 to i32
%500 = add nsw i32 %497, %499
%501 = sext i32 %500 to i64
%502 = getelementptr inbounds i16, i16* %494, i64 %501
%503 = load i16, i16* %502
%504 = sext i16 %503 to i32
%505 = icmp sgt i32 %504, 0
%506 = zext i1 %505 to i32
%507 = add nsw i32 %493, %506
%508 = load i16*, i16** %13
%509 = load i16, i16* %31
%510 = sext i16 %509 to i32
%511 = load i32, i32* %12
%512 = mul nsw i32 %510, %511
%513 = load i16, i16* %33
%514 = sext i16 %513 to i32
%515 = add nsw i32 %512, %514
%516 = sext i32 %515 to i64
%517 = getelementptr inbounds i16, i16* %508, i64 %516
%518 = load i16, i16* %517
%519 = sext i16 %518 to i32
%520 = icmp sgt i32 %519, 0
%521 = zext i1 %520 to i32
%522 = add nsw i32 %507, %521
%523 = trunc i32 %522 to i16
store i16 %523, i16* %30
%524 = load i16*, i16** %13
%525 = load i32, i32* %35
%526 = load i32, i32* %12
%527 = mul nsw i32 %525, %526
%528 = load i32, i32* %36
%529 = add nsw i32 %527, %528
%530 = sext i32 %529 to i64
%531 = getelementptr inbounds i16, i16* %524, i64 %530
%532 = load i16, i16* %531
store i16 %532, i16* %29
%533 = load i16, i16* %29
%534 = sext i16 %533 to i32
%535 = icmp ne i32 %534, 0
br i1 %535, label %536, label %549
536: ; preds = %383
%537 = load i16, i16* %30
%538 = sext i16 %537 to i32
%539 = icmp slt i32 %538, 2
br i1 %539, label %540, label %549
540: ; preds = %536
%541 = load i16*, i16** %14
%542 = load i32, i32* %35
%543 = load i32, i32* %12
%544 = mul nsw i32 %542, %543
%545 = load i32, i32* %36
%546 = add nsw i32 %544, %545
%547 = sext i32 %546 to i64
%548 = getelementptr inbounds i16, i16* %541, i64 %547
store i16 0, i16* %548
br label %614
549: ; preds = %536, %383
%550 = load i16, i16* %29
%551 = sext i16 %550 to i32
%552 = icmp ne i32 %551, 0
br i1 %552, label %553, label %574
553: ; preds = %549
%554 = load i16, i16* %30
%555 = sext i16 %554 to i32
%556 = icmp sge i32 %555, 2
br i1 %556, label %557, label %574
557: ; preds = %553
%558 = load i16, i16* %30
%559 = sext i16 %558 to i32
%560 = icmp sle i32 %559, 3
br i1 %560, label %561, label %574
561: ; preds = %557
%562 = load i16*, i16** %14
%563 = load i32, i32* %35
%564 = load i32, i32* %12
%565 = mul nsw i32 %563, %564
%566 = load i32, i32* %36
%567 = add nsw i32 %565, %566
%568 = sext i32 %567 to i64
%569 = getelementptr inbounds i16, i16* %562, i64 %568
%570 = load i16, i16* %569
%571 = sext i16 %570 to i32
%572 = add nsw i32 %571, 1
%573 = trunc i32 %572 to i16
store i16 %573, i16* %569
br label %613
574: ; preds = %557, %553, %549
%575 = load i16, i16* %29
%576 = sext i16 %575 to i32
%577 = icmp ne i32 %576, 0
br i1 %577, label %578, label %591
578: ; preds = %574
%579 = load i16, i16* %30
%580 = sext i16 %579 to i32
%581 = icmp sgt i32 %580, 3
br i1 %581, label %582, label %591
582: ; preds = %578
%583 = load i16*, i16** %14
%584 = load i32, i32* %35
%585 = load i32, i32* %12
%586 = mul nsw i32 %584, %585
%587 = load i32, i32* %36
%588 = add nsw i32 %586, %587
%589 = sext i32 %588 to i64
%590 = getelementptr inbounds i16, i16* %583, i64 %589
store i16 0, i16* %590
br label %612
591: ; preds = %578, %574
%592 = load i16, i16* %29
%593 = icmp ne i16 %592, 0
br i1 %593, label %611, label %594
594: ; preds = %591
%595 = load i16, i16* %30
%596 = sext i16 %595 to i32
%597 = icmp eq i32 %596, 3
br i1 %597, label %598, label %611
598: ; preds = %594
%599 = load i16*, i16** %14
%600 = load i32, i32* %35
%601 = load i32, i32* %12
%602 = mul nsw i32 %600, %601
%603 = load i32, i32* %36
%604 = add nsw i32 %602, %603
%605 = sext i32 %604 to i64
%606 = getelementptr inbounds i16, i16* %599, i64 %605
%607 = load i16, i16* %606
%608 = sext i16 %607 to i32
%609 = add nsw i32 %608, 1
%610 = trunc i32 %609 to i16
store i16 %610, i16* %606
br label %611
611: ; preds = %598, %594, %591
br label %612
612: ; preds = %611, %582
br label %613
613: ; preds = %612, %561
br label %614
614: ; preds = %613, %540
%615 = load i16*, i16** %14
%616 = load i32, i32* %35
%617 = load i32, i32* %12
%618 = mul nsw i32 %616, %617
%619 = load i32, i32* %36
%620 = add nsw i32 %618, %619
%621 = sext i32 %620 to i64
%622 = getelementptr inbounds i16, i16* %615, i64 %621
%623 = load i16, i16* %622
%624 = sext i16 %623 to i32
%625 = icmp sgt i32 %624, 9
br i1 %625, label %626, label %635
626: ; preds = %614
%627 = load i16*, i16** %14
%628 = load i32, i32* %35
%629 = load i32, i32* %12
%630 = mul nsw i32 %628, %629
%631 = load i32, i32* %36
%632 = add nsw i32 %630, %631
%633 = sext i32 %632 to i64
%634 = getelementptr inbounds i16, i16* %627, i64 %633
store i16 9, i16* %634
br label %635
635: ; preds = %626, %614
br label %636
636: ; preds = %635
%637 = load i32, i32* %36
%638 = add nsw i32 %637, 1
store i32 %638, i32* %36
br label %379
639: ; preds = %379
br label %640
640: ; preds = %639
%641 = load i32, i32* %35
%642 = add nsw i32 %641, 1
store i32 %642, i32* %35
br label %374
643: ; preds = %374
store i32 0, i32* %37
br label %644
644: ; preds = %660, %643
%645 = load i32, i32* %37
%646 = load i32, i32* %11
%647 = load i32, i32* %12
%648 = mul nsw i32 %646, %647
%649 = icmp slt i32 %645, %648
br i1 %649, label %650, label %663
650: ; preds = %644
%651 = load i16*, i16** %14
%652 = load i32, i32* %37
%653 = sext i32 %652 to i64
%654 = getelementptr inbounds i16, i16* %651, i64 %653
%655 = load i16, i16* %654
%656 = load i16*, i16** %13
%657 = load i32, i32* %37
%658 = sext i32 %657 to i64
%659 = getelementptr inbounds i16, i16* %656, i64 %658
store i16 %655, i16* %659
br label %660
660: ; preds = %650
%661 = load i32, i32* %37
%662 = add nsw i32 %661, 1
store i32 %662, i32* %37
br label %644
663: ; preds = %644
br label %664
664: ; preds = %663, %231, %227
%665 = load i16, i16* %17
%666 = icmp ne i16 %665, 0
br i1 %666, label %667, label %673
667: ; preds = %664
%668 = load i32, i32* %11
%669 = load i32, i32* %15
%670 = load i32, i32* %16
%671 = load i32, i32* %9
%672 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %668, i32 0, i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0), i32 %669, i32 %670, i32 %671)
br label %679
673: ; preds = %664
%674 = load i32, i32* %11
%675 = load i32, i32* %15
%676 = load i32, i32* %16
%677 = load i32, i32* %9
%678 = call i32 (i32, i32, i8*, ...) @mvprintw(i32 %674, i32 0, i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.9, i64 0, i64 0), i32 %675, i32 %676, i32 %677)
br label %679
679: ; preds = %673, %667
%680 = call i32 (...) @refresh()
%681 = load i32, i32* %7
%682 = icmp ne i32 %681, 93
br i1 %682, label %683, label %686
683: ; preds = %679
%684 = load i32, i32* %10
%685 = call i32 @usleep(i32 %684)
br label %686
686: ; preds = %683, %679
br label %75
687: ; preds = %75
%688 = call i32 (...) @endwin()
%689 = load i32, i32* %3
ret i32 %689
}

LLVM IR (-O2):
@LC_ALL = global i32 0
@.str = [1 x i8] zeroinitializer
@FALSE = global i32 0
@COLOR_RED = global i32 0
@COLOR_BLACK = global i32 0
@stdscr = global i32 0
@RAND_MAX = global i64 0
@TRUE = global i32 0
@.str.8 = [49 x i8] c"iteration %d, %d living cells, %d iter/s, paused\00"
@.str.9 = [41 x i8] c"iteration %d, %d living cells, %d iter/s\00"
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = load i32, i32* @LC_ALL
%4 = tail call i32 @setlocale(i32 %3, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0))
%5 = tail call i32 (...) @initscr()
%6 = tail call i32 (...) @noecho()
%7 = load i32, i32* @FALSE
%8 = tail call i32 @curs_set(i32 %7)
%9 = tail call i32 (...) @clear()
%10 = tail call i32 (...) @start_color()
%11 = load i32, i32* @COLOR_RED
%12 = load i32, i32* @COLOR_BLACK
%13 = tail call i32 @init_pair(i32 1, i32 %11, i32 %12)
%14 = load i32, i32* @stdscr
%15 = tail call i32 @getmaxyx(i32 %14, i32 undef, i32 undef)
%16 = tail call i64 @malloc(i32 0)
%17 = tail call i64 @malloc(i32 0)
br label %18
18: ; preds = %63, %2
%19 = phi i16 [ 0, %2 ], [ %38, %63 ]
%20 = phi i32 [ 0, %2 ], [ %57, %63 ]
%21 = phi i32 [ 10, %2 ], [ %48, %63 ]
%22 = phi i32 [ 114, %2 ], [ %31, %63 ]
switch i32 %22, label %29 [
i32 113, label %64
i32 114, label %23
]
23: ; preds = %18
%24 = tail call i32 @time(i32 0)
%25 = tail call i32 @srand(i32 %24)
%26 = load i32, i32* @stdscr
%27 = load i32, i32* @TRUE
%28 = tail call i32 @nodelay(i32 %26, i32 %27)
br label %29
29: ; preds = %18, %23
%30 = phi i32 [ 0, %23 ], [ %20, %18 ]
%31 = tail call i32 (...) @getch()
%32 = icmp eq i16 %19, 0
%33 = icmp eq i32 %31, 32
%34 = select i1 %32, i1 %33, i1 false
%35 = icmp ne i16 %19, 0
%36 = select i1 %35, i1 %33, i1 false
%37 = select i1 %36, i16 0, i16 %19
%38 = select i1 %34, i16 1, i16 %37
%39 = icmp eq i32 %31, 44
%40 = icmp sgt i32 %21, 5
%41 = select i1 %39, i1 %40, i1 false
%42 = add nsw i32 %21, -5
%43 = select i1 %41, i32 %42, i32 %21
%44 = icmp eq i32 %31, 46
%45 = icmp slt i32 %43, 50
%46 = select i1 %44, i1 %45, i1 false
%47 = add nsw i32 %43, 5
%48 = select i1 %46, i32 %47, i32 %43
%49 = sdiv i32 1000000, %48
%50 = icmp eq i16 %38, 0
%51 = icmp eq i32 %31, 93
%52 = select i1 %50, i1 true, i1 %51
br i1 %52, label %53, label %56
53: ; preds = %29
%54 = add nsw i32 %30, 1
%55 = tail call i32 (...) @clear()
br label %56
56: ; preds = %29, %53
%57 = phi i32 [ %54, %53 ], [ %30, %29 ]
%58 = select i1 %50, i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.9, i64 0, i64 0), i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0)
%59 = tail call i32 (i32, i32, i8*, ...) @mvprintw(i32 undef, i32 0, i8* %58, i32 %57, i32 0, i32 %48)
%60 = tail call i32 (...) @refresh()
br i1 %51, label %63, label %61
61: ; preds = %56
%62 = tail call i32 @usleep(i32 %49)
br label %63
63: ; preds = %61, %56
br label %18
64: ; preds = %18
%65 = tail call i32 (...) @endwin()
ret i32 0
}