int divca(unsigned int i, unsigned int j) {
  i %= 20;
  j %= 20;
  if (i >= 7 && i <= 12 && j >= 7 && j <= 12) {
    return 0;
  }
  if (i >= 4 && i <= 15 && j >= 4 && j <= 15) {
    return 1;
  }
  if (i >= 2 && i <= 17 && j >= 2 && j <= 17) {
    return 2;
  }
  return 3;
}


x86 assembly (clang, -O0):
<divca>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%eax
mov    $0x14,%ecx
xor    %edx,%edx
div    %ecx
mov    %edx,-0x8(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x14,%ecx
xor    %edx,%edx
div    %ecx
mov    %edx,-0xc(%rbp)
cmpl   $0x7,-0x8(%rbp)
jb     115c <divca+0x5c>
cmpl   $0xc,-0x8(%rbp)
ja     115c <divca+0x5c>
cmpl   $0x7,-0xc(%rbp)
jb     115c <divca+0x5c>
cmpl   $0xc,-0xc(%rbp)
ja     115c <divca+0x5c>
movl   $0x0,-0x4(%rbp)
jmp    11cb <divca+0xcb>
cmpl   $0x4,-0x8(%rbp)
jb     1190 <divca+0x90>
cmpl   $0xf,-0x8(%rbp)
ja     1190 <divca+0x90>
cmpl   $0x4,-0xc(%rbp)
jb     1190 <divca+0x90>
cmpl   $0xf,-0xc(%rbp)
ja     1190 <divca+0x90>
movl   $0x1,-0x4(%rbp)
jmp    11cb <divca+0xcb>
cmpl   $0x2,-0x8(%rbp)
jb     11c4 <divca+0xc4>
cmpl   $0x11,-0x8(%rbp)
ja     11c4 <divca+0xc4>
cmpl   $0x2,-0xc(%rbp)
jb     11c4 <divca+0xc4>
cmpl   $0x11,-0xc(%rbp)
ja     11c4 <divca+0xc4>
movl   $0x2,-0x4(%rbp)
jmp    11cb <divca+0xcb>
movl   $0x3,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<divca>:
mov    %edi,%eax
mov    $0xcccccccd,%edx
imul   %rdx,%rax
shr    $0x24,%rax
shl    $0x2,%eax
lea    (%rax,%rax,4),%r8d
mov    %esi,%eax
imul   %rdx,%rax
shr    $0x24,%rax
shl    $0x2,%eax
lea    (%rax,%rax,4),%edx
mov    %r8d,%eax
neg    %eax
add    %edi,%eax
add    $0xfffffff9,%eax
cmp    $0x5,%eax
ja     1146 <divca+0x46>
mov    %edx,%ecx
neg    %ecx
xor    %eax,%eax
add    %esi,%ecx
add    $0xfffffff9,%ecx
cmp    $0x6,%ecx
jae    1146 <divca+0x46>
ret
sub    %r8d,%edi
sub    %edx,%esi
lea    -0x4(%rdi),%eax
cmp    $0xb,%eax
ja     1160 <divca+0x60>
lea    -0x4(%rsi),%ecx
mov    $0x1,%eax
cmp    $0xc,%ecx
jb     1145 <divca+0x45>
add    $0xfffffffe,%edi
add    $0xfffffffe,%esi
or     %edi,%esi
cmp    $0x10,%esi
mov    $0x3,%eax
sbb    $0x0,%eax
ret

LLVM IR (-O0):
define i32 @divca(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
%6 = load i32, i32* %4
%7 = urem i32 %6, 20
store i32 %7, i32* %4
%8 = load i32, i32* %5
%9 = urem i32 %8, 20
store i32 %9, i32* %5
%10 = load i32, i32* %4
%11 = icmp uge i32 %10, 7
br i1 %11, label %12, label %22
12: ; preds = %2
%13 = load i32, i32* %4
%14 = icmp ule i32 %13, 12
br i1 %14, label %15, label %22
15: ; preds = %12
%16 = load i32, i32* %5
%17 = icmp uge i32 %16, 7
br i1 %17, label %18, label %22
18: ; preds = %15
%19 = load i32, i32* %5
%20 = icmp ule i32 %19, 12
br i1 %20, label %21, label %22
21: ; preds = %18
store i32 0, i32* %3
br label %49
22: ; preds = %18, %15, %12, %2
%23 = load i32, i32* %4
%24 = icmp uge i32 %23, 4
br i1 %24, label %25, label %35
25: ; preds = %22
%26 = load i32, i32* %4
%27 = icmp ule i32 %26, 15
br i1 %27, label %28, label %35
28: ; preds = %25
%29 = load i32, i32* %5
%30 = icmp uge i32 %29, 4
br i1 %30, label %31, label %35
31: ; preds = %28
%32 = load i32, i32* %5
%33 = icmp ule i32 %32, 15
br i1 %33, label %34, label %35
34: ; preds = %31
store i32 1, i32* %3
br label %49
35: ; preds = %31, %28, %25, %22
%36 = load i32, i32* %4
%37 = icmp uge i32 %36, 2
br i1 %37, label %38, label %48
38: ; preds = %35
%39 = load i32, i32* %4
%40 = icmp ule i32 %39, 17
br i1 %40, label %41, label %48
41: ; preds = %38
%42 = load i32, i32* %5
%43 = icmp uge i32 %42, 2
br i1 %43, label %44, label %48
44: ; preds = %41
%45 = load i32, i32* %5
%46 = icmp ule i32 %45, 17
br i1 %46, label %47, label %48
47: ; preds = %44
store i32 2, i32* %3
br label %49
48: ; preds = %44, %41, %38, %35
store i32 3, i32* %3
br label %49
49: ; preds = %48, %47, %34, %21
%50 = load i32, i32* %3
ret i32 %50
}

LLVM IR (-O2):
define i32 @divca(i32 %0, i32 %1) {
%3 = urem i32 %0, 20
%4 = urem i32 %1, 20
%5 = add nsw i32 %3, -7
%6 = icmp ult i32 %5, 6
%7 = add nsw i32 %4, -7
%8 = icmp ult i32 %7, 6
%9 = and i1 %6, %8
br i1 %9, label %22, label %10
10: ; preds = %2
%11 = add nsw i32 %3, -4
%12 = icmp ult i32 %11, 12
%13 = add nsw i32 %4, -4
%14 = icmp ult i32 %13, 12
%15 = and i1 %12, %14
br i1 %15, label %22, label %16
16: ; preds = %10
%17 = add nsw i32 %3, -2
%18 = add nsw i32 %4, -2
%19 = or i32 %18, %17
%20 = icmp ult i32 %19, 16
%21 = select i1 %20, i32 2, i32 3
br label %22
22: ; preds = %16, %10, %2
%23 = phi i32 [ 0, %2 ], [ 1, %10 ], [ %21, %16 ]
ret i32 %23
}