int intersect_bands_with_or(int count1, const unsigned char (*edges1)[2],
                            int count2, const unsigned char (*edges2)[2],
                            unsigned char (*merged_edges)[2]) {
  int merged_count;
  merged_count = 0;
  for (; count1; edges1++, count1--) {
    unsigned char accumulated[2];
    if (count2 <= 0) {
      count2 = count1;
      edges2 = edges1;
      break;
    }
    if (edges1[0][0] > edges2[0][0]) {
      int temp_count;
      const unsigned char(*temp_edges)[2];
      temp_count = count1;
      temp_edges = edges1;
      count1 = count2;
      edges1 = edges2;
      count2 = temp_count;
      edges2 = temp_edges;
    }
    accumulated[0] = edges1[0][0];
    accumulated[1] = edges1[0][1];
    for (;; edges2++, count2--) {
      if (count2 > 0) {
        if (!accumulated[1])
          continue;
        if (edges2[0][0] <= accumulated[1]) {
          if (((edges2[0][1] - 1) & 0xFF) > ((accumulated[1] - 1) & 0xFF))
            accumulated[1] = edges2[0][1];
          continue;
        }
      }
      if (count1 - 1) {
        if (!accumulated[1]) {
          edges1++;
          count1--;
          edges2--;
          count2++;
          continue;
        }
        if (edges1[1][0] <= accumulated[1]) {
          if (((edges1[1][1] - 1) & 0xFF) > ((accumulated[1] - 1) & 0xFF))
            accumulated[1] = edges1[1][1];
          edges1++;
          count1--;
          edges2--;
          count2++;
          continue;
        }
      }
      break;
    }
    merged_edges[merged_count][0] = accumulated[0];
    merged_edges[merged_count++][1] = accumulated[1];
  }
  while (count2-- > 0) {
    merged_edges[merged_count][0] = edges2[0][0];
    merged_edges[merged_count][1] = edges2[0][1];
    merged_count++;
    edges2++;
  }
  return merged_count;
}


x86 assembly (clang, -O0):
<intersect_bands_with_or>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     131b <intersect_bands_with_or+0x21b>
cmpl   $0x0,-0x14(%rbp)
jg     1144 <intersect_bands_with_or+0x44>
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    131b <intersect_bands_with_or+0x21b>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    -0x20(%rbp),%rcx
movzbl (%rcx),%ecx
cmp    %ecx,%eax
jle    1184 <intersect_bands_with_or+0x84>
mov    -0x4(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x2e(%rbp)
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x2d(%rbp)
cmpl   $0x0,-0x14(%rbp)
jle    11fc <intersect_bands_with_or+0xfc>
cmpb   $0x0,-0x2d(%rbp)
jne    11b0 <intersect_bands_with_or+0xb0>
jmp    12c0 <intersect_bands_with_or+0x1c0>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x2d(%rbp),%ecx
cmp    %ecx,%eax
jg     11f7 <intersect_bands_with_or+0xf7>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
sub    $0x1,%eax
and    $0xff,%eax
movzbl -0x2d(%rbp),%ecx
sub    $0x1,%ecx
and    $0xff,%ecx
cmp    %ecx,%eax
jle    11f2 <intersect_bands_with_or+0xf2>
mov    -0x20(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x2d(%rbp)
jmp    12c0 <intersect_bands_with_or+0x1c0>
jmp    11fc <intersect_bands_with_or+0xfc>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
cmp    $0x0,%eax
je     12bb <intersect_bands_with_or+0x1bb>
cmpb   $0x0,-0x2d(%rbp)
jne    1244 <intersect_bands_with_or+0x144>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffffe,%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12c0 <intersect_bands_with_or+0x1c0>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
movzbl -0x2d(%rbp),%ecx
cmp    %ecx,%eax
jg     12b6 <intersect_bands_with_or+0x1b6>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
sub    $0x1,%eax
and    $0xff,%eax
movzbl -0x2d(%rbp),%ecx
sub    $0x1,%ecx
and    $0xff,%ecx
cmp    %ecx,%eax
jle    1287 <intersect_bands_with_or+0x187>
mov    -0x10(%rbp),%rax
mov    0x3(%rax),%al
mov    %al,-0x2d(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffffe,%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12c0 <intersect_bands_with_or+0x1c0>
jmp    12bb <intersect_bands_with_or+0x1bb>
jmp    12da <intersect_bands_with_or+0x1da>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1197 <intersect_bands_with_or+0x97>
mov    -0x2e(%rbp),%dl
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,2)
mov    -0x2d(%rbp),%dl
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %dl,0x1(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    111d <intersect_bands_with_or+0x1d>
jmp    1320 <intersect_bands_with_or+0x220>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jle    1372 <intersect_bands_with_or+0x272>
mov    -0x20(%rbp),%rax
mov    (%rax),%dl
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,(%rax,%rcx,2)
mov    -0x20(%rbp),%rax
mov    0x1(%rax),%dl
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dl,0x1(%rax,%rcx,2)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
jmp    1320 <intersect_bands_with_or+0x220>
mov    -0x2c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<intersect_bands_with_or>:
push   %rbp
push   %rbx
xor    %eax,%eax
test   %edi,%edi
je     11f9 <intersect_bands_with_or+0xf9>
test   %edx,%edx
jle    1299 <intersect_bands_with_or+0x199>
mov    (%rsi),%r10b
mov    (%rcx),%r9b
cmp    %r9b,%r10b
jbe    1130 <intersect_bands_with_or+0x30>
mov    %rsi,%r10
mov    %edi,%r11d
mov    %rcx,%rsi
mov    %r10,%rcx
jmp    1138 <intersect_bands_with_or+0x38>
nopl   (%rax)
mov    %r10d,%r9d
mov    %edx,%r11d
mov    %edi,%edx
mov    %edx,%edi
mov    0x1(%rsi),%r10b
mov    %r11d,%edx
jmp    1168 <intersect_bands_with_or+0x68>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x2,%rsi
add    $0xffffffff,%edi
add    $0xfffffffffffffffe,%rcx
add    $0x1,%edx
xor    %r10d,%r10d
add    $0x2,%rcx
add    $0xffffffff,%edx
test   %edx,%edx
jle    1176 <intersect_bands_with_or+0x76>
test   %r10b,%r10b
je     115e <intersect_bands_with_or+0x5e>
cmp    %r10b,(%rcx)
jbe    11ad <intersect_bands_with_or+0xad>
cmp    $0x1,%edi
je     11ec <intersect_bands_with_or+0xec>
test   %r10b,%r10b
je     1150 <intersect_bands_with_or+0x50>
cmp    %r10b,0x2(%rsi)
ja     11d0 <intersect_bands_with_or+0xd0>
movzbl 0x3(%rsi),%ebp
add    $0x2,%rsi
lea    -0x1(%rbp),%r11d
lea    -0x1(%r10),%ebx
cmp    %bl,%r11b
movzbl %r10b,%r10d
cmova  %ebp,%r10d
add    $0xffffffff,%edi
add    $0xfffffffffffffffe,%rcx
add    $0x1,%edx
jmp    1161 <intersect_bands_with_or+0x61>
movzbl 0x1(%rcx),%r11d
lea    -0x1(%r11),%ebx
lea    -0x1(%r10),%ebp
cmp    %bpl,%bl
movzbl %r10b,%r10d
cmova  %r11d,%r10d
jmp    1161 <intersect_bands_with_or+0x61>
nopw   0x0(%rax,%rax,1)
mov    %r9b,(%r8,%rax,2)
mov    %r10b,0x1(%r8,%rax,2)
add    $0x1,%rax
add    $0x2,%rsi
add    $0xffffffff,%edi
jne    110c <intersect_bands_with_or+0xc>
jmp    11f9 <intersect_bands_with_or+0xf9>
mov    %r9b,(%r8,%rax,2)
mov    %r10b,0x1(%r8,%rax,2)
add    $0x1,%rax
test   %edx,%edx
jle    1260 <intersect_bands_with_or+0x160>
mov    %eax,%eax
lea    -0x1(%rdx),%r9d
cmp    $0x7,%r9d
jb     122b <intersect_bands_with_or+0x12b>
lea    (%r8,%rax,2),%r10
lea    (%rcx,%r9,2),%rsi
add    $0x2,%rsi
cmp    %rsi,%r10
jae    1263 <intersect_bands_with_or+0x163>
lea    (%rax,%r9,1),%rsi
lea    (%r8,%rsi,2),%rsi
add    $0x2,%rsi
cmp    %rsi,%rcx
jae    1263 <intersect_bands_with_or+0x163>
mov    %rcx,%rsi
add    $0x1,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rsi),%ecx
mov    %cl,(%r8,%rax,2)
movzbl 0x1(%rsi),%ecx
mov    %cl,0x1(%r8,%rax,2)
add    $0x1,%rax
add    $0xffffffff,%edx
add    $0x2,%rsi
cmp    $0x1,%edx
ja     1240 <intersect_bands_with_or+0x140>
pop    %rbx
pop    %rbp
ret
add    $0x1,%r9
mov    %r9,%r11
and    $0xfffffffffffffff8,%r11
add    %r11,%rax
sub    %r11d,%edx
lea    (%rcx,%r11,2),%rsi
xor    %edi,%edi
nopw   0x0(%rax,%rax,1)
movups (%rcx,%rdi,2),%xmm0
movups %xmm0,(%r10,%rdi,2)
add    $0x8,%rdi
cmp    %rdi,%r11
jne    1280 <intersect_bands_with_or+0x180>
cmp    %r11,%r9
je     1260 <intersect_bands_with_or+0x160>
jmp    122e <intersect_bands_with_or+0x12e>
mov    %rsi,%rcx
mov    %edi,%edx
test   %edx,%edx
jg     11fd <intersect_bands_with_or+0xfd>
jmp    1260 <intersect_bands_with_or+0x160>

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

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