#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 */

/* Variables and functions */
scalar_t__ witness(size_t, size_t, size_t, int);
bool is_prime_mr(size_t n) {
  if (((!(n & 1)) && n != 2) || (n < 2) || (n % 3 == 0 && n != 3))
    return false;
  if (n <= 3)
    return true;
  size_t d = n / 2;
  size_t s = 1;
  while (!(d & 1)) {
    d /= 2;
    ++s;
  }
  if (n < 1373653)
    return witness(n, s, d, 2) && witness(n, s, d, 3);
  if (n < 9080191)
    return witness(n, s, d, 31) && witness(n, s, d, 73);
  if (n < 4759123141)
    return witness(n, s, d, 2) && witness(n, s, d, 7) && witness(n, s, d, 61);
  if (n < 1122004669633)
    return witness(n, s, d, 2) && witness(n, s, d, 13) &&
           witness(n, s, d, 23) && witness(n, s, d, 1662803);
  if (n < 2152302898747)
    return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) &&
           witness(n, s, d, 7) && witness(n, s, d, 11);
  if (n < 3474749660383)
    return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) &&
           witness(n, s, d, 7) && witness(n, s, d, 11) && witness(n, s, d, 13);
  return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) &&
         witness(n, s, d, 7) && witness(n, s, d, 11) && witness(n, s, d, 13) &&
         witness(n, s, d, 17);
}


x86 assembly (clang, -O0):
<is_prime_mr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
jne    1139 <is_prime_mr+0x29>
cmpq   $0x2,-0x10(%rbp)
jne    1167 <is_prime_mr+0x57>
cmpq   $0x2,-0x10(%rbp)
jb     1167 <is_prime_mr+0x57>
mov    -0x10(%rbp),%rax
mov    $0x3,%ecx
xor    %edx,%edx
div    %rcx
cmp    $0x0,%rdx
jne    1173 <is_prime_mr+0x63>
cmpq   $0x3,-0x10(%rbp)
je     1173 <is_prime_mr+0x63>
movl   $0x0,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
cmpq   $0x3,-0x10(%rbp)
ja     118a <is_prime_mr+0x7a>
movl   $0x1,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x18(%rbp)
movq   $0x1,-0x20(%rbp)
mov    -0x18(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    11bc <is_prime_mr+0xac>
jmp    11d9 <is_prime_mr+0xc9>
mov    -0x18(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    119e <is_prime_mr+0x8e>
cmpq   $0x14f5d5,-0x10(%rbp)
jae    123f <is_prime_mr+0x12f>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x21(%rbp)
je     122f <is_prime_mr+0x11f>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
cmpq   $0x8a8d7f,-0x10(%rbp)
jae    12a5 <is_prime_mr+0x195>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1f,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x22(%rbp)
je     1295 <is_prime_mr+0x185>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x49,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
movabs $0x11baa74c5,%rax
cmp    %rax,-0x10(%rbp)
jae    1339 <is_prime_mr+0x229>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x23(%rbp)
je     1329 <is_prime_mr+0x219>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x23(%rbp)
je     1329 <is_prime_mr+0x219>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3d,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x23(%rbp)
mov    -0x23(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
movabs $0x1053cb094c1,%rax
cmp    %rax,-0x10(%rbp)
jae    13f5 <is_prime_mr+0x2e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x24(%rbp)
je     13e5 <is_prime_mr+0x2d5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xd,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x24(%rbp)
je     13e5 <is_prime_mr+0x2d5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x17,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x24(%rbp)
je     13e5 <is_prime_mr+0x2d5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x195f53,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x24(%rbp)
mov    -0x24(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
movabs $0x1f51f3fee3b,%rax
cmp    %rax,-0x10(%rbp)
jae    14d9 <is_prime_mr+0x3c9>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x25(%rbp)
je     14c9 <is_prime_mr+0x3b9>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x25(%rbp)
je     14c9 <is_prime_mr+0x3b9>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x25(%rbp)
je     14c9 <is_prime_mr+0x3b9>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x25(%rbp)
je     14c9 <is_prime_mr+0x3b9>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xb,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
movabs $0x32907381cdf,%rax
cmp    %rax,-0x10(%rbp)
jae    15e5 <is_prime_mr+0x4d5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x26(%rbp)
je     15d5 <is_prime_mr+0x4c5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x26(%rbp)
je     15d5 <is_prime_mr+0x4c5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x26(%rbp)
je     15d5 <is_prime_mr+0x4c5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x26(%rbp)
je     15d5 <is_prime_mr+0x4c5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xb,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x26(%rbp)
je     15d5 <is_prime_mr+0x4c5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xd,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x26(%rbp)
mov    -0x26(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1700 <is_prime_mr+0x5f0>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xb,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0xd,%ecx
call   1030 <witness@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x27(%rbp)
je     16f5 <is_prime_mr+0x5e5>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x11,%ecx
call   1030 <witness@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x27(%rbp)
mov    -0x27(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_prime_mr>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
test   $0x1,%r14b
sete   %al
xor    %ebp,%ebp
cmp    $0x2,%rdi
setne  %cl
jb     144a <is_prime_mr+0x33a>
and    %al,%cl
jne    144a <is_prime_mr+0x33a>
movabs $0xaaaaaaaaaaaaaaab,%rcx
aa aa aa
mov    %r14,%rax
mul    %rcx
cmp    $0x3,%r14
je     1161 <is_prime_mr+0x51>
shr    %rdx
lea    (%rdx,%rdx,2),%rax
mov    %r14,%rcx
sub    %rax,%rcx
je     144a <is_prime_mr+0x33a>
mov    $0x1,%ebp
cmp    $0x4,%r14
jb     144a <is_prime_mr+0x33a>
xor    %r15d,%r15d
mov    %r14,%rbx
cs nopw 0x0(%rax,%rax,1)
mov    %rbx,%rax
shr    %rbx
add    $0x1,%r15
test   $0x2,%al
je     1180 <is_prime_mr+0x70>
cmp    $0x14f5d4,%r14
ja     11ba <is_prime_mr+0xaa>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
mov    $0x3,%ecx
test   %rax,%rax
jne    1433 <is_prime_mr+0x323>
jmp    11e4 <is_prime_mr+0xd4>
cmp    $0x8a8d7e,%r14
ja     11eb <is_prime_mr+0xdb>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x1f,%ecx
call   1030 <witness@plt>
mov    $0x49,%ecx
test   %rax,%rax
jne    1433 <is_prime_mr+0x323>
xor    %ebp,%ebp
jmp    144a <is_prime_mr+0x33a>
movabs $0x11baa74c4,%rax
cmp    %rax,%r14
ja     1235 <is_prime_mr+0x125>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
xor    %ebp,%ebp
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    $0x3d,%ecx
jmp    142e <is_prime_mr+0x31e>
movabs $0x1053cb094c0,%rax
cmp    %rax,%r14
ja     129b <is_prime_mr+0x18b>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x2,%ecx
call   1030 <witness@plt>
xor    %ebp,%ebp
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0xd,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x17,%ecx
call   1030 <witness@plt>
mov    $0x195f53,%ecx
jmp    142e <is_prime_mr+0x31e>
movabs $0x1f51f3fee3a,%rax
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x2,%ecx
cmp    %rax,%r14
ja     131d <is_prime_mr+0x20d>
call   1030 <witness@plt>
xor    %ebp,%ebp
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
mov    $0xb,%ecx
jmp    142e <is_prime_mr+0x31e>
call   1030 <witness@plt>
movabs $0x32907381cde,%rcx
xor    %ebp,%ebp
cmp    %rcx,%r14
ja     13ad <is_prime_mr+0x29d>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0xb,%ecx
call   1030 <witness@plt>
mov    $0xd,%ecx
jmp    142e <is_prime_mr+0x31e>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x3,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x5,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x7,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0xb,%ecx
call   1030 <witness@plt>
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0xd,%ecx
call   1030 <witness@plt>
mov    $0x11,%ecx
test   %rax,%rax
je     144a <is_prime_mr+0x33a>
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
call   1030 <witness@plt>
xor    %ebp,%ebp
test   %rax,%rax
setne  %bpl
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @is_prime_mr(i64 %0) {
%2 = alloca i32
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
store i64 %0, i64* %3
%6 = load i64, i64* %3
%7 = and i64 %6, 1
%8 = icmp ne i64 %7, 0
br i1 %8, label %12, label %9
9: ; preds = %1
%10 = load i64, i64* %3
%11 = icmp ne i64 %10, 2
br i1 %11, label %22, label %12
12: ; preds = %9, %1
%13 = load i64, i64* %3
%14 = icmp ult i64 %13, 2
br i1 %14, label %22, label %15
15: ; preds = %12
%16 = load i64, i64* %3
%17 = urem i64 %16, 3
%18 = icmp eq i64 %17, 0
br i1 %18, label %19, label %23
19: ; preds = %15
%20 = load i64, i64* %3
%21 = icmp ne i64 %20, 3
br i1 %21, label %22, label %23
22: ; preds = %19, %12, %9
store i32 0, i32* %2
br label %253
23: ; preds = %19, %15
%24 = load i64, i64* %3
%25 = icmp ule i64 %24, 3
br i1 %25, label %26, label %27
26: ; preds = %23
store i32 1, i32* %2
br label %253
27: ; preds = %23
%28 = load i64, i64* %3
%29 = udiv i64 %28, 2
store i64 %29, i64* %4
store i64 1, i64* %5
br label %30
30: ; preds = %35, %27
%31 = load i64, i64* %4
%32 = and i64 %31, 1
%33 = icmp ne i64 %32, 0
%34 = xor i1 %33, true
br i1 %34, label %35, label %40
35: ; preds = %30
%36 = load i64, i64* %4
%37 = udiv i64 %36, 2
store i64 %37, i64* %4
%38 = load i64, i64* %5
%39 = add i64 %38, 1
store i64 %39, i64* %5
br label %30
40: ; preds = %30
%41 = load i64, i64* %3
%42 = icmp ult i64 %41, 1373653
br i1 %42, label %43, label %58
43: ; preds = %40
%44 = load i64, i64* %3
%45 = load i64, i64* %5
%46 = load i64, i64* %4
%47 = call i64 @witness(i64 %44, i64 %45, i64 %46, i32 2)
%48 = icmp ne i64 %47, 0
br i1 %48, label %49, label %55
49: ; preds = %43
%50 = load i64, i64* %3
%51 = load i64, i64* %5
%52 = load i64, i64* %4
%53 = call i64 @witness(i64 %50, i64 %51, i64 %52, i32 3)
%54 = icmp ne i64 %53, 0
br label %55
55: ; preds = %49, %43
%56 = phi i1 [ false, %43 ], [ %54, %49 ]
%57 = zext i1 %56 to i32
store i32 %57, i32* %2
br label %253
58: ; preds = %40
%59 = load i64, i64* %3
%60 = icmp ult i64 %59, 9080191
br i1 %60, label %61, label %76
61: ; preds = %58
%62 = load i64, i64* %3
%63 = load i64, i64* %5
%64 = load i64, i64* %4
%65 = call i64 @witness(i64 %62, i64 %63, i64 %64, i32 31)
%66 = icmp ne i64 %65, 0
br i1 %66, label %67, label %73
67: ; preds = %61
%68 = load i64, i64* %3
%69 = load i64, i64* %5
%70 = load i64, i64* %4
%71 = call i64 @witness(i64 %68, i64 %69, i64 %70, i32 73)
%72 = icmp ne i64 %71, 0
br label %73
73: ; preds = %67, %61
%74 = phi i1 [ false, %61 ], [ %72, %67 ]
%75 = zext i1 %74 to i32
store i32 %75, i32* %2
br label %253
76: ; preds = %58
%77 = load i64, i64* %3
%78 = icmp ult i64 %77, 4759123141
br i1 %78, label %79, label %100
79: ; preds = %76
%80 = load i64, i64* %3
%81 = load i64, i64* %5
%82 = load i64, i64* %4
%83 = call i64 @witness(i64 %80, i64 %81, i64 %82, i32 2)
%84 = icmp ne i64 %83, 0
br i1 %84, label %85, label %97
85: ; preds = %79
%86 = load i64, i64* %3
%87 = load i64, i64* %5
%88 = load i64, i64* %4
%89 = call i64 @witness(i64 %86, i64 %87, i64 %88, i32 7)
%90 = icmp ne i64 %89, 0
br i1 %90, label %91, label %97
91: ; preds = %85
%92 = load i64, i64* %3
%93 = load i64, i64* %5
%94 = load i64, i64* %4
%95 = call i64 @witness(i64 %92, i64 %93, i64 %94, i32 61)
%96 = icmp ne i64 %95, 0
br label %97
97: ; preds = %91, %85, %79
%98 = phi i1 [ false, %85 ], [ false, %79 ], [ %96, %91 ]
%99 = zext i1 %98 to i32
store i32 %99, i32* %2
br label %253
100: ; preds = %76
%101 = load i64, i64* %3
%102 = icmp ult i64 %101, 1122004669633
br i1 %102, label %103, label %130
103: ; preds = %100
%104 = load i64, i64* %3
%105 = load i64, i64* %5
%106 = load i64, i64* %4
%107 = call i64 @witness(i64 %104, i64 %105, i64 %106, i32 2)
%108 = icmp ne i64 %107, 0
br i1 %108, label %109, label %127
109: ; preds = %103
%110 = load i64, i64* %3
%111 = load i64, i64* %5
%112 = load i64, i64* %4
%113 = call i64 @witness(i64 %110, i64 %111, i64 %112, i32 13)
%114 = icmp ne i64 %113, 0
br i1 %114, label %115, label %127
115: ; preds = %109
%116 = load i64, i64* %3
%117 = load i64, i64* %5
%118 = load i64, i64* %4
%119 = call i64 @witness(i64 %116, i64 %117, i64 %118, i32 23)
%120 = icmp ne i64 %119, 0
br i1 %120, label %121, label %127
121: ; preds = %115
%122 = load i64, i64* %3
%123 = load i64, i64* %5
%124 = load i64, i64* %4
%125 = call i64 @witness(i64 %122, i64 %123, i64 %124, i32 1662803)
%126 = icmp ne i64 %125, 0
br label %127
127: ; preds = %121, %115, %109, %103
%128 = phi i1 [ false, %115 ], [ false, %109 ], [ false, %103 ], [ %126, %121 ]
%129 = zext i1 %128 to i32
store i32 %129, i32* %2
br label %253
130: ; preds = %100
%131 = load i64, i64* %3
%132 = icmp ult i64 %131, 2152302898747
br i1 %132, label %133, label %166
133: ; preds = %130
%134 = load i64, i64* %3
%135 = load i64, i64* %5
%136 = load i64, i64* %4
%137 = call i64 @witness(i64 %134, i64 %135, i64 %136, i32 2)
%138 = icmp ne i64 %137, 0
br i1 %138, label %139, label %163
139: ; preds = %133
%140 = load i64, i64* %3
%141 = load i64, i64* %5
%142 = load i64, i64* %4
%143 = call i64 @witness(i64 %140, i64 %141, i64 %142, i32 3)
%144 = icmp ne i64 %143, 0
br i1 %144, label %145, label %163
145: ; preds = %139
%146 = load i64, i64* %3
%147 = load i64, i64* %5
%148 = load i64, i64* %4
%149 = call i64 @witness(i64 %146, i64 %147, i64 %148, i32 5)
%150 = icmp ne i64 %149, 0
br i1 %150, label %151, label %163
151: ; preds = %145
%152 = load i64, i64* %3
%153 = load i64, i64* %5
%154 = load i64, i64* %4
%155 = call i64 @witness(i64 %152, i64 %153, i64 %154, i32 7)
%156 = icmp ne i64 %155, 0
br i1 %156, label %157, label %163
157: ; preds = %151
%158 = load i64, i64* %3
%159 = load i64, i64* %5
%160 = load i64, i64* %4
%161 = call i64 @witness(i64 %158, i64 %159, i64 %160, i32 11)
%162 = icmp ne i64 %161, 0
br label %163
163: ; preds = %157, %151, %145, %139, %133
%164 = phi i1 [ false, %151 ], [ false, %145 ], [ false, %139 ], [ false, %133 ], [ %162, %157 ]
%165 = zext i1 %164 to i32
store i32 %165, i32* %2
br label %253
166: ; preds = %130
%167 = load i64, i64* %3
%168 = icmp ult i64 %167, 3474749660383
br i1 %168, label %169, label %208
169: ; preds = %166
%170 = load i64, i64* %3
%171 = load i64, i64* %5
%172 = load i64, i64* %4
%173 = call i64 @witness(i64 %170, i64 %171, i64 %172, i32 2)
%174 = icmp ne i64 %173, 0
br i1 %174, label %175, label %205
175: ; preds = %169
%176 = load i64, i64* %3
%177 = load i64, i64* %5
%178 = load i64, i64* %4
%179 = call i64 @witness(i64 %176, i64 %177, i64 %178, i32 3)
%180 = icmp ne i64 %179, 0
br i1 %180, label %181, label %205
181: ; preds = %175
%182 = load i64, i64* %3
%183 = load i64, i64* %5
%184 = load i64, i64* %4
%185 = call i64 @witness(i64 %182, i64 %183, i64 %184, i32 5)
%186 = icmp ne i64 %185, 0
br i1 %186, label %187, label %205
187: ; preds = %181
%188 = load i64, i64* %3
%189 = load i64, i64* %5
%190 = load i64, i64* %4
%191 = call i64 @witness(i64 %188, i64 %189, i64 %190, i32 7)
%192 = icmp ne i64 %191, 0
br i1 %192, label %193, label %205
193: ; preds = %187
%194 = load i64, i64* %3
%195 = load i64, i64* %5
%196 = load i64, i64* %4
%197 = call i64 @witness(i64 %194, i64 %195, i64 %196, i32 11)
%198 = icmp ne i64 %197, 0
br i1 %198, label %199, label %205
199: ; preds = %193
%200 = load i64, i64* %3
%201 = load i64, i64* %5
%202 = load i64, i64* %4
%203 = call i64 @witness(i64 %200, i64 %201, i64 %202, i32 13)
%204 = icmp ne i64 %203, 0
br label %205
205: ; preds = %199, %193, %187, %181, %175, %169
%206 = phi i1 [ false, %193 ], [ false, %187 ], [ false, %181 ], [ false, %175 ], [ false, %169 ], [ %204, %199 ]
%207 = zext i1 %206 to i32
store i32 %207, i32* %2
br label %253
208: ; preds = %166
%209 = load i64, i64* %3
%210 = load i64, i64* %5
%211 = load i64, i64* %4
%212 = call i64 @witness(i64 %209, i64 %210, i64 %211, i32 2)
%213 = icmp ne i64 %212, 0
br i1 %213, label %214, label %250
214: ; preds = %208
%215 = load i64, i64* %3
%216 = load i64, i64* %5
%217 = load i64, i64* %4
%218 = call i64 @witness(i64 %215, i64 %216, i64 %217, i32 3)
%219 = icmp ne i64 %218, 0
br i1 %219, label %220, label %250
220: ; preds = %214
%221 = load i64, i64* %3
%222 = load i64, i64* %5
%223 = load i64, i64* %4
%224 = call i64 @witness(i64 %221, i64 %222, i64 %223, i32 5)
%225 = icmp ne i64 %224, 0
br i1 %225, label %226, label %250
226: ; preds = %220
%227 = load i64, i64* %3
%228 = load i64, i64* %5
%229 = load i64, i64* %4
%230 = call i64 @witness(i64 %227, i64 %228, i64 %229, i32 7)
%231 = icmp ne i64 %230, 0
br i1 %231, label %232, label %250
232: ; preds = %226
%233 = load i64, i64* %3
%234 = load i64, i64* %5
%235 = load i64, i64* %4
%236 = call i64 @witness(i64 %233, i64 %234, i64 %235, i32 11)
%237 = icmp ne i64 %236, 0
br i1 %237, label %238, label %250
238: ; preds = %232
%239 = load i64, i64* %3
%240 = load i64, i64* %5
%241 = load i64, i64* %4
%242 = call i64 @witness(i64 %239, i64 %240, i64 %241, i32 13)
%243 = icmp ne i64 %242, 0
br i1 %243, label %244, label %250
244: ; preds = %238
%245 = load i64, i64* %3
%246 = load i64, i64* %5
%247 = load i64, i64* %4
%248 = call i64 @witness(i64 %245, i64 %246, i64 %247, i32 17)
%249 = icmp ne i64 %248, 0
br label %250
250: ; preds = %244, %238, %232, %226, %220, %214, %208
%251 = phi i1 [ false, %238 ], [ false, %232 ], [ false, %226 ], [ false, %220 ], [ false, %214 ], [ false, %208 ], [ %249, %244 ]
%252 = zext i1 %251 to i32
store i32 %252, i32* %2
br label %253
253: ; preds = %250, %205, %163, %127, %97, %73, %55, %26, %22
%254 = load i32, i32* %2
ret i32 %254
}

LLVM IR (-O2):
define i32 @is_prime_mr(i64 %0) {
%2 = and i64 %0, 1
%3 = icmp eq i64 %2, 0
%4 = icmp ne i64 %0, 2
%5 = and i1 %4, %3
%6 = icmp ult i64 %0, 2
%7 = or i1 %6, %5
br i1 %7, label %103, label %8
8: ; preds = %1
%9 = urem i64 %0, 3
%10 = icmp eq i64 %9, 0
%11 = icmp ne i64 %0, 3
%12 = and i1 %11, %10
br i1 %12, label %103, label %13
13: ; preds = %8
%14 = icmp ult i64 %0, 4
br i1 %14, label %103, label %15
15: ; preds = %13, %15
%16 = phi i64 [ %18, %15 ], [ %0, %13 ]
%17 = phi i64 [ %21, %15 ], [ 1, %13 ]
%18 = lshr i64 %16, 1
%19 = and i64 %16, 2
%20 = icmp eq i64 %19, 0
%21 = add i64 %17, 1
br i1 %20, label %15, label %22
22: ; preds = %15
%23 = icmp ult i64 %0, 1373653
br i1 %23, label %24, label %27
24: ; preds = %22
%25 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 2)
%26 = icmp eq i64 %25, 0
br i1 %26, label %103, label %98
27: ; preds = %22
%28 = icmp ult i64 %0, 9080191
br i1 %28, label %29, label %32
29: ; preds = %27
%30 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 31)
%31 = icmp eq i64 %30, 0
br i1 %31, label %103, label %98
32: ; preds = %27
%33 = icmp ult i64 %0, 4759123141
br i1 %33, label %34, label %40
34: ; preds = %32
%35 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 2)
%36 = icmp eq i64 %35, 0
br i1 %36, label %103, label %37
37: ; preds = %34
%38 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 7)
%39 = icmp eq i64 %38, 0
br i1 %39, label %103, label %98
40: ; preds = %32
%41 = icmp ult i64 %0, 1122004669633
br i1 %41, label %42, label %51
42: ; preds = %40
%43 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 2)
%44 = icmp eq i64 %43, 0
br i1 %44, label %103, label %45
45: ; preds = %42
%46 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 13)
%47 = icmp eq i64 %46, 0
br i1 %47, label %103, label %48
48: ; preds = %45
%49 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 23)
%50 = icmp eq i64 %49, 0
br i1 %50, label %103, label %98
51: ; preds = %40
%52 = icmp ult i64 %0, 2152302898747
br i1 %52, label %53, label %65
53: ; preds = %51
%54 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 2)
%55 = icmp eq i64 %54, 0
br i1 %55, label %103, label %56
56: ; preds = %53
%57 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 3)
%58 = icmp eq i64 %57, 0
br i1 %58, label %103, label %59
59: ; preds = %56
%60 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 5)
%61 = icmp eq i64 %60, 0
br i1 %61, label %103, label %62
62: ; preds = %59
%63 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 7)
%64 = icmp eq i64 %63, 0
br i1 %64, label %103, label %98
65: ; preds = %51
%66 = icmp ult i64 %0, 3474749660383
%67 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 2)
%68 = icmp eq i64 %67, 0
br i1 %66, label %69, label %82
69: ; preds = %65
br i1 %68, label %103, label %70
70: ; preds = %69
%71 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 3)
%72 = icmp eq i64 %71, 0
br i1 %72, label %103, label %73
73: ; preds = %70
%74 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 5)
%75 = icmp eq i64 %74, 0
br i1 %75, label %103, label %76
76: ; preds = %73
%77 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 7)
%78 = icmp eq i64 %77, 0
br i1 %78, label %103, label %79
79: ; preds = %76
%80 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 11)
%81 = icmp eq i64 %80, 0
br i1 %81, label %103, label %98
82: ; preds = %65
br i1 %68, label %103, label %83
83: ; preds = %82
%84 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 3)
%85 = icmp eq i64 %84, 0
br i1 %85, label %103, label %86
86: ; preds = %83
%87 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 5)
%88 = icmp eq i64 %87, 0
br i1 %88, label %103, label %89
89: ; preds = %86
%90 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 7)
%91 = icmp eq i64 %90, 0
br i1 %91, label %103, label %92
92: ; preds = %89
%93 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 11)
%94 = icmp eq i64 %93, 0
br i1 %94, label %103, label %95
95: ; preds = %92
%96 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 13)
%97 = icmp eq i64 %96, 0
br i1 %97, label %103, label %98
98: ; preds = %95, %79, %62, %48, %37, %29, %24
%99 = phi i32 [ 3, %24 ], [ 73, %29 ], [ 61, %37 ], [ 1662803, %48 ], [ 11, %62 ], [ 13, %79 ], [ 17, %95 ]
%100 = tail call i64 @witness(i64 %0, i64 %17, i64 %18, i32 %99)
%101 = icmp ne i64 %100, 0
%102 = zext i1 %101 to i32
br label %103
103: ; preds = %98, %24, %29, %37, %34, %48, %45, %42, %62, %59, %56, %53, %79, %76, %73, %70, %69, %95, %92, %89, %86, %83, %82, %13, %1, %8
%104 = phi i32 [ 0, %8 ], [ 0, %1 ], [ 1, %13 ], [ 0, %24 ], [ 0, %29 ], [ 0, %37 ], [ 0, %34 ], [ 0, %48 ], [ 0, %45 ], [ 0, %42 ], [ 0, %62 ], [ 0, %59 ], [ 0, %56 ], [ 0, %53 ], [ 0, %79 ], [ 0, %76 ], [ 0, %73 ], [ 0, %70 ], [ 0, %69 ], [ 0, %95 ], [ 0, %92 ], [ 0, %89 ], [ 0, %86 ], [ 0, %83 ], [ 0, %82 ], [ %102, %98 ]
ret i32 %104
}