#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 */

/* Variables and functions */
int /*<<< orphan*/ printf(char *, unsigned char, char);
void comb(int m, int n, unsigned char *c) {
  int i;
  for (i = 0; i < n; i++)
    c[i] = n - i;
  while (1) {
    for (i = n; i--;)
      printf("%d%c", c[i], i ? ' ' : '\n');
    if (c[i]++ < m)
      continue;
    for (i = 0; c[i] >= m - i;)
      if (++i >= n)
        return;
    for (c[i]++; i; i--)
      c[i - 1] = c[i] + 1;
  }
}


x86 assembly (clang, -O0):
<comb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1156 <comb+0x46>
mov    -0x8(%rbp),%eax
sub    -0x14(%rbp),%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1129 <comb+0x19>
jmp    115b <comb+0x4b>
mov    -0x8(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     11aa <comb+0x9a>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x14(%rbp),%esi
mov    $0xa,%eax
mov    $0x20,%edx
cmp    $0x0,%esi
cmovne %edx,%eax
lea    0xe66(%rip),%rdi
movzbl %cl,%esi
movsbl %al,%edx
call   1030 <printf@plt>
jmp    1161 <comb+0x51>
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
mov    (%rcx,%rdx,1),%al
mov    %al,%sil
add    $0x1,%sil
mov    %sil,(%rcx,%rdx,1)
movzbl %al,%eax
cmp    -0x4(%rbp),%eax
jge    11d1 <comb+0xc1>
jmp    115b <comb+0x4b>
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x4(%rbp),%ecx
sub    -0x14(%rbp),%ecx
cmp    %ecx,%eax
jl     120f <comb+0xff>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmp    -0x8(%rbp),%eax
jl     120a <comb+0xfa>
add    $0x20,%rsp
pop    %rbp
ret
jmp    11d8 <comb+0xc8>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
add    $0x1,%dl
mov    %dl,(%rax,%rcx,1)
cmpl   $0x0,-0x14(%rbp)
je     1259 <comb+0x149>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
add    $0x1,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1220 <comb+0x110>
jmp    115b <comb+0x4b>

x86 assembly (clang, -O2):
<comb>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rdx,%r13
test   %esi,%esi
jle    13e1 <comb+0x2d1>
mov    %esi,%eax
cmp    $0x10,%esi
jae    1137 <comb+0x27>
xor    %ecx,%ecx
jmp    13ca <comb+0x2ba>
mov    %eax,%ecx
and    $0xfffffff0,%ecx
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm8
lea    -0x10(%rcx),%rbp
mov    %rbp,%rdx
shr    $0x4,%rdx
add    $0x1,%rdx
mov    %edx,%r8d
and    $0x3,%r8d
cmp    $0x30,%rbp
jae    118c <comb+0x7c>
movdqa 0xe95(%rip),%xmm14
movdqa 0xe9c(%rip),%xmm15
movdqa 0xea3(%rip),%xmm10
movdqa 0xeab(%rip),%xmm4
xor    %ebp,%ebp
jmp    1336 <comb+0x226>
and    $0xfffffffffffffffc,%rdx
movdqa 0xe67(%rip),%xmm14
movdqa 0xe6e(%rip),%xmm15
movdqa 0xe75(%rip),%xmm10
movdqa 0xe7d(%rip),%xmm4
xor    %ebp,%ebp
movdqa 0xe82(%rip),%xmm13
movdqa 0xeb9(%rip),%xmm11
movdqa 0xe80(%rip),%xmm9
movdqa 0xe88(%rip),%xmm3
nopl   0x0(%rax,%rax,1)
movdqa %xmm8,%xmm12
psubd  %xmm14,%xmm12
movdqa %xmm8,%xmm6
psubd  %xmm15,%xmm6
movdqa %xmm8,%xmm2
psubd  %xmm10,%xmm2
movdqa %xmm8,%xmm1
psubd  %xmm4,%xmm1
movdqa %xmm1,%xmm7
pand   %xmm13,%xmm7
movdqa %xmm2,%xmm5
pand   %xmm13,%xmm5
packuswb %xmm5,%xmm7
movdqa %xmm6,%xmm5
pand   %xmm13,%xmm5
movdqa %xmm12,%xmm0
pand   %xmm13,%xmm0
packuswb %xmm0,%xmm5
packuswb %xmm5,%xmm7
movdqu %xmm7,0x0(%r13,%rbp,1)
movdqa %xmm12,%xmm0
psubd  %xmm9,%xmm0
movdqa %xmm2,%xmm5
psubd  %xmm9,%xmm5
movdqa %xmm1,%xmm7
psubd  %xmm9,%xmm7
pand   %xmm13,%xmm7
pand   %xmm13,%xmm5
packuswb %xmm5,%xmm7
movdqa %xmm6,%xmm5
psubd  %xmm9,%xmm5
pand   %xmm13,%xmm5
pand   %xmm13,%xmm0
packuswb %xmm0,%xmm5
packuswb %xmm5,%xmm7
movdqu %xmm7,0x10(%r13,%rbp,1)
movdqa %xmm12,%xmm0
psubd  %xmm3,%xmm0
movdqa %xmm2,%xmm5
psubd  %xmm3,%xmm5
movdqa %xmm1,%xmm7
psubd  %xmm3,%xmm7
pand   %xmm13,%xmm7
pand   %xmm13,%xmm5
packuswb %xmm5,%xmm7
movdqa %xmm6,%xmm5
psubd  %xmm3,%xmm5
pand   %xmm13,%xmm5
pand   %xmm13,%xmm0
packuswb %xmm0,%xmm5
packuswb %xmm5,%xmm7
movdqu %xmm7,0x20(%r13,%rbp,1)
movdqa 0xd95(%rip),%xmm0
psubd  %xmm0,%xmm2
psubd  %xmm0,%xmm1
pand   %xmm13,%xmm1
pand   %xmm13,%xmm2
packuswb %xmm2,%xmm1
psubd  %xmm0,%xmm12
psubd  %xmm0,%xmm6
pand   %xmm13,%xmm6
pand   %xmm13,%xmm12
packuswb %xmm12,%xmm6
packuswb %xmm6,%xmm1
movdqu %xmm1,0x30(%r13,%rbp,1)
add    $0x40,%rbp
paddd  %xmm11,%xmm4
paddd  %xmm11,%xmm10
paddd  %xmm11,%xmm15
paddd  %xmm11,%xmm14
add    $0xfffffffffffffffc,%rdx
jne    11e0 <comb+0xd0>
test   %r8,%r8
je     13c5 <comb+0x2b5>
add    %r13,%rbp
shl    $0x4,%r8
xor    %edx,%edx
movdqa 0xcf0(%rip),%xmm0
movdqa 0xcf8(%rip),%xmm5
nopl   0x0(%rax,%rax,1)
movdqa %xmm8,%xmm1
psubd  %xmm14,%xmm1
movdqa %xmm8,%xmm2
psubd  %xmm15,%xmm2
movdqa %xmm8,%xmm6
psubd  %xmm10,%xmm6
movdqa %xmm8,%xmm7
psubd  %xmm4,%xmm7
pand   %xmm0,%xmm7
pand   %xmm0,%xmm6
packuswb %xmm6,%xmm7
pand   %xmm0,%xmm2
pand   %xmm0,%xmm1
packuswb %xmm1,%xmm2
packuswb %xmm2,%xmm7
movdqu %xmm7,0x0(%rbp,%rdx,1)
paddd  %xmm5,%xmm4
paddd  %xmm5,%xmm10
paddd  %xmm5,%xmm15
paddd  %xmm5,%xmm14
add    $0x10,%rdx
cmp    %rdx,%r8
jne    1360 <comb+0x250>
cmp    %rax,%rcx
je     13e1 <comb+0x2d1>
mov    %esi,%edx
sub    %cl,%dl
xchg   %ax,%ax
mov    %dl,0x0(%r13,%rcx,1)
add    $0x1,%rcx
add    $0xff,%dl
cmp    %rcx,%rax
jne    13d0 <comb+0x2c0>
lea    -0x1(%rsi),%eax
cltq
mov    %rax,0x20(%rsp)
cmp    $0x2,%esi
mov    $0x1,%eax
cmovge %esi,%eax
mov    %rax,0x18(%rsp)
lea    -0x10(%r13),%rax
mov    %rax,0x10(%rsp)
lea    -0x1(%r13),%rax
mov    %rax,0x8(%rsp)
mov    $0xa,%r12d
lea    0xca6(%rip),%r15
mov    %edi,%ebx
mov    %rsi,%rbp
test   %esi,%esi
je     1451 <comb+0x341>
mov    0x20(%rsp),%r14
nopl   0x0(%rax,%rax,1)
movzbl 0x0(%r13,%r14,1),%esi
sub    $0x1,%r14
mov    $0x20,%edx
cmovb  %r12d,%edx
mov    %r15,%rdi
call   1030 <printf@plt>
cmp    $0xffffffffffffffff,%r14
jne    1430 <comb+0x320>
movzbl -0x1(%r13),%eax
lea    0x1(%rax),%ecx
mov    %cl,-0x1(%r13)
mov    %ebx,%edi
cmp    %ebx,%eax
mov    %rbp,%rsi
jl     141a <comb+0x30a>
mov    0x10(%rsp),%rbp
xor    %edx,%edx
mov    0x18(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl 0x0(%r13,%rdx,1),%eax
mov    %edi,%ecx
sub    %edx,%ecx
cmp    %eax,%ecx
jg     14a0 <comb+0x390>
add    $0x1,%rdx
add    $0x1,%rbp
cmp    %rbx,%rdx
jne    1480 <comb+0x370>
jmp    1624 <comb+0x514>
mov    %edx,%ecx
add    $0x1,%al
mov    %al,0x0(%r13,%rcx,1)
test   %edx,%edx
je     141a <comb+0x30a>
mov    0x0(%r13,%rdx,1),%cl
cmp    $0x20,%rdx
jae    14c4 <comb+0x3b4>
mov    %rdx,%r9
jmp    15b1 <comb+0x4a1>
mov    %rdx,%r8
movabs $0x7fffffffffffffe0,%rax
ff ff 7f
and    %rax,%r8
mov    %edx,%r9d
and    $0x1f,%r9d
movzbl %cl,%eax
add    %r8d,%ecx
movd   %eax,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddb  0xb95(%rip),%xmm0
mov    %rdx,%rbx
and    $0xffffffffffffffe0,%rbx
pcmpeqd %xmm4,%xmm4
movdqa 0xb92(%rip),%xmm5
pxor   %xmm6,%xmm6
movdqa 0xb96(%rip),%xmm7
nopw   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm1
psubb  %xmm4,%xmm1
movdqa %xmm0,%xmm2
paddb  %xmm5,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm6,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm6,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm1,0x0(%rbp)
movdqa %xmm2,%xmm1
punpcklbw %xmm6,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
punpckhbw %xmm6,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm1,%xmm2
movdqu %xmm2,-0x10(%rbp)
paddb  %xmm7,%xmm0
add    $0xffffffffffffffe0,%rbp
add    $0xffffffffffffffe0,%rbx
jne    1520 <comb+0x410>
cmp    %r8,%rdx
je     141a <comb+0x30a>
lea    -0x1(%r9),%rdx
mov    %r9,%rax
and    $0x3,%rax
je     15d2 <comb+0x4c2>
xchg   %ax,%ax
add    $0x1,%cl
mov    %cl,-0x1(%r13,%r9,1)
add    $0xffffffffffffffff,%r9
add    $0xffffffffffffffff,%rax
jne    15c0 <comb+0x4b0>
cmp    $0x3,%rdx
jb     141a <comb+0x30a>
movzbl %cl,%r8d
mov    0x8(%rsp),%rdx
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
lea    (%r8,%rbp,1),%eax
lea    0x1(%rax),%ecx
mov    %cl,(%rdx,%r9,1)
lea    0x2(%rax),%ecx
mov    %cl,-0x1(%rdx,%r9,1)
lea    0x3(%rax),%ecx
mov    %cl,-0x2(%rdx,%r9,1)
add    $0x4,%al
mov    %al,-0x3(%rdx,%r9,1)
add    $0x4,%rbp
add    $0xfffffffffffffffc,%rdx
cmp    %rbp,%r9
jne    15f0 <comb+0x4e0>
jmp    141a <comb+0x30a>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [5 x i8] c"%d%c\00"
define void @comb(i32 %0, i32 %1, i8* %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store i8* %2, i8** %6
store i32 0, i32* %7
br label %8
8: ; preds = %21, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %5
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %24
12: ; preds = %8
%13 = load i32, i32* %5
%14 = load i32, i32* %7
%15 = sub nsw i32 %13, %14
%16 = trunc i32 %15 to i8
%17 = load i8*, i8** %6
%18 = load i32, i32* %7
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %17, i64 %19
store i8 %16, i8* %20
br label %21
21: ; preds = %12
%22 = load i32, i32* %7
%23 = add nsw i32 %22, 1
store i32 %23, i32* %7
br label %8
24: ; preds = %8
br label %25
25: ; preds = %24, %53, %100
%26 = load i32, i32* %5
store i32 %26, i32* %7
br label %27
27: ; preds = %31, %25
%28 = load i32, i32* %7
%29 = add nsw i32 %28, -1
store i32 %29, i32* %7
%30 = icmp ne i32 %28, 0
br i1 %30, label %31, label %43
31: ; preds = %27
%32 = load i8*, i8** %6
%33 = load i32, i32* %7
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %32, i64 %34
%36 = load i8, i8* %35
%37 = load i32, i32* %7
%38 = icmp ne i32 %37, 0
%39 = zext i1 %38 to i64
%40 = select i1 %38, i32 32, i32 10
%41 = trunc i32 %40 to i8
%42 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8 zeroext %36, i8 signext %41)
br label %27
43: ; preds = %27
%44 = load i8*, i8** %6
%45 = load i32, i32* %7
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8, i8* %44, i64 %46
%48 = load i8, i8* %47
%49 = add i8 %48, 1
store i8 %49, i8* %47
%50 = zext i8 %48 to i32
%51 = load i32, i32* %4
%52 = icmp slt i32 %50, %51
br i1 %52, label %53, label %54
53: ; preds = %43
br label %25
54: ; preds = %43
store i32 0, i32* %7
br label %55
55: ; preds = %72, %54
%56 = load i8*, i8** %6
%57 = load i32, i32* %7
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %56, i64 %58
%60 = load i8, i8* %59
%61 = zext i8 %60 to i32
%62 = load i32, i32* %4
%63 = load i32, i32* %7
%64 = sub nsw i32 %62, %63
%65 = icmp sge i32 %61, %64
br i1 %65, label %66, label %73
66: ; preds = %55
%67 = load i32, i32* %7
%68 = add nsw i32 %67, 1
store i32 %68, i32* %7
%69 = load i32, i32* %5
%70 = icmp sge i32 %68, %69
br i1 %70, label %71, label %72
71: ; preds = %66
ret void
72: ; preds = %66
br label %55
73: ; preds = %55
%74 = load i8*, i8** %6
%75 = load i32, i32* %7
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8, i8* %74, i64 %76
%78 = load i8, i8* %77
%79 = add i8 %78, 1
store i8 %79, i8* %77
br label %80
80: ; preds = %97, %73
%81 = load i32, i32* %7
%82 = icmp ne i32 %81, 0
br i1 %82, label %83, label %100
83: ; preds = %80
%84 = load i8*, i8** %6
%85 = load i32, i32* %7
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = zext i8 %88 to i32
%90 = add nsw i32 %89, 1
%91 = trunc i32 %90 to i8
%92 = load i8*, i8** %6
%93 = load i32, i32* %7
%94 = sub nsw i32 %93, 1
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %92, i64 %95
store i8 %91, i8* %96
br label %97
97: ; preds = %83
%98 = load i32, i32* %7
%99 = add nsw i32 %98, -1
store i32 %99, i32* %7
br label %80
100: ; preds = %80
br label %25
}

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