void proc(unsigned char l[100][100][3], int start, int end, int c1, int c2,
          int n, int m) {
  if (0 == n % 2 && 0 == m % 2) {
    l[start][end][c1] = 2;
    l[start][end][c2] = 2;
  } else {
    if (1 == n % 2) {
      if (0 == m % 2) {
        l[start][end][c1] = 1;
      } else {
        l[start][end][3 - c1 - c2] = 1;
      }
    }
    if (1 == m % 2) {
      if (0 == n % 2) {
        l[start][end][c2] = 1;
      } else {
        l[start][end][3 - c1 - c2] = 1;
      }
    }
  }
}


x86 assembly (clang, -O0):
<proc>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
xor    %eax,%eax
cmp    %edx,%eax
jne    1195 <proc+0x95>
mov    0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
xor    %eax,%eax
cmp    %edx,%eax
jne    1195 <proc+0x95>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movslq -0x14(%rbp),%rcx
movb   $0x2,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movb   $0x2,(%rax,%rcx,1)
jmp    12b0 <proc+0x1b0>
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    $0x1,%eax
cmp    %edx,%eax
jne    1220 <proc+0x120>
mov    0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
xor    %eax,%eax
cmp    %edx,%eax
jne    11ec <proc+0xec>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movslq -0x14(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
jmp    121b <proc+0x11b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    $0x3,%ecx
sub    -0x14(%rbp),%ecx
sub    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x1,(%rax,%rcx,1)
jmp    1220 <proc+0x120>
mov    0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    $0x1,%eax
cmp    %edx,%eax
jne    12ab <proc+0x1ab>
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
xor    %eax,%eax
cmp    %edx,%eax
jne    1277 <proc+0x177>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
jmp    12a6 <proc+0x1a6>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x12c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
imul   $0x3,%rcx,%rcx
add    %rcx,%rax
mov    $0x3,%ecx
sub    -0x14(%rbp),%ecx
sub    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x1,(%rax,%rcx,1)
jmp    12ab <proc+0x1ab>
jmp    12b0 <proc+0x1b0>
pop    %rbp
ret

x86 assembly (clang, -O2):
<proc>:
push   %r14
push   %rbx
mov    0x18(%rsp),%r10d
mov    %r9d,%eax
shr    $0x1f,%eax
add    %r9d,%eax
and    $0xfffffffe,%eax
sub    %eax,%r9d
mov    %r10d,%r11d
and    $0x1,%r11d
mov    %r11d,%eax
or     %r9d,%eax
je     1182 <proc+0x82>
movslq %esi,%rsi
movslq %edx,%r14
cmp    $0x1,%r9d
jne    115a <proc+0x5a>
mov    $0x3,%ebx
sub    %ecx,%ebx
sub    %r8d,%ebx
test   %r11d,%r11d
cmove  %ecx,%ebx
movslq %ebx,%rax
imul   $0x12c,%rsi,%rbx
add    %rdi,%rbx
lea    (%r14,%r14,2),%rdx
add    %rbx,%rdx
movb   $0x1,(%rax,%rdx,1)
mov    %r10d,%eax
shr    $0x1f,%eax
add    %r10d,%eax
and    $0xfffffffe,%eax
sub    %eax,%r10d
cmp    $0x1,%r10d
jne    11c1 <proc+0xc1>
test   %r9d,%r9d
je     11a9 <proc+0xa9>
add    %r8d,%ecx
mov    $0x3,%eax
sub    %ecx,%eax
cltq
jmp    11ac <proc+0xac>
movslq %esi,%rax
movslq %edx,%rdx
movslq %ecx,%rcx
imul   $0x12c,%rax,%rax
add    %rax,%rdi
lea    (%rdx,%rdx,2),%rax
add    %rdi,%rax
movb   $0x2,(%rcx,%rax,1)
movslq %r8d,%rcx
movb   $0x2,(%rcx,%rax,1)
jmp    11c1 <proc+0xc1>
movslq %r8d,%rax
imul   $0x12c,%rsi,%rcx
add    %rcx,%rdi
lea    (%r14,%r14,2),%rcx
add    %rdi,%rcx
movb   $0x1,(%rax,%rcx,1)
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @proc([100 x [3 x i8]]* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = alloca [100 x [3 x i8]]*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store [100 x [3 x i8]]* %0, [100 x [3 x i8]]** %8
store i32 %1, i32* %9
store i32 %2, i32* %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32 %5, i32* %13
store i32 %6, i32* %14
%15 = load i32, i32* %13
%16 = srem i32 %15, 2
%17 = icmp eq i32 0, %16
br i1 %17, label %18, label %43
18: ; preds = %7
%19 = load i32, i32* %14
%20 = srem i32 %19, 2
%21 = icmp eq i32 0, %20
br i1 %21, label %22, label %43
22: ; preds = %18
%23 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %23, i64 %25
%27 = load i32, i32* %10
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %26, i64 0, i64 %28
%30 = load i32, i32* %11
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [3 x i8], [3 x i8]* %29, i64 0, i64 %31
store i8 2, i8* %32
%33 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%34 = load i32, i32* %9
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %33, i64 %35
%37 = load i32, i32* %10
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %36, i64 0, i64 %38
%40 = load i32, i32* %12
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [3 x i8], [3 x i8]* %39, i64 0, i64 %41
store i8 2, i8* %42
br label %112
43: ; preds = %18, %7
%44 = load i32, i32* %13
%45 = srem i32 %44, 2
%46 = icmp eq i32 1, %45
br i1 %46, label %47, label %77
47: ; preds = %43
%48 = load i32, i32* %14
%49 = srem i32 %48, 2
%50 = icmp eq i32 0, %49
br i1 %50, label %51, label %62
51: ; preds = %47
%52 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%53 = load i32, i32* %9
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %52, i64 %54
%56 = load i32, i32* %10
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %55, i64 0, i64 %57
%59 = load i32, i32* %11
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds [3 x i8], [3 x i8]* %58, i64 0, i64 %60
store i8 1, i8* %61
br label %76
62: ; preds = %47
%63 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%64 = load i32, i32* %9
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %63, i64 %65
%67 = load i32, i32* %10
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %66, i64 0, i64 %68
%70 = load i32, i32* %11
%71 = sub nsw i32 3, %70
%72 = load i32, i32* %12
%73 = sub nsw i32 %71, %72
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds [3 x i8], [3 x i8]* %69, i64 0, i64 %74
store i8 1, i8* %75
br label %76
76: ; preds = %62, %51
br label %77
77: ; preds = %76, %43
%78 = load i32, i32* %14
%79 = srem i32 %78, 2
%80 = icmp eq i32 1, %79
br i1 %80, label %81, label %111
81: ; preds = %77
%82 = load i32, i32* %13
%83 = srem i32 %82, 2
%84 = icmp eq i32 0, %83
br i1 %84, label %85, label %96
85: ; preds = %81
%86 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%87 = load i32, i32* %9
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %86, i64 %88
%90 = load i32, i32* %10
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %89, i64 0, i64 %91
%93 = load i32, i32* %12
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds [3 x i8], [3 x i8]* %92, i64 0, i64 %94
store i8 1, i8* %95
br label %110
96: ; preds = %81
%97 = load [100 x [3 x i8]]*, [100 x [3 x i8]]** %8
%98 = load i32, i32* %9
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %97, i64 %99
%101 = load i32, i32* %10
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %100, i64 0, i64 %102
%104 = load i32, i32* %11
%105 = sub nsw i32 3, %104
%106 = load i32, i32* %12
%107 = sub nsw i32 %105, %106
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds [3 x i8], [3 x i8]* %103, i64 0, i64 %108
store i8 1, i8* %109
br label %110
110: ; preds = %96, %85
br label %111
111: ; preds = %110, %77
br label %112
112: ; preds = %111, %22
ret void
}

LLVM IR (-O2):
define void @proc([100 x [3 x i8]]* nocapture writeonly %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = srem i32 %5, 2
%9 = icmp eq i32 %8, 0
%10 = and i32 %6, 1
%11 = icmp eq i32 %10, 0
%12 = or i32 %10, %8
%13 = icmp eq i32 %12, 0
br i1 %13, label %14, label %21
14: ; preds = %7
%15 = sext i32 %1 to i64
%16 = sext i32 %2 to i64
%17 = sext i32 %3 to i64
%18 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %0, i64 %15, i64 %16, i64 %17
store i8 2, i8* %18
%19 = sext i32 %4 to i64
%20 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %0, i64 %15, i64 %16, i64 %19
store i8 2, i8* %20
br label %45
21: ; preds = %7
%22 = icmp eq i32 %8, 1
br i1 %22, label %23, label %31
23: ; preds = %21
%24 = sext i32 %1 to i64
%25 = sext i32 %2 to i64
%26 = add i32 %3, %4
%27 = sub i32 3, %26
%28 = select i1 %11, i32 %3, i32 %27
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %0, i64 %24, i64 %25, i64 %29
store i8 1, i8* %30
br label %31
31: ; preds = %23, %21
%32 = srem i32 %6, 2
%33 = icmp eq i32 %32, 1
br i1 %33, label %34, label %45
34: ; preds = %31
%35 = sext i32 %1 to i64
%36 = sext i32 %2 to i64
br i1 %9, label %37, label %40
37: ; preds = %34
%38 = sext i32 %4 to i64
%39 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %0, i64 %35, i64 %36, i64 %38
store i8 1, i8* %39
br label %45
40: ; preds = %34
%41 = add i32 %3, %4
%42 = sub i32 3, %41
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds [100 x [3 x i8]], [100 x [3 x i8]]* %0, i64 %35, i64 %36, i64 %43
store i8 1, i8* %44
br label %45
45: ; preds = %31, %40, %37, %14
ret void
}