#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 */
typedef int /*<<< orphan*/ u_char;

/* Variables and functions */
int /*<<< orphan*/ memcpy(int /*<<< orphan*/ *, int /*<<< orphan*/ *, int);
int /*<<< orphan*/ memmove(int /*<<< orphan*/ *, int /*<<< orphan*/ *, int);
int /*<<< orphan*/ memset(int /*<<< orphan*/ *, int, int);
void vertical_shift(u_char *y, int vshift, int w, int ws, int h, int blk) {
  if (w == ws) {
    if (vshift > 0) {
      memmove(y + vshift * ws, y, (h - vshift) * ws);
      memset(y, blk, vshift * ws);
    } else {
      memmove(y, y - vshift * ws, (h + vshift) * ws);
      memset(y + (h + vshift) * ws, blk, -vshift * w);
    }
  } else {
    u_char *dst, *src;
    int i, n;
    if (vshift > 0) {
      dst = y + (h - 1) * ws;
      src = dst - vshift * ws;
      n = h - vshift;
      for (i = 0; i < n; i++, (dst -= ws), (src -= ws))
        memcpy(dst, src, w);
      for (; i < h; i++, dst -= ws)
        memset(dst, blk, w);
    } else {
      dst = y;
      src = y - vshift * ws;
      n = h + vshift;
      for (i = 0; i < n; i++, (dst += ws), (src += ws))
        memcpy(dst, src, w);
      for (; i < h; i++, dst += ws)
        memset(dst, blk, w);
    }
  }
}


x86 assembly (clang, -O0):
<vertical_shift>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    11fc <vertical_shift+0xcc>
cmpl   $0x0,-0xc(%rbp)
jle    11a2 <vertical_shift+0x72>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%eax
imul   -0x14(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
mov    -0x18(%rbp),%edx
sub    -0xc(%rbp),%edx
imul   -0x14(%rbp),%edx
call   1050 <memmove@plt>
mov    -0x8(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    -0xc(%rbp),%edx
imul   -0x14(%rbp),%edx
call   1030 <memset@plt>
jmp    11f7 <vertical_shift+0xc7>
mov    -0x8(%rbp),%rdi
mov    -0x8(%rbp),%rsi
mov    -0xc(%rbp),%eax
imul   -0x14(%rbp),%eax
movslq %eax,%rcx
xor    %eax,%eax
sub    %rcx,%rax
shl    $0x2,%rax
add    %rax,%rsi
mov    -0x18(%rbp),%edx
add    -0xc(%rbp),%edx
imul   -0x14(%rbp),%edx
call   1050 <memmove@plt>
mov    -0x8(%rbp),%rdi
mov    -0x18(%rbp),%eax
add    -0xc(%rbp),%eax
imul   -0x14(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x1c(%rbp),%esi
xor    %edx,%edx
sub    -0xc(%rbp),%edx
imul   -0x10(%rbp),%edx
call   1030 <memset@plt>
jmp    13d2 <vertical_shift+0x2a2>
cmpl   $0x0,-0xc(%rbp)
jle    12fb <vertical_shift+0x1cb>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x14(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    -0xc(%rbp),%ecx
imul   -0x14(%rbp),%ecx
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    12ae <vertical_shift+0x17e>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x10(%rbp),%edx
call   1040 <memcpy@plt>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1250 <vertical_shift+0x120>
jmp    12b3 <vertical_shift+0x183>
mov    -0x34(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    12f6 <vertical_shift+0x1c6>
mov    -0x28(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    -0x10(%rbp),%edx
call   1030 <memset@plt>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    12b3 <vertical_shift+0x183>
jmp    13cd <vertical_shift+0x29d>
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
imul   -0x14(%rbp),%ecx
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    1385 <vertical_shift+0x255>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x10(%rbp),%edx
call   1040 <memcpy@plt>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1331 <vertical_shift+0x201>
jmp    138a <vertical_shift+0x25a>
mov    -0x34(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    13c8 <vertical_shift+0x298>
mov    -0x28(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    -0x10(%rbp),%edx
call   1030 <memset@plt>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    138a <vertical_shift+0x25a>
jmp    13cd <vertical_shift+0x29d>
jmp    13d2 <vertical_shift+0x2a2>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<vertical_shift>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9d,%r13d
mov    %r8d,%r15d
mov    %edx,%ebx
mov    %rdi,%rbp
cmp    %ecx,%edx
jne    1182 <vertical_shift+0x52>
mov    %ebx,%eax
imul   %esi,%eax
movslq %eax,%r12
test   %esi,%esi
jle    1204 <vertical_shift+0xd4>
lea    0x0(,%r12,4),%rdi
add    %rbp,%rdi
sub    %esi,%r15d
imul   %ebx,%r15d
mov    %rbp,%rsi
mov    %r15d,%edx
call   1050 <memmove@plt>
mov    %rbp,%rdi
jmp    1238 <vertical_shift+0x108>
test   %esi,%esi
jle    1251 <vertical_shift+0x121>
lea    -0x1(%r15),%eax
imul   %ecx,%eax
cltq
lea    0x0(%rbp,%rax,4),%rbp
mov    %r15d,%r14d
sub    %esi,%r14d
test   %r14d,%r14d
jle    12bf <vertical_shift+0x18f>
mov    %r13d,0xc(%rsp)
imul   %ecx,%esi
movslq %esi,%r13
mov    %ecx,0x10(%rsp)
movslq %ecx,%r12
shl    $0x2,%r13
neg    %r13
shl    $0x2,%r12
neg    %r12
mov    %r14d,0x8(%rsp)
nopl   0x0(%rax)
mov    %rbp,%rsi
add    %r13,%rsi
mov    %rbp,%rdi
mov    %ebx,%edx
call   1040 <memcpy@plt>
add    %r12,%rbp
add    $0xffffffff,%r14d
jne    11d0 <vertical_shift+0xa0>
mov    0xc(%rsp),%r13d
mov    0x10(%rsp),%ecx
mov    0x8(%rsp),%eax
cmp    %r15d,%eax
jl     12c6 <vertical_shift+0x196>
jmp    1326 <vertical_shift+0x1f6>
lea    0x0(,%r12,4),%rcx
mov    %rbp,%rax
sub    %rcx,%rax
add    %esi,%r15d
imul   %ebx,%r15d
mov    %rbp,%rdi
mov    %rax,%rsi
mov    %r15d,%edx
call   1050 <memmove@plt>
movslq %r15d,%rax
lea    0x0(,%rax,4),%rdi
add    %rbp,%rdi
neg    %r12d
mov    %r13d,%esi
mov    %r12d,%edx
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <memset@plt>
lea    (%r15,%rsi,1),%edx
movslq %ecx,%r14
test   %edx,%edx
jle    12f8 <vertical_shift+0x1c8>
mov    %r14,%rax
mov    %ebx,%r14d
mov    %r13d,0xc(%rsp)
imul   %esi,%ecx
movslq %ecx,%r12
shl    $0x2,%r12
neg    %r12
mov    %rax,0x10(%rsp)
lea    0x0(,%rax,4),%r13
mov    %edx,0x8(%rsp)
mov    %edx,%ebx
nopl   0x0(%rax,%rax,1)
lea    (%r12,%rbp,1),%rsi
mov    %rbp,%rdi
mov    %r14d,%edx
call   1040 <memcpy@plt>
add    %r13,%rbp
add    $0xffffffff,%ebx
jne    1290 <vertical_shift+0x160>
mov    0xc(%rsp),%r13d
mov    %r14d,%ebx
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%eax
cmp    %r15d,%eax
jl     12ff <vertical_shift+0x1cf>
jmp    1326 <vertical_shift+0x1f6>
xor    %eax,%eax
cmp    %r15d,%eax
jge    1326 <vertical_shift+0x1f6>
movslq %ecx,%r12
sub    %eax,%r15d
shl    $0x2,%r12
neg    %r12
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rbp,%rdi
mov    %r13d,%esi
mov    %ebx,%edx
call   1030 <memset@plt>
add    %r12,%rbp
add    $0xffffffff,%r15d
jne    12e0 <vertical_shift+0x1b0>
jmp    1326 <vertical_shift+0x1f6>
xor    %eax,%eax
cmp    %r15d,%eax
jge    1326 <vertical_shift+0x1f6>
sub    %eax,%r15d
shl    $0x2,%r14
cs nopw 0x0(%rax,%rax,1)
mov    %rbp,%rdi
mov    %r13d,%esi
mov    %ebx,%edx
call   1030 <memset@plt>
add    %r14,%rbp
add    $0xffffffff,%r15d
jne    1310 <vertical_shift+0x1e0>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @vertical_shift(i32* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = icmp eq i32 %2, %3
%8 = icmp sgt i32 %1, 0
br i1 %7, label %9, label %28
9: ; preds = %6
%10 = mul i32 %2, %1
%11 = sext i32 %10 to i64
br i1 %8, label %12, label %18
12: ; preds = %9
%13 = getelementptr inbounds i32, i32* %0, i64 %11
%14 = sub nsw i32 %4, %1
%15 = mul nsw i32 %14, %2
%16 = tail call i32 @memmove(i32* %13, i32* %0, i32 %15)
%17 = tail call i32 @memset(i32* %0, i32 %5, i32 %10)
br label %97
18: ; preds = %9
%19 = sub nsw i64 0, %11
%20 = getelementptr inbounds i32, i32* %0, i64 %19
%21 = add nsw i32 %4, %1
%22 = mul nsw i32 %21, %2
%23 = tail call i32 @memmove(i32* %0, i32* %20, i32 %22)
%24 = sext i32 %22 to i64
%25 = getelementptr inbounds i32, i32* %0, i64 %24
%26 = sub i32 0, %10
%27 = tail call i32 @memset(i32* %25, i32 %5, i32 %26)
br label %97
28: ; preds = %6
br i1 %8, label %29, label %66
29: ; preds = %28
%30 = add nsw i32 %4, -1
%31 = mul nsw i32 %30, %3
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i32, i32* %0, i64 %32
%34 = sub i32 %4, %1
%35 = icmp sgt i32 %34, 0
br i1 %35, label %36, label %43
36: ; preds = %29
%37 = mul nsw i32 %3, %1
%38 = sext i32 %37 to i64
%39 = sub nsw i64 0, %38
%40 = getelementptr inbounds i32, i32* %33, i64 %39
%41 = sext i32 %3 to i64
%42 = sub nsw i64 0, %41
br label %50
43: ; preds = %50, %29
%44 = phi i32* [ %33, %29 ], [ %56, %50 ]
%45 = phi i32 [ 0, %29 ], [ %34, %50 ]
%46 = icmp slt i32 %45, %4
br i1 %46, label %47, label %97
47: ; preds = %43
%48 = sext i32 %3 to i64
%49 = sub nsw i64 0, %48
br label %59
50: ; preds = %36, %50
%51 = phi i32 [ 0, %36 ], [ %55, %50 ]
%52 = phi i32* [ %40, %36 ], [ %57, %50 ]
%53 = phi i32* [ %33, %36 ], [ %56, %50 ]
%54 = tail call i32 @memcpy(i32* %53, i32* %52, i32 %2)
%55 = add nuw nsw i32 %51, 1
%56 = getelementptr inbounds i32, i32* %53, i64 %42
%57 = getelementptr inbounds i32, i32* %52, i64 %42
%58 = icmp eq i32 %55, %34
br i1 %58, label %43, label %50
59: ; preds = %47, %59
%60 = phi i32 [ %45, %47 ], [ %63, %59 ]
%61 = phi i32* [ %44, %47 ], [ %64, %59 ]
%62 = tail call i32 @memset(i32* %61, i32 %5, i32 %2)
%63 = add nuw i32 %60, 1
%64 = getelementptr inbounds i32, i32* %61, i64 %49
%65 = icmp eq i32 %63, %4
br i1 %65, label %97, label %59
66: ; preds = %28
%67 = add i32 %4, %1
%68 = icmp sgt i32 %67, 0
br i1 %68, label %69, label %75
69: ; preds = %66
%70 = mul nsw i32 %3, %1
%71 = sext i32 %70 to i64
%72 = sub nsw i64 0, %71
%73 = getelementptr inbounds i32, i32* %0, i64 %72
%74 = sext i32 %3 to i64
br label %81
75: ; preds = %81, %66
%76 = phi i32* [ %0, %66 ], [ %87, %81 ]
%77 = phi i32 [ 0, %66 ], [ %67, %81 ]
%78 = icmp slt i32 %77, %4
br i1 %78, label %79, label %97
79: ; preds = %75
%80 = sext i32 %3 to i64
br label %90
81: ; preds = %69, %81
%82 = phi i32 [ 0, %69 ], [ %86, %81 ]
%83 = phi i32* [ %73, %69 ], [ %88, %81 ]
%84 = phi i32* [ %0, %69 ], [ %87, %81 ]
%85 = tail call i32 @memcpy(i32* %84, i32* %83, i32 %2)
%86 = add nuw nsw i32 %82, 1
%87 = getelementptr inbounds i32, i32* %84, i64 %74
%88 = getelementptr inbounds i32, i32* %83, i64 %74
%89 = icmp eq i32 %86, %67
br i1 %89, label %75, label %81
90: ; preds = %79, %90
%91 = phi i32 [ %77, %79 ], [ %94, %90 ]
%92 = phi i32* [ %76, %79 ], [ %95, %90 ]
%93 = tail call i32 @memset(i32* %92, i32 %5, i32 %2)
%94 = add nuw i32 %91, 1
%95 = getelementptr inbounds i32, i32* %92, i64 %80
%96 = icmp eq i32 %94, %4
br i1 %96, label %97, label %90
97: ; preds = %90, %59, %75, %43, %12, %18
ret void
}