void YUV422To420(unsigned char yuv422[], unsigned char yuv420[],
                 unsigned int width, unsigned int height) {
  unsigned int ynum = width * height;
  unsigned int i, j, k = 0;
  for (i = 0; i < ynum; i++) {
    yuv420[i] = yuv422[i << 1];
  }
  unsigned int length = width >> 1;
  unsigned int length2 = width << 1;
  unsigned offset = 0;
  for (j = 0; j < height; j += 2) {
    unsigned int start = j * length2;
    for (k = 0; k < length; k++) {
      offset = start + k * 4;
      yuv420[i++] = yuv422[offset + 1];
      yuv420[i++] = yuv422[offset + 3];
    }
  }
}


x86 assembly (clang, -O0):
<YUV422To420>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    115d <YUV422To420+0x5d>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    112a <YUV422To420+0x2a>
mov    -0x14(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jae    121b <YUV422To420+0x11b>
mov    -0x24(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jae    1208 <YUV422To420+0x108>
mov    -0x38(%rbp),%eax
mov    -0x28(%rbp),%ecx
shl    $0x2,%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x20(%rbp)
mov    %ecx,%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x20(%rbp)
mov    %ecx,%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    119a <YUV422To420+0x9a>
jmp    120d <YUV422To420+0x10d>
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    117d <YUV422To420+0x7d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<YUV422To420>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %ecx,%r15d
imul   %edx,%r15d
test   %r15d,%r15d
je     12b7 <YUV422To420+0x1b7>
mov    %r15d,%r8d
xor    %r9d,%r9d
cmp    $0x9,%r15d
jb     1224 <YUV422To420+0x124>
movabs $0xffffffff7fffffff,%rax
ff ff ff
add    %r8,%rax
cmp    $0xffffffff80000000,%rax
jb     1224 <YUV422To420+0x124>
lea    (%rdi,%r8,2),%rax
add    $0xffffffffffffffff,%rax
cmp    %rsi,%rax
jbe    1161 <YUV422To420+0x61>
lea    (%rsi,%r8,1),%rax
cmp    %rdi,%rax
jbe    1161 <YUV422To420+0x61>
xor    %r9d,%r9d
jmp    1224 <YUV422To420+0x124>
cmp    $0x11,%r15d
jae    116c <YUV422To420+0x6c>
xor    %r9d,%r9d
jmp    11d4 <YUV422To420+0xd4>
mov    %r8d,%ebp
and    $0xf,%ebp
test   %rbp,%rbp
mov    $0x10,%r10d
cmovne %rbp,%r10
mov    %r8,%r9
sub    %r10,%r9
xor    %eax,%eax
movdqa 0xe71(%rip),%xmm0
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %eax,%ebp
and    $0xffffffe0,%ebp
movdqu (%rdi,%rbp,1),%xmm1
movdqu 0x10(%rdi,%rbp,1),%xmm2
pand   %xmm0,%xmm2
pand   %xmm0,%xmm1
packuswb %xmm2,%xmm1
movdqu %xmm1,(%rsi,%rbx,1)
add    $0x10,%rbx
add    $0x20,%rax
cmp    %rbx,%r9
jne    11a0 <YUV422To420+0xa0>
cmp    $0x9,%r10d
jb     1224 <YUV422To420+0x124>
mov    %r8d,%eax
and    $0x7,%eax
test   %rax,%rax
mov    $0x8,%ebp
cmovne %rax,%rbp
mov    %r9,%rax
mov    %r8,%r9
sub    %rbp,%r9
lea    (%rax,%rax,1),%rbx
movdqa 0xe05(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
mov    %ebx,%ebp
and    $0xfffffffe,%ebp
movdqu (%rdi,%rbp,1),%xmm1
pand   %xmm0,%xmm1
packuswb %xmm1,%xmm1
movq   %xmm1,(%rsi,%rax,1)
add    $0x8,%rax
add    $0x10,%rbx
cmp    %rax,%r9
jne    1200 <YUV422To420+0x100>
mov    %r8d,%ebp
sub    %r9d,%ebp
mov    %r9,%r10
not    %r10
add    %r8,%r10
and    $0x3,%rbp
je     125b <YUV422To420+0x15b>
lea    (%r9,%r9,1),%rax
nopl   (%rax)
mov    %eax,%ebx
and    $0xfffffffe,%ebx
movzbl (%rdi,%rbx,1),%ebx
mov    %bl,(%rsi,%r9,1)
add    $0x1,%r9
add    $0x2,%rax
add    $0xffffffffffffffff,%rbp
jne    1240 <YUV422To420+0x140>
cmp    $0x3,%r10
jb     12b7 <YUV422To420+0x1b7>
lea    (%r9,%r9,1),%rbp
cs nopw 0x0(%rax,%rax,1)
nop
mov    %ebp,%eax
and    $0xfffffffe,%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,(%rsi,%r9,1)
lea    0x2(%rbp),%eax
and    $0xfffffffe,%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,0x1(%rsi,%r9,1)
lea    0x4(%rbp),%eax
and    $0xfffffffe,%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,0x2(%rsi,%r9,1)
lea    0x6(%rbp),%eax
and    $0xfffffffe,%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,0x3(%rsi,%r9,1)
add    $0x4,%r9
add    $0x8,%rbp
cmp    %r9,%r8
jne    1270 <YUV422To420+0x170>
test   %ecx,%ecx
je     13c5 <YUV422To420+0x2c5>
lea    (%rdx,%rdx,1),%eax
mov    %eax,-0x4(%rsp)
mov    %edx,%eax
shr    %eax
cmp    $0x2,%eax
mov    $0x1,%r9d
cmovae %eax,%r9d
lea    0x0(,%rdx,4),%r10d
lea    0x0(,%r9,4),%r11
and    $0xfffffffffffffff8,%r11
xor    %r12d,%r12d
xor    %r14d,%r14d
jmp    1310 <YUV422To420+0x210>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x2,%r14d
add    %r10,%r12
cmp    %ecx,%r14d
jae    13c5 <YUV422To420+0x2c5>
cmp    $0x2,%edx
jb     1300 <YUV422To420+0x200>
cmp    $0x4,%edx
jae    1320 <YUV422To420+0x220>
xor    %ebp,%ebp
jmp    1388 <YUV422To420+0x288>
xchg   %ax,%ax
xor    %eax,%eax
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    (%r12,%rax,1),%ebx
add    $0x1,%ebx
movzbl (%rdi,%rbx,1),%ebx
lea    0x1(%r15),%r13d
mov    %r15d,%r8d
mov    %bl,(%rsi,%r8,1)
lea    0x3(%r12,%rax,1),%ebx
movzbl (%rdi,%rbx,1),%ebx
lea    0x2(%r15),%r8d
mov    %bl,(%rsi,%r13,1)
lea    0x5(%r12,%rax,1),%ebx
movzbl (%rdi,%rbx,1),%ebx
lea    0x3(%r15),%r13d
mov    %bl,(%rsi,%r8,1)
lea    (%r12,%rax,1),%ebx
add    $0x7,%ebx
movzbl (%rdi,%rbx,1),%ebx
add    $0x4,%r15d
mov    %bl,(%rsi,%r13,1)
add    $0x2,%rbp
add    $0x8,%rax
cmp    %rax,%r11
jne    1330 <YUV422To420+0x230>
test   $0x1,%r9b
je     1300 <YUV422To420+0x200>
mov    -0x4(%rsp),%eax
imul   %r14d,%eax
lea    (%rax,%rbp,4),%ebp
mov    %rbp,%rax
or     $0x1,%rax
mov    (%rdi,%rax,1),%al
lea    0x1(%r15),%r8d
mov    %r15d,%ebx
mov    %al,(%rsi,%rbx,1)
or     $0x3,%rbp
mov    (%rdi,%rbp,1),%al
add    $0x2,%r15d
mov    %al,(%rsi,%r8,1)
jmp    1300 <YUV422To420+0x200>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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