#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 */
int /*<<< orphan*/ abort();
int /*<<< orphan*/ link_error();
int foo_div(int i, int j) {
  int k;
  if (i <= -1)
    if (j >= 1) {
      k = i / j;
      if (k == -1)
        abort();
      return k;
    }
  if (i >= -20)
    if (i <= -10)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < -10)
            link_error();
          if (k > -1)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= -10)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k < 1)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= 10)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < -10)
            link_error();
          if (k > 5)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= 10)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k < -5)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= 10)
    if (i <= 20)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < 1)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= 10)
    if (i <= 20)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k > -1)
            link_error();
          if (k < -10)
            link_error();
          return k;
        }
  abort();
}


x86 assembly (clang, -O0):
<foo_div>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0xffffffff,-0x8(%rbp)
jg     116d <foo_div+0x4d>
cmpl   $0x1,-0xc(%rbp)
jl     1168 <foo_div+0x48>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0xffffffff,-0x10(%rbp)
jne    115d <foo_div+0x3d>
mov    $0x0,%al
call   1030 <abort@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    116d <foo_div+0x4d>
cmpl   $0xffffffec,-0x8(%rbp)
jl     11db <foo_div+0xbb>
cmpl   $0xfffffff6,-0x8(%rbp)
jg     11d6 <foo_div+0xb6>
cmpl   $0x2,-0xc(%rbp)
jl     11d1 <foo_div+0xb1>
cmpl   $0xa,-0xc(%rbp)
jg     11cc <foo_div+0xac>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0xfffffff6,-0x10(%rbp)
jge    11b0 <foo_div+0x90>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0xffffffff,-0x10(%rbp)
jle    11c1 <foo_div+0xa1>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    11d1 <foo_div+0xb1>
jmp    11d6 <foo_div+0xb6>
jmp    11db <foo_div+0xbb>
cmpl   $0xffffffec,-0x8(%rbp)
jl     1249 <foo_div+0x129>
cmpl   $0xfffffff6,-0x8(%rbp)
jg     1244 <foo_div+0x124>
cmpl   $0xfffffff6,-0xc(%rbp)
jl     123f <foo_div+0x11f>
cmpl   $0xfffffffe,-0xc(%rbp)
jg     123a <foo_div+0x11a>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0x1,-0x10(%rbp)
jge    121e <foo_div+0xfe>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0xa,-0x10(%rbp)
jle    122f <foo_div+0x10f>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    123f <foo_div+0x11f>
jmp    1244 <foo_div+0x124>
jmp    1249 <foo_div+0x129>
cmpl   $0xffffffec,-0x8(%rbp)
jl     12b7 <foo_div+0x197>
cmpl   $0xa,-0x8(%rbp)
jg     12b2 <foo_div+0x192>
cmpl   $0x2,-0xc(%rbp)
jl     12ad <foo_div+0x18d>
cmpl   $0xa,-0xc(%rbp)
jg     12a8 <foo_div+0x188>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0xfffffff6,-0x10(%rbp)
jge    128c <foo_div+0x16c>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0x5,-0x10(%rbp)
jle    129d <foo_div+0x17d>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    12ad <foo_div+0x18d>
jmp    12b2 <foo_div+0x192>
jmp    12b7 <foo_div+0x197>
cmpl   $0xffffffec,-0x8(%rbp)
jl     1325 <foo_div+0x205>
cmpl   $0xa,-0x8(%rbp)
jg     1320 <foo_div+0x200>
cmpl   $0xfffffff6,-0xc(%rbp)
jl     131b <foo_div+0x1fb>
cmpl   $0xfffffffe,-0xc(%rbp)
jg     1316 <foo_div+0x1f6>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0xfffffffb,-0x10(%rbp)
jge    12fa <foo_div+0x1da>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0xa,-0x10(%rbp)
jle    130b <foo_div+0x1eb>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    131b <foo_div+0x1fb>
jmp    1320 <foo_div+0x200>
jmp    1325 <foo_div+0x205>
cmpl   $0xa,-0x8(%rbp)
jl     1393 <foo_div+0x273>
cmpl   $0x14,-0x8(%rbp)
jg     138e <foo_div+0x26e>
cmpl   $0x2,-0xc(%rbp)
jl     1389 <foo_div+0x269>
cmpl   $0xa,-0xc(%rbp)
jg     1384 <foo_div+0x264>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0x1,-0x10(%rbp)
jge    1368 <foo_div+0x248>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0xa,-0x10(%rbp)
jle    1379 <foo_div+0x259>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    1389 <foo_div+0x269>
jmp    138e <foo_div+0x26e>
jmp    1393 <foo_div+0x273>
cmpl   $0xa,-0x8(%rbp)
jl     1401 <foo_div+0x2e1>
cmpl   $0x14,-0x8(%rbp)
jg     13fc <foo_div+0x2dc>
cmpl   $0xfffffff6,-0xc(%rbp)
jl     13f7 <foo_div+0x2d7>
cmpl   $0xfffffffe,-0xc(%rbp)
jg     13f2 <foo_div+0x2d2>
mov    -0x8(%rbp),%eax
cltd
idivl  -0xc(%rbp)
mov    %eax,-0x10(%rbp)
cmpl   $0xffffffff,-0x10(%rbp)
jle    13d6 <foo_div+0x2b6>
mov    $0x0,%al
call   1040 <link_error@plt>
cmpl   $0xfffffff6,-0x10(%rbp)
jge    13e7 <foo_div+0x2c7>
mov    $0x0,%al
call   1040 <link_error@plt>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1408 <foo_div+0x2e8>
jmp    13f7 <foo_div+0x2d7>
jmp    13fc <foo_div+0x2dc>
jmp    1401 <foo_div+0x2e1>
mov    $0x0,%al
call   1030 <abort@plt>
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo_div>:
push   %rax
test   %edi,%edi
jns    112d <foo_div+0x1d>
test   %esi,%esi
jle    112d <foo_div+0x1d>
neg    %edi
mov    %edi,%eax
xor    %edx,%edx
div    %esi
cmp    $0x1,%eax
jne    114a <foo_div+0x3a>
xor    %eax,%eax
call   1030 <abort@plt>
lea    0x14(%rdi),%edx
lea    -0x2(%rsi),%eax
cmp    $0xa,%edx
ja     114e <foo_div+0x3e>
cmp    $0x8,%eax
ja     114e <foo_div+0x3e>
neg    %dil
movzbl %dil,%eax
div    %sil
movzbl %al,%eax
neg    %eax
pop    %rcx
ret
lea    0xa(%rsi),%ecx
cmp    $0xa,%edx
ja     116d <foo_div+0x5d>
cmp    $0x8,%ecx
ja     116d <foo_div+0x5d>
neg    %dil
neg    %sil
movzbl %dil,%eax
div    %sil
movzbl %al,%eax
pop    %rcx
ret
cmp    $0x1e,%edx
ja     1177 <foo_div+0x67>
cmp    $0x8,%eax
jbe    1181 <foo_div+0x71>
cmp    $0x1e,%edx
ja     118d <foo_div+0x7d>
cmp    $0x8,%ecx
ja     118d <foo_div+0x7d>
movsbl %dil,%eax
idiv   %sil
movsbl %al,%eax
pop    %rcx
ret
lea    -0xa(%rdi),%edx
cmp    $0xa,%edx
ja     119a <foo_div+0x8a>
cmp    $0x8,%eax
jbe    1161 <foo_div+0x51>
cmp    $0xa,%edx
ja     1126 <foo_div+0x16>
cmp    $0x8,%ecx
ja     1126 <foo_div+0x16>
neg    %sil
jmp    1140 <foo_div+0x30>

LLVM IR (-O0):
define i32 @foo_div(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
%7 = load i32, i32* %4
%8 = icmp sle i32 %7, -1
br i1 %8, label %9, label %23
9: ; preds = %2
%10 = load i32, i32* %5
%11 = icmp sge i32 %10, 1
br i1 %11, label %12, label %22
12: ; preds = %9
%13 = load i32, i32* %4
%14 = load i32, i32* %5
%15 = sdiv i32 %13, %14
store i32 %15, i32* %6
%16 = load i32, i32* %6
%17 = icmp eq i32 %16, -1
br i1 %17, label %18, label %20
18: ; preds = %12
%19 = call i32 (...) @abort()
unreachable
20: ; preds = %12
%21 = load i32, i32* %6
store i32 %21, i32* %3
br label %205
22: ; preds = %9
br label %23
23: ; preds = %22, %2
%24 = load i32, i32* %4
%25 = icmp sge i32 %24, -20
br i1 %25, label %26, label %53
26: ; preds = %23
%27 = load i32, i32* %4
%28 = icmp sle i32 %27, -10
br i1 %28, label %29, label %52
29: ; preds = %26
%30 = load i32, i32* %5
%31 = icmp sge i32 %30, 2
br i1 %31, label %32, label %51
32: ; preds = %29
%33 = load i32, i32* %5
%34 = icmp sle i32 %33, 10
br i1 %34, label %35, label %50
35: ; preds = %32
%36 = load i32, i32* %4
%37 = load i32, i32* %5
%38 = sdiv i32 %36, %37
store i32 %38, i32* %6
%39 = load i32, i32* %6
%40 = icmp slt i32 %39, -10
br i1 %40, label %41, label %43
41: ; preds = %35
%42 = call i32 (...) @link_error()
br label %43
43: ; preds = %41, %35
%44 = load i32, i32* %6
%45 = icmp sgt i32 %44, -1
br i1 %45, label %46, label %48
46: ; preds = %43
%47 = call i32 (...) @link_error()
br label %48
48: ; preds = %46, %43
%49 = load i32, i32* %6
store i32 %49, i32* %3
br label %205
50: ; preds = %32
br label %51
51: ; preds = %50, %29
br label %52
52: ; preds = %51, %26
br label %53
53: ; preds = %52, %23
%54 = load i32, i32* %4
%55 = icmp sge i32 %54, -20
br i1 %55, label %56, label %83
56: ; preds = %53
%57 = load i32, i32* %4
%58 = icmp sle i32 %57, -10
br i1 %58, label %59, label %82
59: ; preds = %56
%60 = load i32, i32* %5
%61 = icmp sge i32 %60, -10
br i1 %61, label %62, label %81
62: ; preds = %59
%63 = load i32, i32* %5
%64 = icmp sle i32 %63, -2
br i1 %64, label %65, label %80
65: ; preds = %62
%66 = load i32, i32* %4
%67 = load i32, i32* %5
%68 = sdiv i32 %66, %67
store i32 %68, i32* %6
%69 = load i32, i32* %6
%70 = icmp slt i32 %69, 1
br i1 %70, label %71, label %73
71: ; preds = %65
%72 = call i32 (...) @link_error()
br label %73
73: ; preds = %71, %65
%74 = load i32, i32* %6
%75 = icmp sgt i32 %74, 10
br i1 %75, label %76, label %78
76: ; preds = %73
%77 = call i32 (...) @link_error()
br label %78
78: ; preds = %76, %73
%79 = load i32, i32* %6
store i32 %79, i32* %3
br label %205
80: ; preds = %62
br label %81
81: ; preds = %80, %59
br label %82
82: ; preds = %81, %56
br label %83
83: ; preds = %82, %53
%84 = load i32, i32* %4
%85 = icmp sge i32 %84, -20
br i1 %85, label %86, label %113
86: ; preds = %83
%87 = load i32, i32* %4
%88 = icmp sle i32 %87, 10
br i1 %88, label %89, label %112
89: ; preds = %86
%90 = load i32, i32* %5
%91 = icmp sge i32 %90, 2
br i1 %91, label %92, label %111
92: ; preds = %89
%93 = load i32, i32* %5
%94 = icmp sle i32 %93, 10
br i1 %94, label %95, label %110
95: ; preds = %92
%96 = load i32, i32* %4
%97 = load i32, i32* %5
%98 = sdiv i32 %96, %97
store i32 %98, i32* %6
%99 = load i32, i32* %6
%100 = icmp slt i32 %99, -10
br i1 %100, label %101, label %103
101: ; preds = %95
%102 = call i32 (...) @link_error()
br label %103
103: ; preds = %101, %95
%104 = load i32, i32* %6
%105 = icmp sgt i32 %104, 5
br i1 %105, label %106, label %108
106: ; preds = %103
%107 = call i32 (...) @link_error()
br label %108
108: ; preds = %106, %103
%109 = load i32, i32* %6
store i32 %109, i32* %3
br label %205
110: ; preds = %92
br label %111
111: ; preds = %110, %89
br label %112
112: ; preds = %111, %86
br label %113
113: ; preds = %112, %83
%114 = load i32, i32* %4
%115 = icmp sge i32 %114, -20
br i1 %115, label %116, label %143
116: ; preds = %113
%117 = load i32, i32* %4
%118 = icmp sle i32 %117, 10
br i1 %118, label %119, label %142
119: ; preds = %116
%120 = load i32, i32* %5
%121 = icmp sge i32 %120, -10
br i1 %121, label %122, label %141
122: ; preds = %119
%123 = load i32, i32* %5
%124 = icmp sle i32 %123, -2
br i1 %124, label %125, label %140
125: ; preds = %122
%126 = load i32, i32* %4
%127 = load i32, i32* %5
%128 = sdiv i32 %126, %127
store i32 %128, i32* %6
%129 = load i32, i32* %6
%130 = icmp slt i32 %129, -5
br i1 %130, label %131, label %133
131: ; preds = %125
%132 = call i32 (...) @link_error()
br label %133
133: ; preds = %131, %125
%134 = load i32, i32* %6
%135 = icmp sgt i32 %134, 10
br i1 %135, label %136, label %138
136: ; preds = %133
%137 = call i32 (...) @link_error()
br label %138
138: ; preds = %136, %133
%139 = load i32, i32* %6
store i32 %139, i32* %3
br label %205
140: ; preds = %122
br label %141
141: ; preds = %140, %119
br label %142
142: ; preds = %141, %116
br label %143
143: ; preds = %142, %113
%144 = load i32, i32* %4
%145 = icmp sge i32 %144, 10
br i1 %145, label %146, label %173
146: ; preds = %143
%147 = load i32, i32* %4
%148 = icmp sle i32 %147, 20
br i1 %148, label %149, label %172
149: ; preds = %146
%150 = load i32, i32* %5
%151 = icmp sge i32 %150, 2
br i1 %151, label %152, label %171
152: ; preds = %149
%153 = load i32, i32* %5
%154 = icmp sle i32 %153, 10
br i1 %154, label %155, label %170
155: ; preds = %152
%156 = load i32, i32* %4
%157 = load i32, i32* %5
%158 = sdiv i32 %156, %157
store i32 %158, i32* %6
%159 = load i32, i32* %6
%160 = icmp slt i32 %159, 1
br i1 %160, label %161, label %163
161: ; preds = %155
%162 = call i32 (...) @link_error()
br label %163
163: ; preds = %161, %155
%164 = load i32, i32* %6
%165 = icmp sgt i32 %164, 10
br i1 %165, label %166, label %168
166: ; preds = %163
%167 = call i32 (...) @link_error()
br label %168
168: ; preds = %166, %163
%169 = load i32, i32* %6
store i32 %169, i32* %3
br label %205
170: ; preds = %152
br label %171
171: ; preds = %170, %149
br label %172
172: ; preds = %171, %146
br label %173
173: ; preds = %172, %143
%174 = load i32, i32* %4
%175 = icmp sge i32 %174, 10
br i1 %175, label %176, label %203
176: ; preds = %173
%177 = load i32, i32* %4
%178 = icmp sle i32 %177, 20
br i1 %178, label %179, label %202
179: ; preds = %176
%180 = load i32, i32* %5
%181 = icmp sge i32 %180, -10
br i1 %181, label %182, label %201
182: ; preds = %179
%183 = load i32, i32* %5
%184 = icmp sle i32 %183, -2
br i1 %184, label %185, label %200
185: ; preds = %182
%186 = load i32, i32* %4
%187 = load i32, i32* %5
%188 = sdiv i32 %186, %187
store i32 %188, i32* %6
%189 = load i32, i32* %6
%190 = icmp sgt i32 %189, -1
br i1 %190, label %191, label %193
191: ; preds = %185
%192 = call i32 (...) @link_error()
br label %193
193: ; preds = %191, %185
%194 = load i32, i32* %6
%195 = icmp slt i32 %194, -10
br i1 %195, label %196, label %198
196: ; preds = %193
%197 = call i32 (...) @link_error()
br label %198
198: ; preds = %196, %193
%199 = load i32, i32* %6
store i32 %199, i32* %3
br label %205
200: ; preds = %182
br label %201
201: ; preds = %200, %179
br label %202
202: ; preds = %201, %176
br label %203
203: ; preds = %202, %173
%204 = call i32 (...) @abort()
unreachable
205: ; preds = %198, %168, %138, %108, %78, %48, %20
%206 = load i32, i32* %3
ret i32 %206
}

LLVM IR (-O2):
define i32 @foo_div(i32 %0, i32 %1) {
%3 = icmp slt i32 %0, 0
%4 = icmp sgt i32 %1, 0
%5 = and i1 %3, %4
br i1 %5, label %6, label %13
6: ; preds = %2
%7 = sub i32 0, %0
%8 = udiv i32 %7, %1
%9 = sub i32 0, %8
%10 = icmp eq i32 %8, 1
br i1 %10, label %11, label %72
11: ; preds = %6
%12 = tail call i32 (...) @abort()
unreachable
13: ; preds = %2
%14 = add i32 %0, 20
%15 = icmp ult i32 %14, 11
%16 = add i32 %1, -2
%17 = icmp ult i32 %16, 9
%18 = and i1 %15, %17
br i1 %18, label %19, label %26
19: ; preds = %13
%20 = trunc i32 %0 to i8
%21 = sub nsw i8 0, %20
%22 = trunc i32 %1 to i8
%23 = udiv i8 %21, %22
%24 = zext i8 %23 to i32
%25 = sub nsw i32 0, %24
br label %72
26: ; preds = %13
%27 = add i32 %1, 10
%28 = icmp ult i32 %27, 9
%29 = and i1 %15, %28
br i1 %29, label %30, label %37
30: ; preds = %26
%31 = trunc i32 %0 to i8
%32 = sub nsw i8 0, %31
%33 = trunc i32 %1 to i8
%34 = sub nsw i8 0, %33
%35 = udiv i8 %32, %34
%36 = zext i8 %35 to i32
br label %72
37: ; preds = %26
%38 = icmp ult i32 %14, 31
%39 = and i1 %38, %17
br i1 %39, label %40, label %45
40: ; preds = %37
%41 = trunc i32 %0 to i8
%42 = trunc i32 %1 to i8
%43 = sdiv i8 %41, %42
%44 = sext i8 %43 to i32
br label %72
45: ; preds = %37
%46 = and i1 %38, %28
br i1 %46, label %47, label %52
47: ; preds = %45
%48 = trunc i32 %0 to i8
%49 = trunc i32 %1 to i8
%50 = sdiv i8 %48, %49
%51 = sext i8 %50 to i32
br label %72
52: ; preds = %45
%53 = add i32 %0, -10
%54 = icmp ult i32 %53, 11
%55 = and i1 %54, %17
br i1 %55, label %56, label %61
56: ; preds = %52
%57 = trunc i32 %0 to i8
%58 = trunc i32 %1 to i8
%59 = udiv i8 %57, %58
%60 = zext i8 %59 to i32
br label %72
61: ; preds = %52
%62 = and i1 %54, %28
br i1 %62, label %63, label %70
63: ; preds = %61
%64 = trunc i32 %0 to i8
%65 = trunc i32 %1 to i8
%66 = sub nsw i8 0, %65
%67 = udiv i8 %64, %66
%68 = zext i8 %67 to i32
%69 = sub nsw i32 0, %68
br label %72
70: ; preds = %61
%71 = tail call i32 (...) @abort()
unreachable
72: ; preds = %6, %63, %56, %47, %40, %30, %19
%73 = phi i32 [ %25, %19 ], [ %36, %30 ], [ %44, %40 ], [ %51, %47 ], [ %60, %56 ], [ %69, %63 ], [ %9, %6 ]
ret i32 %73
}