main() {
  static int prog[] = {0, 1, 0, 2, 0, 3, 0, 4, 0, 5};
  int *ip = prog;
  int count = 10000000;
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst0:
  asm("#"
      "0");
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst1:
  asm("#"
      "1");
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst2:
  asm("#"
      "2");
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst3:
  asm("#"
      "3");
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst4:
  asm("#"
      "4");
  switch (*ip++) {
  case 0:
    goto inst0;
  case 1:
    goto inst1;
  case 2:
    goto inst2;
  case 3:
    goto inst3;
  case 4:
    goto inst4;
  case 5:
    goto inst5;
  };
inst5:
  if (count > 0) {
    count--;
    ip = prog;
    switch (*ip++) {
    case 0:
      goto inst0;
    case 1:
      goto inst1;
    case 2:
      goto inst2;
    case 3:
      goto inst3;
    case 4:
      goto inst4;
    case 5:
      goto inst5;
    };
  } else
    exit(0);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
lea    0x2f0a(%rip),%rax
mov    %rax,-0x10(%rbp)
movl   $0x989680,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x20(%rbp)
sub    $0x5,%rax
ja     1182 <main+0x72>
mov    -0x20(%rbp),%rax
lea    0xea5(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    1187 <main+0x77>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x28(%rbp)
sub    $0x5,%rax
ja     11d8 <main+0xc8>
mov    -0x28(%rbp),%rax
lea    0xe67(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    11dd <main+0xcd>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x30(%rbp)
sub    $0x5,%rax
ja     122e <main+0x11e>
mov    -0x30(%rbp),%rax
lea    0xe29(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    1233 <main+0x123>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x38(%rbp)
sub    $0x5,%rax
ja     1284 <main+0x174>
mov    -0x38(%rbp),%rax
lea    0xdeb(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    1289 <main+0x179>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x40(%rbp)
sub    $0x5,%rax
ja     12da <main+0x1ca>
mov    -0x40(%rbp),%rax
lea    0xdad(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    12df <main+0x1cf>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x48(%rbp)
sub    $0x5,%rax
ja     1330 <main+0x220>
mov    -0x48(%rbp),%rax
lea    0xd6f(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    1335 <main+0x225>
cmpl   $0x0,-0x14(%rbp)
jle    13a9 <main+0x299>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
lea    0x2ce1(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %rax,-0x50(%rbp)
sub    $0x5,%rax
ja     13a4 <main+0x294>
mov    -0x50(%rbp),%rax
lea    0xd13(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1187 <main+0x77>
jmp    11dd <main+0xcd>
jmp    1233 <main+0x123>
jmp    1289 <main+0x179>
jmp    12df <main+0x1cf>
jmp    1335 <main+0x225>
jmp    13b0 <main+0x2a0>
xor    %edi,%edi
call   1030 <exit@plt>
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
mov    $0x989680,%eax
lea    0xf57(%rip),%r8
lea    0xeec(%rip),%r10
lea    0xefd(%rip),%r11
lea    0xf0e(%rip),%rdi
lea    0xf1f(%rip),%r9
lea    0xec0(%rip),%rcx
mov    %r8,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdx),%esi
add    $0x4,%rdx
test   %esi,%esi
je     1150 <main+0x40>
add    $0xfffffffe,%esi
cmp    $0x3,%esi
ja     1170 <main+0x60>
movslq (%rcx,%rsi,4),%rsi
add    %rcx,%rsi
jmp    *%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rdx),%esi
add    $0x4,%rdx
cmp    $0x1,%esi
je     1170 <main+0x60>
mov    %esi,%ebx
cmp    $0x5,%esi
ja     1190 <main+0x80>
movslq (%r10,%rbx,4),%rsi
add    %r10,%rsi
jmp    *%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rdx),%esi
add    $0x4,%rdx
cmp    $0x2,%esi
je     1190 <main+0x80>
mov    %esi,%ebx
cmp    $0x5,%esi
ja     11b0 <main+0xa0>
movslq (%r11,%rbx,4),%rsi
add    %r11,%rsi
jmp    *%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rdx),%esi
add    $0x4,%rdx
cmp    $0x3,%esi
je     11b0 <main+0xa0>
mov    %esi,%ebx
cmp    $0x5,%esi
ja     11d0 <main+0xc0>
movslq (%rdi,%rbx,4),%rsi
add    %rdi,%rsi
jmp    *%rsi
nopl   0x0(%rax,%rax,1)
mov    (%rdx),%esi
add    $0x4,%rdx
cmp    $0x4,%esi
je     11d0 <main+0xc0>
mov    %esi,%esi
jae    11f0 <main+0xe0>
movslq (%r9,%rsi,4),%rsi
add    %r9,%rsi
jmp    *%rsi
nopl   0x0(%rax,%rax,1)
test   %eax,%eax
jle    11fc <main+0xec>
add    $0xffffffff,%eax
jmp    1140 <main+0x30>
xor    %edi,%edi
call   1030 <exit@plt>

LLVM IR (-O0):
@main.prog = internal global [10 x i32] [i32 0, i32 1, i32 0, i32 2, i32 0, i32 3, i32 0, i32 4, i32 0, i32 5]
define i32 @main() {
%1 = alloca i32
%2 = alloca i32*
%3 = alloca i32
store i32 0, i32* %1
store i32* getelementptr inbounds ([10 x i32], [10 x i32]* @main.prog, i64 0, i64 0), i32** %2
store i32 10000000, i32* %3
%4 = load i32*, i32** %2
%5 = getelementptr inbounds i32, i32* %4, i32 1
store i32* %5, i32** %2
%6 = load i32, i32* %4
switch i32 %6, label %13 [
i32 0, label %7
i32 1, label %8
i32 2, label %9
i32 3, label %10
i32 4, label %11
i32 5, label %12
]
7: ; preds = %0
br label %14
8: ; preds = %0
br label %25
9: ; preds = %0
br label %36
10: ; preds = %0
br label %47
11: ; preds = %0
br label %58
12: ; preds = %0
br label %69
13: ; preds = %0
br label %14
14: ; preds = %78, %62, %51, %40, %29, %18, %13, %7
%15 = load i32*, i32** %2
%16 = getelementptr inbounds i32, i32* %15, i32 1
store i32* %16, i32** %2
%17 = load i32, i32* %15
switch i32 %17, label %24 [
i32 0, label %18
i32 1, label %19
i32 2, label %20
i32 3, label %21
i32 4, label %22
i32 5, label %23
]
18: ; preds = %14
br label %14
19: ; preds = %14
br label %25
20: ; preds = %14
br label %36
21: ; preds = %14
br label %47
22: ; preds = %14
br label %58
23: ; preds = %14
br label %69
24: ; preds = %14
br label %25
25: ; preds = %79, %63, %52, %41, %30, %24, %19, %8
%26 = load i32*, i32** %2
%27 = getelementptr inbounds i32, i32* %26, i32 1
store i32* %27, i32** %2
%28 = load i32, i32* %26
switch i32 %28, label %35 [
i32 0, label %29
i32 1, label %30
i32 2, label %31
i32 3, label %32
i32 4, label %33
i32 5, label %34
]
29: ; preds = %25
br label %14
30: ; preds = %25
br label %25
31: ; preds = %25
br label %36
32: ; preds = %25
br label %47
33: ; preds = %25
br label %58
34: ; preds = %25
br label %69
35: ; preds = %25
br label %36
36: ; preds = %80, %64, %53, %42, %35, %31, %20, %9
%37 = load i32*, i32** %2
%38 = getelementptr inbounds i32, i32* %37, i32 1
store i32* %38, i32** %2
%39 = load i32, i32* %37
switch i32 %39, label %46 [
i32 0, label %40
i32 1, label %41
i32 2, label %42
i32 3, label %43
i32 4, label %44
i32 5, label %45
]
40: ; preds = %36
br label %14
41: ; preds = %36
br label %25
42: ; preds = %36
br label %36
43: ; preds = %36
br label %47
44: ; preds = %36
br label %58
45: ; preds = %36
br label %69
46: ; preds = %36
br label %47
47: ; preds = %81, %65, %54, %46, %43, %32, %21, %10
%48 = load i32*, i32** %2
%49 = getelementptr inbounds i32, i32* %48, i32 1
store i32* %49, i32** %2
%50 = load i32, i32* %48
switch i32 %50, label %57 [
i32 0, label %51
i32 1, label %52
i32 2, label %53
i32 3, label %54
i32 4, label %55
i32 5, label %56
]
51: ; preds = %47
br label %14
52: ; preds = %47
br label %25
53: ; preds = %47
br label %36
54: ; preds = %47
br label %47
55: ; preds = %47
br label %58
56: ; preds = %47
br label %69
57: ; preds = %47
br label %58
58: ; preds = %82, %66, %57, %55, %44, %33, %22, %11
%59 = load i32*, i32** %2
%60 = getelementptr inbounds i32, i32* %59, i32 1
store i32* %60, i32** %2
%61 = load i32, i32* %59
switch i32 %61, label %68 [
i32 0, label %62
i32 1, label %63
i32 2, label %64
i32 3, label %65
i32 4, label %66
i32 5, label %67
]
62: ; preds = %58
br label %14
63: ; preds = %58
br label %25
64: ; preds = %58
br label %36
65: ; preds = %58
br label %47
66: ; preds = %58
br label %58
67: ; preds = %58
br label %69
68: ; preds = %58
br label %69
69: ; preds = %83, %68, %67, %56, %45, %34, %23, %12
%70 = load i32, i32* %3
%71 = icmp sgt i32 %70, 0
br i1 %71, label %72, label %85
72: ; preds = %69
%73 = load i32, i32* %3
%74 = add nsw i32 %73, -1
store i32 %74, i32* %3
store i32* getelementptr inbounds ([10 x i32], [10 x i32]* @main.prog, i64 0, i64 0), i32** %2
%75 = load i32*, i32** %2
%76 = getelementptr inbounds i32, i32* %75, i32 1
store i32* %76, i32** %2
%77 = load i32, i32* %75
switch i32 %77, label %84 [
i32 0, label %78
i32 1, label %79
i32 2, label %80
i32 3, label %81
i32 4, label %82
i32 5, label %83
]
78: ; preds = %72
br label %14
79: ; preds = %72
br label %25
80: ; preds = %72
br label %36
81: ; preds = %72
br label %47
82: ; preds = %72
br label %58
83: ; preds = %72
br label %69
84: ; preds = %72
br label %86
85: ; preds = %69
unreachable
86: ; preds = %84
%87 = load i32, i32* %1
ret i32 %87
}

LLVM IR (-O2):
@main.prog = internal unnamed_addr constant [10 x i32] [i32 0, i32 1, i32 0, i32 2, i32 0, i32 3, i32 0, i32 4, i32 0, i32 5]
define i32 @main() {
br label %1
1: ; preds = %41, %0
%2 = phi i32* [ getelementptr inbounds ([10 x i32], [10 x i32]* @main.prog, i64 0, i64 1), %0 ], [ %42, %41 ]
%3 = phi i32 [ 10000000, %0 ], [ %43, %41 ]
br label %4
4: ; preds = %1, %4
%5 = phi i32* [ %6, %4 ], [ %2, %1 ]
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%6 = getelementptr inbounds i32, i32* %5, i64 1
%7 = load i32, i32* %5
switch i32 %7, label %8 [
i32 0, label %4
i32 5, label %36
i32 2, label %15
i32 3, label %22
i32 4, label %29
]
8: ; preds = %4, %18, %25, %32
%9 = phi i32* [ %34, %32 ], [ %27, %25 ], [ %20, %18 ], [ %6, %4 ]
%10 = phi i32 [ %31, %32 ], [ %24, %25 ], [ %17, %18 ], [ %3, %4 ]
br label %11
11: ; preds = %8, %11
%12 = phi i32* [ %13, %11 ], [ %9, %8 ]
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%13 = getelementptr inbounds i32, i32* %12, i64 1
%14 = load i32, i32* %12
switch i32 %14, label %15 [
i32 0, label %41
i32 1, label %11
i32 5, label %36
i32 3, label %22
i32 4, label %29
]
15: ; preds = %4, %11, %25, %32
%16 = phi i32* [ %34, %32 ], [ %27, %25 ], [ %13, %11 ], [ %6, %4 ]
%17 = phi i32 [ %31, %32 ], [ %24, %25 ], [ %10, %11 ], [ %3, %4 ]
br label %18
18: ; preds = %15, %18
%19 = phi i32* [ %20, %18 ], [ %16, %15 ]
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%20 = getelementptr inbounds i32, i32* %19, i64 1
%21 = load i32, i32* %19
switch i32 %21, label %22 [
i32 0, label %41
i32 1, label %8
i32 2, label %18
i32 5, label %36
i32 4, label %29
]
22: ; preds = %4, %11, %18, %32
%23 = phi i32* [ %34, %32 ], [ %20, %18 ], [ %13, %11 ], [ %6, %4 ]
%24 = phi i32 [ %31, %32 ], [ %17, %18 ], [ %10, %11 ], [ %3, %4 ]
br label %25
25: ; preds = %22, %25
%26 = phi i32* [ %27, %25 ], [ %23, %22 ]
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%27 = getelementptr inbounds i32, i32* %26, i64 1
%28 = load i32, i32* %26
switch i32 %28, label %29 [
i32 0, label %41
i32 1, label %8
i32 2, label %15
i32 3, label %25
i32 5, label %36
]
29: ; preds = %4, %11, %18, %25
%30 = phi i32* [ %27, %25 ], [ %20, %18 ], [ %13, %11 ], [ %6, %4 ]
%31 = phi i32 [ %24, %25 ], [ %17, %18 ], [ %10, %11 ], [ %3, %4 ]
br label %32
32: ; preds = %29, %32
%33 = phi i32* [ %34, %32 ], [ %30, %29 ]
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%34 = getelementptr inbounds i32, i32* %33, i64 1
%35 = load i32, i32* %33
switch i32 %35, label %36 [
i32 0, label %41
i32 1, label %8
i32 2, label %15
i32 3, label %22
i32 4, label %32
]
36: ; preds = %4, %11, %18, %25, %32
%37 = phi i32 [ %31, %32 ], [ %24, %25 ], [ %17, %18 ], [ %10, %11 ], [ %3, %4 ]
%38 = icmp sgt i32 %37, 0
br i1 %38, label %39, label %44
39: ; preds = %36
%40 = add nsw i32 %37, -1
br label %41
41: ; preds = %11, %18, %25, %32, %39
%42 = phi i32* [ getelementptr inbounds ([10 x i32], [10 x i32]* @main.prog, i64 0, i64 1), %39 ], [ %34, %32 ], [ %27, %25 ], [ %20, %18 ], [ %13, %11 ]
%43 = phi i32 [ %40, %39 ], [ %31, %32 ], [ %24, %25 ], [ %17, %18 ], [ %10, %11 ]
br label %1
44: ; preds = %36
tail call void @exit(i32 0)
unreachable
}