#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 int32_t;

/* Variables and functions */
int32_t suivant_zigzag(int32_t *i, int32_t *j) {
  if ((*i + *j) % 2 == 0) {
    if (*i == 0) {
      if (*j != 3) {
        (*j)++;
      } else {
        (*i)++;
      }
    } else if (*j == 3) {
      (*i)++;
    } else {
      (*j)++;
      (*i)--;
    }
  } else {
    if (*j == 0) {
      if (*i != 3) {
        (*i)++;
      } else {
        (*j)++;
      }
    } else if (*i == 3) {
      (*j)++;
    } else {
      (*j)--;
      (*i)++;
    }
  }
  return (4 * (*i) + *j);
}


x86 assembly (clang, -O0):
<suivant_zigzag>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
add    (%rcx),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    11a0 <suivant_zigzag+0xa0>
mov    -0x8(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1163 <suivant_zigzag+0x63>
mov    -0x10(%rbp),%rax
cmpl   $0x3,(%rax)
je     1153 <suivant_zigzag+0x53>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    115e <suivant_zigzag+0x5e>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    119b <suivant_zigzag+0x9b>
mov    -0x10(%rbp),%rax
cmpl   $0x3,(%rax)
jne    1180 <suivant_zigzag+0x80>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1196 <suivant_zigzag+0x96>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0xffffffff,%ecx
mov    %ecx,(%rax)
jmp    119b <suivant_zigzag+0x9b>
jmp    1217 <suivant_zigzag+0x117>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    11da <suivant_zigzag+0xda>
mov    -0x8(%rbp),%rax
cmpl   $0x3,(%rax)
je     11ca <suivant_zigzag+0xca>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    11d5 <suivant_zigzag+0xd5>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1212 <suivant_zigzag+0x112>
mov    -0x8(%rbp),%rax
cmpl   $0x3,(%rax)
jne    11f7 <suivant_zigzag+0xf7>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    120d <suivant_zigzag+0x10d>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0xffffffff,%ecx
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1212 <suivant_zigzag+0x112>
jmp    1217 <suivant_zigzag+0x117>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
shl    $0x2,%eax
mov    -0x10(%rbp),%rcx
add    (%rcx),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<suivant_zigzag>:
mov    (%rdi),%ecx
mov    (%rsi),%eax
lea    (%rax,%rcx,1),%edx
test   $0x1,%dl
jne    111f <suivant_zigzag+0x1f>
test   %ecx,%ecx
je     1132 <suivant_zigzag+0x32>
cmp    $0x3,%eax
je     1153 <suivant_zigzag+0x53>
add    $0x1,%eax
mov    %eax,(%rsi)
addl   $0xffffffff,(%rdi)
jmp    1158 <suivant_zigzag+0x58>
test   %eax,%eax
je     1146 <suivant_zigzag+0x46>
cmp    $0x3,%ecx
je     113f <suivant_zigzag+0x3f>
add    $0xffffffff,%eax
mov    %eax,(%rsi)
addl   $0x1,(%rdi)
jmp    1158 <suivant_zigzag+0x58>
cmp    $0x3,%eax
jne    113f <suivant_zigzag+0x3f>
movl   $0x1,(%rdi)
jmp    1158 <suivant_zigzag+0x58>
add    $0x1,%eax
mov    %eax,(%rsi)
jmp    1158 <suivant_zigzag+0x58>
cmp    $0x3,%ecx
jne    1153 <suivant_zigzag+0x53>
movl   $0x1,(%rsi)
jmp    1158 <suivant_zigzag+0x58>
add    $0x1,%ecx
mov    %ecx,(%rdi)
mov    (%rdi),%eax
shl    $0x2,%eax
add    (%rsi),%eax
ret

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

LLVM IR (-O2):
define i32 @suivant_zigzag(i32* nocapture %0, i32* nocapture %1) {
%3 = load i32, i32* %0
%4 = load i32, i32* %1
%5 = add nsw i32 %4, %3
%6 = and i32 %5, 1
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %22
8: ; preds = %2
%9 = icmp eq i32 %3, 0
%10 = icmp eq i32 %4, 3
br i1 %9, label %11, label %15
11: ; preds = %8
br i1 %10, label %14, label %12
12: ; preds = %11
%13 = add nsw i32 %4, 1
store i32 %13, i32* %1
br label %36
14: ; preds = %11
store i32 1, i32* %0
br label %36
15: ; preds = %8
br i1 %10, label %16, label %18
16: ; preds = %15
%17 = add nsw i32 %3, 1
store i32 %17, i32* %0
br label %36
18: ; preds = %15
%19 = add nsw i32 %4, 1
store i32 %19, i32* %1
%20 = load i32, i32* %0
%21 = add nsw i32 %20, -1
store i32 %21, i32* %0
br label %36
22: ; preds = %2
%23 = icmp eq i32 %4, 0
%24 = icmp eq i32 %3, 3
br i1 %23, label %25, label %29
25: ; preds = %22
br i1 %24, label %28, label %26
26: ; preds = %25
%27 = add nsw i32 %3, 1
store i32 %27, i32* %0
br label %36
28: ; preds = %25
store i32 1, i32* %1
br label %36
29: ; preds = %22
br i1 %24, label %30, label %32
30: ; preds = %29
%31 = add nsw i32 %4, 1
store i32 %31, i32* %1
br label %36
32: ; preds = %29
%33 = add nsw i32 %4, -1
store i32 %33, i32* %1
%34 = load i32, i32* %0
%35 = add nsw i32 %34, 1
store i32 %35, i32* %0
br label %36
36: ; preds = %28, %26, %32, %30, %14, %12, %18, %16
%37 = load i32, i32* %0
%38 = shl nsw i32 %37, 2
%39 = load i32, i32* %1
%40 = add nsw i32 %38, %39
ret i32 %40
}