int faceintersection(const int *a1, const int *a2, const int *b1,
                     const int *b2) {
  return ((a1[0]) > (b1[0]) ? (a1[0]) : (b1[0])) <
             ((a1[1]) < (b1[1]) ? (a1[1]) : (b1[1])) ||
         ((a2[0]) > (b2[0]) ? (a2[0]) : (b2[0])) <
             ((a2[1]) < (b2[1]) ? (a2[1]) : (b2[1])) ||
         (((a1[0] > b1[0]) && (a2[0] < b2[0])) ||
          ((a1[0] < b1[0]) && (a2[0] > b2[0]))) ||
         (((a1[1] > b1[1]) && (a2[1] < b2[1])) ||
          ((a1[1] < b1[1]) && (a2[1] > b2[1])));
}


x86 assembly (clang, -O0):
<faceintersection>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    (%rcx),%eax
jle    1134 <faceintersection+0x34>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    113d <faceintersection+0x3d>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    0x4(%rcx),%eax
jge    1166 <faceintersection+0x66>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x2c(%rbp)
jmp    1170 <faceintersection+0x70>
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x2c(%rbp),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x2d(%rbp)
jl     12aa <faceintersection+0x1aa>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%eax
jle    11a3 <faceintersection+0xa3>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
jmp    11ac <faceintersection+0xac>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x20(%rbp),%rcx
cmp    0x4(%rcx),%eax
jge    11d5 <faceintersection+0xd5>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x3c(%rbp)
jmp    11df <faceintersection+0xdf>
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x3c(%rbp),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x2d(%rbp)
jl     12aa <faceintersection+0x1aa>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    (%rcx),%eax
jle    121b <faceintersection+0x11b>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
mov    -0x20(%rbp),%rdx
mov    $0x1,%al
cmp    (%rdx),%ecx
mov    %al,-0x2d(%rbp)
jl     12aa <faceintersection+0x1aa>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    (%rcx),%eax
jge    1244 <faceintersection+0x144>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
mov    -0x20(%rbp),%rdx
mov    $0x1,%al
cmp    (%rdx),%ecx
mov    %al,-0x2d(%rbp)
jg     12aa <faceintersection+0x1aa>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x18(%rbp),%rcx
cmp    0x4(%rcx),%eax
jle    1271 <faceintersection+0x171>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x20(%rbp),%rdx
mov    $0x1,%al
cmp    0x4(%rdx),%ecx
mov    %al,-0x3d(%rbp)
jl     12a4 <faceintersection+0x1a4>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x18(%rbp),%rdx
xor    %eax,%eax
cmp    0x4(%rdx),%ecx
mov    %al,-0x3e(%rbp)
jge    129e <faceintersection+0x19e>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x20(%rbp),%rcx
cmp    0x4(%rcx),%eax
setg   %al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<faceintersection>:
push   %rbp
push   %rbx
mov    (%rdi),%r8d
mov    0x4(%rdi),%r9d
mov    (%rdx),%ebx
mov    0x4(%rdx),%ebp
cmp    %ebx,%r8d
mov    %ebx,%edi
cmovg  %r8d,%edi
cmp    %ebp,%r9d
mov    %ebp,%edx
cmovl  %r9d,%edx
mov    $0x1,%eax
cmp    %edx,%edi
jl     1180 <faceintersection+0x80>
mov    (%rsi),%r10d
mov    0x4(%rsi),%r11d
mov    (%rcx),%esi
mov    0x4(%rcx),%ecx
cmp    %esi,%r10d
mov    %esi,%edx
cmovg  %r10d,%edx
cmp    %ecx,%r11d
mov    %ecx,%edi
cmovl  %r11d,%edi
cmp    %edi,%edx
jl     1180 <faceintersection+0x80>
cmp    %ebx,%r8d
jle    1155 <faceintersection+0x55>
cmp    %esi,%r10d
jl     1180 <faceintersection+0x80>
cmp    %ebx,%r8d
jge    115f <faceintersection+0x5f>
cmp    %esi,%r10d
jg     1180 <faceintersection+0x80>
cmp    %ebp,%r9d
setg   %al
xor    %edx,%edx
cmp    %ecx,%r11d
setl   %cl
setg   %dl
and    %al,%cl
cmp    %ebp,%r9d
movzbl %cl,%eax
cmovge %eax,%edx
or     %dl,%al
movzbl %al,%eax
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @faceintersection(i32* nocapture %0, i32* nocapture %1, i32* nocapture %2, i32* nocapture %3) {
%5 = load i32, i32* %0
%6 = load i32, i32* %2
%7 = icmp sgt i32 %5, %6
%8 = select i1 %7, i32 %5, i32 %6
%9 = getelementptr inbounds i32, i32* %0, i64 1
%10 = load i32, i32* %9
%11 = getelementptr inbounds i32, i32* %2, i64 1
%12 = load i32, i32* %11
%13 = icmp slt i32 %10, %12
%14 = select i1 %13, i32 %10, i32 %12
%15 = icmp slt i32 %8, %14
br i1 %15, label %43, label %16
16: ; preds = %4
%17 = load i32, i32* %1
%18 = load i32, i32* %3
%19 = icmp sgt i32 %17, %18
%20 = select i1 %19, i32 %17, i32 %18
%21 = getelementptr inbounds i32, i32* %1, i64 1
%22 = load i32, i32* %21
%23 = getelementptr inbounds i32, i32* %3, i64 1
%24 = load i32, i32* %23
%25 = icmp slt i32 %22, %24
%26 = select i1 %25, i32 %22, i32 %24
%27 = icmp slt i32 %20, %26
br i1 %27, label %43, label %28
28: ; preds = %16
%29 = icmp slt i32 %17, %18
%30 = select i1 %7, i1 %29, i1 false
br i1 %30, label %43, label %31
31: ; preds = %28
%32 = icmp sge i32 %5, %6
%33 = xor i1 %19, true
%34 = select i1 %32, i1 true, i1 %33
br i1 %34, label %35, label %43
35: ; preds = %31
%36 = icmp sgt i32 %10, %12
%37 = select i1 %36, i1 %25, i1 false
%38 = xor i1 %13, true
%39 = or i1 %37, %38
%40 = icmp sgt i32 %22, %24
%41 = select i1 %39, i1 %37, i1 %40
%42 = zext i1 %41 to i32
br label %43
43: ; preds = %35, %31, %28, %16, %4
%44 = phi i32 [ 1, %16 ], [ 1, %4 ], [ 1, %28 ], [ 1, %31 ], [ %42, %35 ]
ret i32 %44
}