int ibitmap_clip(const int *clipdst, const int *clipsrc, int *x, int *y,
                 int *rectsrc, int clip) {
  int dcl = clipdst[0];
  int dct = clipdst[1];
  int dcr = clipdst[2];
  int dcb = clipdst[3];
  int scl = clipsrc[0];
  int sct = clipsrc[1];
  int scr = clipsrc[2];
  int scb = clipsrc[3];
  int dx = *x;
  int dy = *y;
  int sl = rectsrc[0];
  int st = rectsrc[1];
  int sr = rectsrc[2];
  int sb = rectsrc[3];
  int hflip, vflip;
  int w, h, d;
  hflip = (clip & 2) ? 1 : 0;
  vflip = (clip & 4) ? 1 : 0;
  if (dcr <= dcl || dcb <= dct || scr <= scl || scb <= sct)
    return -1;
  if (sr <= scl || sb <= sct || sl >= scr || st >= scb)
    return -2;
  if (dx < dcl) {
    d = dcl - dx;
    dx = dcl;
    if (!hflip)
      sl += d;
    else
      sr -= d;
  }
  if (dy < dct) {
    d = dct - dy;
    dy = dct;
    if (!vflip)
      st += d;
    else
      sb -= d;
  }
  w = sr - sl;
  h = sb - st;
  if (w < 0 || h < 0)
    return -3;
  if (dx + w > dcr) {
    d = dx + w - dcr;
    if (!hflip)
      sr -= d;
    else
      sl += d;
  }
  if (dy + h > dcb) {
    d = dy + h - dcb;
    if (!vflip)
      sb -= d;
    else
      st += d;
  }
  if (sl >= sr || st >= sb)
    return -4;
  if (sl < scl) {
    d = scl - sl;
    sl = scl;
    if (!hflip)
      dx += d;
  }
  if (st < sct) {
    d = sct - st;
    st = sct;
    if (!vflip)
      dy += d;
  }
  if (sl >= sr || st >= sb)
    return -5;
  if (sr > scr) {
    d = sr - scr;
    sr = scr;
    if (hflip)
      dx += d;
  }
  if (sb > scb) {
    d = sb - scb;
    sb = scb;
    if (vflip)
      dy += d;
  }
  if (sl >= sr || st >= sb)
    return -6;
  *x = dx;
  *y = dy;
  rectsrc[0] = sl;
  rectsrc[1] = st;
  rectsrc[2] = sr;
  rectsrc[3] = sb;
  return 0;
}


x86 assembly (clang, -O0):
<ibitmap_clip>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9d,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%eax
mov    %eax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    0xc(%rax),%eax
mov    %eax,-0x54(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x58(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x60(%rbp)
mov    -0x30(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x64(%rbp)
mov    -0x30(%rbp),%rax
mov    0x8(%rax),%eax
mov    %eax,-0x68(%rbp)
mov    -0x30(%rbp),%rax
mov    0xc(%rax),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x34(%rbp),%edx
and    $0x2,%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x70(%rbp)
mov    -0x34(%rbp),%edx
and    $0x4,%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x74(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x38(%rbp),%eax
jle    11ff <ibitmap_clip+0xff>
mov    -0x44(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jle    11ff <ibitmap_clip+0xff>
mov    -0x50(%rbp),%eax
cmp    -0x48(%rbp),%eax
jle    11ff <ibitmap_clip+0xff>
mov    -0x54(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jg     120b <ibitmap_clip+0x10b>
movl   $0xffffffff,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x68(%rbp),%eax
cmp    -0x48(%rbp),%eax
jle    123b <ibitmap_clip+0x13b>
mov    -0x6c(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jle    123b <ibitmap_clip+0x13b>
mov    -0x60(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    123b <ibitmap_clip+0x13b>
mov    -0x64(%rbp),%eax
cmp    -0x54(%rbp),%eax
jl     1247 <ibitmap_clip+0x147>
movl   $0xfffffffe,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x58(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    128a <ibitmap_clip+0x18a>
mov    -0x38(%rbp),%eax
sub    -0x58(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x58(%rbp)
cmpl   $0x0,-0x70(%rbp)
jne    127a <ibitmap_clip+0x17a>
mov    -0x80(%rbp),%eax
add    -0x60(%rbp),%eax
mov    %eax,-0x60(%rbp)
jmp    1285 <ibitmap_clip+0x185>
mov    -0x80(%rbp),%ecx
mov    -0x68(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x68(%rbp)
jmp    128a <ibitmap_clip+0x18a>
mov    -0x5c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    12cd <ibitmap_clip+0x1cd>
mov    -0x3c(%rbp),%eax
sub    -0x5c(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
cmpl   $0x0,-0x74(%rbp)
jne    12bd <ibitmap_clip+0x1bd>
mov    -0x80(%rbp),%eax
add    -0x64(%rbp),%eax
mov    %eax,-0x64(%rbp)
jmp    12c8 <ibitmap_clip+0x1c8>
mov    -0x80(%rbp),%ecx
mov    -0x6c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x6c(%rbp)
jmp    12cd <ibitmap_clip+0x1cd>
mov    -0x68(%rbp),%eax
sub    -0x60(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    -0x6c(%rbp),%eax
sub    -0x64(%rbp),%eax
mov    %eax,-0x7c(%rbp)
cmpl   $0x0,-0x78(%rbp)
jl     12f3 <ibitmap_clip+0x1f3>
cmpl   $0x0,-0x7c(%rbp)
jge    12ff <ibitmap_clip+0x1ff>
movl   $0xfffffffd,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x58(%rbp),%eax
add    -0x78(%rbp),%eax
cmp    -0x40(%rbp),%eax
jle    1342 <ibitmap_clip+0x242>
mov    -0x58(%rbp),%eax
add    -0x78(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x70(%rbp)
jne    1334 <ibitmap_clip+0x234>
mov    -0x80(%rbp),%ecx
mov    -0x68(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x68(%rbp)
jmp    133d <ibitmap_clip+0x23d>
mov    -0x80(%rbp),%eax
add    -0x60(%rbp),%eax
mov    %eax,-0x60(%rbp)
jmp    1342 <ibitmap_clip+0x242>
mov    -0x5c(%rbp),%eax
add    -0x7c(%rbp),%eax
cmp    -0x44(%rbp),%eax
jle    1385 <ibitmap_clip+0x285>
mov    -0x5c(%rbp),%eax
add    -0x7c(%rbp),%eax
sub    -0x44(%rbp),%eax
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x74(%rbp)
jne    1377 <ibitmap_clip+0x277>
mov    -0x80(%rbp),%ecx
mov    -0x6c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x6c(%rbp)
jmp    1380 <ibitmap_clip+0x280>
mov    -0x80(%rbp),%eax
add    -0x64(%rbp),%eax
mov    %eax,-0x64(%rbp)
jmp    1385 <ibitmap_clip+0x285>
mov    -0x60(%rbp),%eax
cmp    -0x68(%rbp),%eax
jge    139d <ibitmap_clip+0x29d>
mov    -0x64(%rbp),%eax
cmp    -0x6c(%rbp),%eax
jl     13a9 <ibitmap_clip+0x2a9>
movl   $0xfffffffc,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x60(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    13dc <ibitmap_clip+0x2dc>
mov    -0x48(%rbp),%eax
sub    -0x60(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x60(%rbp)
cmpl   $0x0,-0x70(%rbp)
jne    13d7 <ibitmap_clip+0x2d7>
mov    -0x80(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x58(%rbp)
jmp    13dc <ibitmap_clip+0x2dc>
mov    -0x64(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jge    140f <ibitmap_clip+0x30f>
mov    -0x4c(%rbp),%eax
sub    -0x64(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x64(%rbp)
cmpl   $0x0,-0x74(%rbp)
jne    140a <ibitmap_clip+0x30a>
mov    -0x80(%rbp),%eax
add    -0x5c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    140f <ibitmap_clip+0x30f>
mov    -0x60(%rbp),%eax
cmp    -0x68(%rbp),%eax
jge    1427 <ibitmap_clip+0x327>
mov    -0x64(%rbp),%eax
cmp    -0x6c(%rbp),%eax
jl     1433 <ibitmap_clip+0x333>
movl   $0xfffffffb,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x68(%rbp),%eax
cmp    -0x50(%rbp),%eax
jle    1466 <ibitmap_clip+0x366>
mov    -0x68(%rbp),%eax
sub    -0x50(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0x68(%rbp)
cmpl   $0x0,-0x70(%rbp)
je     1461 <ibitmap_clip+0x361>
mov    -0x80(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x58(%rbp)
jmp    1466 <ibitmap_clip+0x366>
mov    -0x6c(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    1499 <ibitmap_clip+0x399>
mov    -0x6c(%rbp),%eax
sub    -0x54(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x6c(%rbp)
cmpl   $0x0,-0x74(%rbp)
je     1494 <ibitmap_clip+0x394>
mov    -0x80(%rbp),%eax
add    -0x5c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    1499 <ibitmap_clip+0x399>
mov    -0x60(%rbp),%eax
cmp    -0x68(%rbp),%eax
jge    14b1 <ibitmap_clip+0x3b1>
mov    -0x64(%rbp),%eax
cmp    -0x6c(%rbp),%eax
jl     14bd <ibitmap_clip+0x3bd>
movl   $0xfffffffa,-0x4(%rbp)
jmp    14fd <ibitmap_clip+0x3fd>
mov    -0x58(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x5c(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x60(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x64(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x68(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x6c(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,0xc(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ibitmap_clip>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    (%rdi),%r10d
mov    0x8(%rdi),%ebx
mov    $0xffffffff,%eax
cmp    %r10d,%ebx
jle    117d <ibitmap_clip+0x7d>
mov    0x4(%rdi),%r11d
mov    0xc(%rdi),%ebp
cmp    %r11d,%ebp
jle    117d <ibitmap_clip+0x7d>
movq   (%rsi),%xmm1
movq   0x8(%rsi),%xmm0
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pshufd $0x50,%xmm2,%xmm2
movmskpd %xmm2,%esi
test   $0x1,%sil
je     117d <ibitmap_clip+0x7d>
shr    %sil
je     117d <ibitmap_clip+0x7d>
movq   (%r8),%xmm3
movq   0x8(%r8),%xmm2
movdqa %xmm2,%xmm4
punpcklqdq %xmm0,%xmm4
movdqa %xmm1,%xmm5
punpcklqdq %xmm3,%xmm5
pcmpgtd %xmm5,%xmm4
pslld  $0x1f,%xmm4
movmskps %xmm4,%esi
mov    $0xfffffffe,%eax
cmp    $0xf,%sil
je     1188 <ibitmap_clip+0x88>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    (%rdx),%edi
mov    (%rcx),%eax
mov    %r10d,%esi
movd   %xmm3,%r13d
movd   %xmm2,%r14d
sub    %edi,%esi
jle    11a8 <ibitmap_clip+0xa8>
test   $0x2,%r9b
jne    11ad <ibitmap_clip+0xad>
add    %esi,%r13d
jmp    11b0 <ibitmap_clip+0xb0>
mov    %edi,%r10d
jmp    11b0 <ibitmap_clip+0xb0>
sub    %esi,%r14d
mov    %r11d,%esi
pshufd $0x55,%xmm3,%xmm3
movd   %xmm3,%r12d
pshufd $0x55,%xmm2,%xmm2
movd   %xmm2,%r15d
sub    %eax,%esi
jle    11d6 <ibitmap_clip+0xd6>
test   $0x4,%r9b
jne    11db <ibitmap_clip+0xdb>
add    %esi,%r12d
jmp    11de <ibitmap_clip+0xde>
mov    %eax,%r11d
jmp    11de <ibitmap_clip+0xde>
sub    %esi,%r15d
mov    %r14d,%edi
sub    %r13d,%edi
mov    $0xfffffffd,%eax
js     117d <ibitmap_clip+0x7d>
mov    %r15d,%esi
sub    %r12d,%esi
js     117d <ibitmap_clip+0x7d>
add    %r10d,%edi
sub    %ebx,%edi
jle    1208 <ibitmap_clip+0x108>
test   $0x2,%r9b
jne    1205 <ibitmap_clip+0x105>
sub    %edi,%r14d
jmp    1208 <ibitmap_clip+0x108>
add    %edi,%r13d
add    %r11d,%esi
sub    %ebp,%esi
jle    121d <ibitmap_clip+0x11d>
test   $0x4,%r9b
jne    121a <ibitmap_clip+0x11a>
sub    %esi,%r15d
jmp    121d <ibitmap_clip+0x11d>
add    %esi,%r12d
mov    $0xfffffffc,%eax
cmp    %r14d,%r13d
jge    117d <ibitmap_clip+0x7d>
cmp    %r15d,%r12d
jge    117d <ibitmap_clip+0x7d>
pshufd $0x55,%xmm1,%xmm2
movd   %xmm2,%esi
mov    %esi,%ebx
sub    %r12d,%ebx
xor    %eax,%eax
test   $0x4,%r9b
cmovne %eax,%ebx
cmp    %r12d,%esi
movd   %xmm1,%ebp
cmovle %r12d,%esi
cmovle %eax,%ebx
mov    %ebp,%edi
sub    %r13d,%edi
test   $0x2,%r9b
cmovne %eax,%edi
cmp    %r13d,%ebp
cmovle %r13d,%ebp
cmovle %eax,%edi
mov    $0xfffffffb,%eax
cmp    %r14d,%ebp
jge    117d <ibitmap_clip+0x7d>
cmp    %r15d,%esi
jge    117d <ibitmap_clip+0x7d>
movd   %xmm0,%r12d
cmp    %r12d,%r14d
mov    %r12d,-0x4(%rsp)
cmovle %r14d,%r12d
pshufd $0x55,%xmm0,%xmm0
movd   %xmm0,%r13d
cmp    %r13d,%r15d
mov    %r13d,%eax
cmovle %r15d,%eax
mov    %eax,-0x8(%rsp)
mov    $0xfffffffa,%eax
cmp    %r12d,%ebp
jge    117d <ibitmap_clip+0x7d>
cmp    -0x8(%rsp),%esi
jge    117d <ibitmap_clip+0x7d>
add    %r11d,%ebx
mov    %r9d,%r11d
shl    $0x1d,%r11d
sar    $0x1f,%r11d
shl    $0x1e,%r9d
sar    $0x1f,%r9d
xor    %eax,%eax
sub    %r13d,%r15d
cmovle %eax,%r15d
and    %r11d,%r15d
add    %ebx,%r15d
sub    -0x4(%rsp),%r14d
cmovle %eax,%r14d
and    %r9d,%r14d
add    %r10d,%r14d
add    %edi,%r14d
mov    %r14d,(%rdx)
mov    %r15d,(%rcx)
mov    %ebp,(%r8)
mov    %esi,0x4(%r8)
mov    %r12d,0x8(%r8)
mov    -0x8(%rsp),%ecx
mov    %ecx,0xc(%r8)
jmp    117d <ibitmap_clip+0x7d>

LLVM IR (-O0):
define i32 @ibitmap_clip(i32* %0, i32* %1, i32* %2, i32* %3, i32* %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32*
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca i32
store i32* %0, i32** %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
%33 = load i32*, i32** %8
%34 = getelementptr inbounds i32, i32* %33, i64 0
%35 = load i32, i32* %34
store i32 %35, i32* %14
%36 = load i32*, i32** %8
%37 = getelementptr inbounds i32, i32* %36, i64 1
%38 = load i32, i32* %37
store i32 %38, i32* %15
%39 = load i32*, i32** %8
%40 = getelementptr inbounds i32, i32* %39, i64 2
%41 = load i32, i32* %40
store i32 %41, i32* %16
%42 = load i32*, i32** %8
%43 = getelementptr inbounds i32, i32* %42, i64 3
%44 = load i32, i32* %43
store i32 %44, i32* %17
%45 = load i32*, i32** %9
%46 = getelementptr inbounds i32, i32* %45, i64 0
%47 = load i32, i32* %46
store i32 %47, i32* %18
%48 = load i32*, i32** %9
%49 = getelementptr inbounds i32, i32* %48, i64 1
%50 = load i32, i32* %49
store i32 %50, i32* %19
%51 = load i32*, i32** %9
%52 = getelementptr inbounds i32, i32* %51, i64 2
%53 = load i32, i32* %52
store i32 %53, i32* %20
%54 = load i32*, i32** %9
%55 = getelementptr inbounds i32, i32* %54, i64 3
%56 = load i32, i32* %55
store i32 %56, i32* %21
%57 = load i32*, i32** %10
%58 = load i32, i32* %57
store i32 %58, i32* %22
%59 = load i32*, i32** %11
%60 = load i32, i32* %59
store i32 %60, i32* %23
%61 = load i32*, i32** %12
%62 = getelementptr inbounds i32, i32* %61, i64 0
%63 = load i32, i32* %62
store i32 %63, i32* %24
%64 = load i32*, i32** %12
%65 = getelementptr inbounds i32, i32* %64, i64 1
%66 = load i32, i32* %65
store i32 %66, i32* %25
%67 = load i32*, i32** %12
%68 = getelementptr inbounds i32, i32* %67, i64 2
%69 = load i32, i32* %68
store i32 %69, i32* %26
%70 = load i32*, i32** %12
%71 = getelementptr inbounds i32, i32* %70, i64 3
%72 = load i32, i32* %71
store i32 %72, i32* %27
%73 = load i32, i32* %13
%74 = and i32 %73, 2
%75 = icmp ne i32 %74, 0
%76 = zext i1 %75 to i64
%77 = select i1 %75, i32 1, i32 0
store i32 %77, i32* %28
%78 = load i32, i32* %13
%79 = and i32 %78, 4
%80 = icmp ne i32 %79, 0
%81 = zext i1 %80 to i64
%82 = select i1 %80, i32 1, i32 0
store i32 %82, i32* %29
%83 = load i32, i32* %16
%84 = load i32, i32* %14
%85 = icmp sle i32 %83, %84
br i1 %85, label %98, label %86
86: ; preds = %6
%87 = load i32, i32* %17
%88 = load i32, i32* %15
%89 = icmp sle i32 %87, %88
br i1 %89, label %98, label %90
90: ; preds = %86
%91 = load i32, i32* %20
%92 = load i32, i32* %18
%93 = icmp sle i32 %91, %92
br i1 %93, label %98, label %94
94: ; preds = %90
%95 = load i32, i32* %21
%96 = load i32, i32* %19
%97 = icmp sle i32 %95, %96
br i1 %97, label %98, label %99
98: ; preds = %94, %90, %86, %6
store i32 -1, i32* %7
br label %323
99: ; preds = %94
%100 = load i32, i32* %26
%101 = load i32, i32* %18
%102 = icmp sle i32 %100, %101
br i1 %102, label %115, label %103
103: ; preds = %99
%104 = load i32, i32* %27
%105 = load i32, i32* %19
%106 = icmp sle i32 %104, %105
br i1 %106, label %115, label %107
107: ; preds = %103
%108 = load i32, i32* %24
%109 = load i32, i32* %20
%110 = icmp sge i32 %108, %109
br i1 %110, label %115, label %111
111: ; preds = %107
%112 = load i32, i32* %25
%113 = load i32, i32* %21
%114 = icmp sge i32 %112, %113
br i1 %114, label %115, label %116
115: ; preds = %111, %107, %103, %99
store i32 -2, i32* %7
br label %323
116: ; preds = %111
%117 = load i32, i32* %22
%118 = load i32, i32* %14
%119 = icmp slt i32 %117, %118
br i1 %119, label %120, label %136
120: ; preds = %116
%121 = load i32, i32* %14
%122 = load i32, i32* %22
%123 = sub nsw i32 %121, %122
store i32 %123, i32* %32
%124 = load i32, i32* %14
store i32 %124, i32* %22
%125 = load i32, i32* %28
%126 = icmp ne i32 %125, 0
br i1 %126, label %131, label %127
127: ; preds = %120
%128 = load i32, i32* %32
%129 = load i32, i32* %24
%130 = add nsw i32 %129, %128
store i32 %130, i32* %24
br label %135
131: ; preds = %120
%132 = load i32, i32* %32
%133 = load i32, i32* %26
%134 = sub nsw i32 %133, %132
store i32 %134, i32* %26
br label %135
135: ; preds = %131, %127
br label %136
136: ; preds = %135, %116
%137 = load i32, i32* %23
%138 = load i32, i32* %15
%139 = icmp slt i32 %137, %138
br i1 %139, label %140, label %156
140: ; preds = %136
%141 = load i32, i32* %15
%142 = load i32, i32* %23
%143 = sub nsw i32 %141, %142
store i32 %143, i32* %32
%144 = load i32, i32* %15
store i32 %144, i32* %23
%145 = load i32, i32* %29
%146 = icmp ne i32 %145, 0
br i1 %146, label %151, label %147
147: ; preds = %140
%148 = load i32, i32* %32
%149 = load i32, i32* %25
%150 = add nsw i32 %149, %148
store i32 %150, i32* %25
br label %155
151: ; preds = %140
%152 = load i32, i32* %32
%153 = load i32, i32* %27
%154 = sub nsw i32 %153, %152
store i32 %154, i32* %27
br label %155
155: ; preds = %151, %147
br label %156
156: ; preds = %155, %136
%157 = load i32, i32* %26
%158 = load i32, i32* %24
%159 = sub nsw i32 %157, %158
store i32 %159, i32* %30
%160 = load i32, i32* %27
%161 = load i32, i32* %25
%162 = sub nsw i32 %160, %161
store i32 %162, i32* %31
%163 = load i32, i32* %30
%164 = icmp slt i32 %163, 0
br i1 %164, label %168, label %165
165: ; preds = %156
%166 = load i32, i32* %31
%167 = icmp slt i32 %166, 0
br i1 %167, label %168, label %169
168: ; preds = %165, %156
store i32 -3, i32* %7
br label %323
169: ; preds = %165
%170 = load i32, i32* %22
%171 = load i32, i32* %30
%172 = add nsw i32 %170, %171
%173 = load i32, i32* %16
%174 = icmp sgt i32 %172, %173
br i1 %174, label %175, label %192
175: ; preds = %169
%176 = load i32, i32* %22
%177 = load i32, i32* %30
%178 = add nsw i32 %176, %177
%179 = load i32, i32* %16
%180 = sub nsw i32 %178, %179
store i32 %180, i32* %32
%181 = load i32, i32* %28
%182 = icmp ne i32 %181, 0
br i1 %182, label %187, label %183
183: ; preds = %175
%184 = load i32, i32* %32
%185 = load i32, i32* %26
%186 = sub nsw i32 %185, %184
store i32 %186, i32* %26
br label %191
187: ; preds = %175
%188 = load i32, i32* %32
%189 = load i32, i32* %24
%190 = add nsw i32 %189, %188
store i32 %190, i32* %24
br label %191
191: ; preds = %187, %183
br label %192
192: ; preds = %191, %169
%193 = load i32, i32* %23
%194 = load i32, i32* %31
%195 = add nsw i32 %193, %194
%196 = load i32, i32* %17
%197 = icmp sgt i32 %195, %196
br i1 %197, label %198, label %215
198: ; preds = %192
%199 = load i32, i32* %23
%200 = load i32, i32* %31
%201 = add nsw i32 %199, %200
%202 = load i32, i32* %17
%203 = sub nsw i32 %201, %202
store i32 %203, i32* %32
%204 = load i32, i32* %29
%205 = icmp ne i32 %204, 0
br i1 %205, label %210, label %206
206: ; preds = %198
%207 = load i32, i32* %32
%208 = load i32, i32* %27
%209 = sub nsw i32 %208, %207
store i32 %209, i32* %27
br label %214
210: ; preds = %198
%211 = load i32, i32* %32
%212 = load i32, i32* %25
%213 = add nsw i32 %212, %211
store i32 %213, i32* %25
br label %214
214: ; preds = %210, %206
br label %215
215: ; preds = %214, %192
%216 = load i32, i32* %24
%217 = load i32, i32* %26
%218 = icmp sge i32 %216, %217
br i1 %218, label %223, label %219
219: ; preds = %215
%220 = load i32, i32* %25
%221 = load i32, i32* %27
%222 = icmp sge i32 %220, %221
br i1 %222, label %223, label %224
223: ; preds = %219, %215
store i32 -4, i32* %7
br label %323
224: ; preds = %219
%225 = load i32, i32* %24
%226 = load i32, i32* %18
%227 = icmp slt i32 %225, %226
br i1 %227, label %228, label %240
228: ; preds = %224
%229 = load i32, i32* %18
%230 = load i32, i32* %24
%231 = sub nsw i32 %229, %230
store i32 %231, i32* %32
%232 = load i32, i32* %18
store i32 %232, i32* %24
%233 = load i32, i32* %28
%234 = icmp ne i32 %233, 0
br i1 %234, label %239, label %235
235: ; preds = %228
%236 = load i32, i32* %32
%237 = load i32, i32* %22
%238 = add nsw i32 %237, %236
store i32 %238, i32* %22
br label %239
239: ; preds = %235, %228
br label %240
240: ; preds = %239, %224
%241 = load i32, i32* %25
%242 = load i32, i32* %19
%243 = icmp slt i32 %241, %242
br i1 %243, label %244, label %256
244: ; preds = %240
%245 = load i32, i32* %19
%246 = load i32, i32* %25
%247 = sub nsw i32 %245, %246
store i32 %247, i32* %32
%248 = load i32, i32* %19
store i32 %248, i32* %25
%249 = load i32, i32* %29
%250 = icmp ne i32 %249, 0
br i1 %250, label %255, label %251
251: ; preds = %244
%252 = load i32, i32* %32
%253 = load i32, i32* %23
%254 = add nsw i32 %253, %252
store i32 %254, i32* %23
br label %255
255: ; preds = %251, %244
br label %256
256: ; preds = %255, %240
%257 = load i32, i32* %24
%258 = load i32, i32* %26
%259 = icmp sge i32 %257, %258
br i1 %259, label %264, label %260
260: ; preds = %256
%261 = load i32, i32* %25
%262 = load i32, i32* %27
%263 = icmp sge i32 %261, %262
br i1 %263, label %264, label %265
264: ; preds = %260, %256
store i32 -5, i32* %7
br label %323
265: ; preds = %260
%266 = load i32, i32* %26
%267 = load i32, i32* %20
%268 = icmp sgt i32 %266, %267
br i1 %268, label %269, label %281
269: ; preds = %265
%270 = load i32, i32* %26
%271 = load i32, i32* %20
%272 = sub nsw i32 %270, %271
store i32 %272, i32* %32
%273 = load i32, i32* %20
store i32 %273, i32* %26
%274 = load i32, i32* %28
%275 = icmp ne i32 %274, 0
br i1 %275, label %276, label %280
276: ; preds = %269
%277 = load i32, i32* %32
%278 = load i32, i32* %22
%279 = add nsw i32 %278, %277
store i32 %279, i32* %22
br label %280
280: ; preds = %276, %269
br label %281
281: ; preds = %280, %265
%282 = load i32, i32* %27
%283 = load i32, i32* %21
%284 = icmp sgt i32 %282, %283
br i1 %284, label %285, label %297
285: ; preds = %281
%286 = load i32, i32* %27
%287 = load i32, i32* %21
%288 = sub nsw i32 %286, %287
store i32 %288, i32* %32
%289 = load i32, i32* %21
store i32 %289, i32* %27
%290 = load i32, i32* %29
%291 = icmp ne i32 %290, 0
br i1 %291, label %292, label %296
292: ; preds = %285
%293 = load i32, i32* %32
%294 = load i32, i32* %23
%295 = add nsw i32 %294, %293
store i32 %295, i32* %23
br label %296
296: ; preds = %292, %285
br label %297
297: ; preds = %296, %281
%298 = load i32, i32* %24
%299 = load i32, i32* %26
%300 = icmp sge i32 %298, %299
br i1 %300, label %305, label %301
301: ; preds = %297
%302 = load i32, i32* %25
%303 = load i32, i32* %27
%304 = icmp sge i32 %302, %303
br i1 %304, label %305, label %306
305: ; preds = %301, %297
store i32 -6, i32* %7
br label %323
306: ; preds = %301
%307 = load i32, i32* %22
%308 = load i32*, i32** %10
store i32 %307, i32* %308
%309 = load i32, i32* %23
%310 = load i32*, i32** %11
store i32 %309, i32* %310
%311 = load i32, i32* %24
%312 = load i32*, i32** %12
%313 = getelementptr inbounds i32, i32* %312, i64 0
store i32 %311, i32* %313
%314 = load i32, i32* %25
%315 = load i32*, i32** %12
%316 = getelementptr inbounds i32, i32* %315, i64 1
store i32 %314, i32* %316
%317 = load i32, i32* %26
%318 = load i32*, i32** %12
%319 = getelementptr inbounds i32, i32* %318, i64 2
store i32 %317, i32* %319
%320 = load i32, i32* %27
%321 = load i32*, i32** %12
%322 = getelementptr inbounds i32, i32* %321, i64 3
store i32 %320, i32* %322
store i32 0, i32* %7
br label %323
323: ; preds = %306, %305, %264, %223, %168, %115, %98
%324 = load i32, i32* %7
ret i32 %324
}

LLVM IR (-O2):
define i32 @ibitmap_clip(i32* nocapture %0, i32* nocapture %1, i32* nocapture %2, i32* nocapture %3, i32* nocapture %4, i32 %5) {
%7 = load i32, i32* %0
%8 = getelementptr inbounds i32, i32* %0, i64 1
%9 = load i32, i32* %8
%10 = getelementptr inbounds i32, i32* %0, i64 2
%11 = load i32, i32* %10
%12 = getelementptr inbounds i32, i32* %0, i64 3
%13 = load i32, i32* %12
%14 = bitcast i32* %1 to <2 x i32>*
%15 = load <2 x i32>, <2 x i32>* %14
%16 = getelementptr inbounds i32, i32* %1, i64 2
%17 = bitcast i32* %16 to <2 x i32>*
%18 = load <2 x i32>, <2 x i32>* %17
%19 = load i32, i32* %2
%20 = load i32, i32* %3
%21 = getelementptr inbounds i32, i32* %4, i64 1
%22 = bitcast i32* %4 to <2 x i32>*
%23 = load <2 x i32>, <2 x i32>* %22
%24 = getelementptr inbounds i32, i32* %4, i64 2
%25 = getelementptr inbounds i32, i32* %4, i64 3
%26 = bitcast i32* %24 to <2 x i32>*
%27 = load <2 x i32>, <2 x i32>* %26
%28 = and i32 %5, 2
%29 = icmp eq i32 %28, 0
%30 = and i32 %5, 4
%31 = icmp eq i32 %30, 0
%32 = icmp sgt i32 %11, %7
%33 = icmp sgt i32 %13, %9
%34 = select i1 %32, i1 %33, i1 false
%35 = icmp sgt <2 x i32> %18, %15
%36 = extractelement <2 x i1> %35, i64 0
%37 = select i1 %34, i1 %36, i1 false
%38 = extractelement <2 x i1> %35, i64 1
%39 = select i1 %37, i1 %38, i1 false
br i1 %39, label %40, label %144
40: ; preds = %6
%41 = shufflevector <2 x i32> %27, <2 x i32> %18, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%42 = shufflevector <2 x i32> %15, <2 x i32> %23, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%43 = icmp sgt <4 x i32> %41, %42
%44 = freeze <4 x i1> %43
%45 = bitcast <4 x i1> %44 to i4
%46 = icmp eq i4 %45, -1
br i1 %46, label %47, label %144
47: ; preds = %40
%48 = icmp sgt i32 %7, %19
%49 = extractelement <2 x i32> %23, i64 0
%50 = extractelement <2 x i32> %27, i64 0
br i1 %48, label %51, label %57
51: ; preds = %47
%52 = sub nsw i32 %7, %19
br i1 %29, label %53, label %55
53: ; preds = %51
%54 = add nsw i32 %49, %52
br label %57
55: ; preds = %51
%56 = sub nsw i32 %50, %52
br label %57
57: ; preds = %53, %55, %47
%58 = phi i32 [ %56, %55 ], [ %50, %53 ], [ %50, %47 ]
%59 = phi i32 [ %49, %55 ], [ %54, %53 ], [ %49, %47 ]
%60 = phi i32 [ %7, %55 ], [ %7, %53 ], [ %19, %47 ]
%61 = icmp sgt i32 %9, %20
%62 = extractelement <2 x i32> %23, i64 1
%63 = extractelement <2 x i32> %27, i64 1
br i1 %61, label %64, label %70
64: ; preds = %57
%65 = sub nsw i32 %9, %20
br i1 %31, label %66, label %68
66: ; preds = %64
%67 = add nsw i32 %62, %65
br label %70
68: ; preds = %64
%69 = sub nsw i32 %63, %65
br label %70
70: ; preds = %66, %68, %57
%71 = phi i32 [ %62, %68 ], [ %67, %66 ], [ %62, %57 ]
%72 = phi i32 [ %69, %68 ], [ %63, %66 ], [ %63, %57 ]
%73 = phi i32 [ %9, %68 ], [ %9, %66 ], [ %20, %57 ]
%74 = sub nsw i32 %58, %59
%75 = sub nsw i32 %72, %71
%76 = icmp slt i32 %74, 0
%77 = icmp slt i32 %75, 0
%78 = select i1 %76, i1 true, i1 %77
br i1 %78, label %144, label %79
79: ; preds = %70
%80 = add nsw i32 %60, %74
%81 = icmp sgt i32 %80, %11
br i1 %81, label %82, label %88
82: ; preds = %79
%83 = sub nsw i32 %80, %11
br i1 %29, label %84, label %86
84: ; preds = %82
%85 = sub nsw i32 %58, %83
br label %88
86: ; preds = %82
%87 = add nsw i32 %83, %59
br label %88
88: ; preds = %84, %86, %79
%89 = phi i32 [ %58, %86 ], [ %85, %84 ], [ %58, %79 ]
%90 = phi i32 [ %87, %86 ], [ %59, %84 ], [ %59, %79 ]
%91 = add nsw i32 %73, %75
%92 = icmp sgt i32 %91, %13
br i1 %92, label %93, label %99
93: ; preds = %88
%94 = sub nsw i32 %91, %13
br i1 %31, label %95, label %97
95: ; preds = %93
%96 = sub nsw i32 %72, %94
br label %99
97: ; preds = %93
%98 = add nsw i32 %94, %71
br label %99
99: ; preds = %95, %97, %88
%100 = phi i32 [ %98, %97 ], [ %71, %95 ], [ %71, %88 ]
%101 = phi i32 [ %72, %97 ], [ %96, %95 ], [ %72, %88 ]
%102 = icmp slt i32 %90, %89
%103 = icmp slt i32 %100, %101
%104 = select i1 %102, i1 %103, i1 false
br i1 %104, label %105, label %144
105: ; preds = %99
%106 = extractelement <2 x i32> %15, i64 0
%107 = icmp sle i32 %106, %90
%108 = xor i1 %29, true
%109 = or i1 %107, %108
%110 = sub nsw i32 %106, %90
%111 = select i1 %107, i32 %90, i32 %106
%112 = select i1 %109, i32 0, i32 %110
%113 = extractelement <2 x i32> %15, i64 1
%114 = icmp sle i32 %113, %100
%115 = xor i1 %31, true
%116 = or i1 %114, %115
%117 = sub nsw i32 %113, %100
%118 = select i1 %114, i32 %100, i32 %113
%119 = select i1 %116, i32 0, i32 %117
%120 = add nsw i32 %119, %73
%121 = icmp slt i32 %111, %89
%122 = icmp slt i32 %118, %101
%123 = select i1 %121, i1 %122, i1 false
br i1 %123, label %124, label %144
124: ; preds = %105
%125 = extractelement <2 x i32> %18, i64 0
%126 = icmp sle i32 %89, %125
%127 = select i1 %126, i32 %89, i32 %125
%128 = extractelement <2 x i32> %18, i64 1
%129 = icmp sle i32 %101, %128
%130 = select i1 %129, i32 %101, i32 %128
%131 = icmp slt i32 %111, %127
%132 = icmp slt i32 %118, %130
%133 = select i1 %131, i1 %132, i1 false
br i1 %133, label %134, label %144
134: ; preds = %124
%135 = or i1 %31, %129
%136 = sub nsw i32 %101, %128
%137 = select i1 %135, i32 0, i32 %136
%138 = add nsw i32 %120, %137
%139 = or i1 %29, %126
%140 = sub nsw i32 %89, %125
%141 = select i1 %139, i32 0, i32 %140
%142 = add i32 %141, %60
%143 = add i32 %142, %112
store i32 %143, i32* %2
store i32 %138, i32* %3
store i32 %111, i32* %4
store i32 %118, i32* %21
store i32 %127, i32* %24
store i32 %130, i32* %25
br label %144
144: ; preds = %124, %105, %99, %70, %40, %6, %134
%145 = phi i32 [ 0, %134 ], [ -1, %6 ], [ -2, %40 ], [ -3, %70 ], [ -4, %99 ], [ -5, %105 ], [ -6, %124 ]
ret i32 %145
}