#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 hf_rnd(unsigned char *buf, int num) {
  for (size_t v = 0; v < num; v++) {
    buf[v] = v + 1;
  }
  return 1;
}


x86 assembly (clang, -O0):
<hf_rnd>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
cmp    %rcx,%rax
jae    114a <hf_rnd+0x4a>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1113 <hf_rnd+0x13>
mov    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hf_rnd>:
test   %esi,%esi
je     13cf <hf_rnd+0x2cf>
movslq %esi,%rax
cmp    $0x10,%esi
jae    1117 <hf_rnd+0x17>
xor    %ecx,%ecx
jmp    13c0 <hf_rnd+0x2c0>
mov    %rax,%rcx
and    $0xfffffffffffffff0,%rcx
lea    -0x10(%rcx),%rsi
mov    %rsi,%rdx
shr    $0x4,%rdx
add    $0x1,%rdx
mov    %edx,%r8d
and    $0x3,%r8d
cmp    $0x30,%rsi
jae    1185 <hf_rnd+0x85>
movdqa 0xebd(%rip),%xmm12
movdqa 0xec4(%rip),%xmm15
movdqa 0xecb(%rip),%xmm9
movdqa 0xed3(%rip),%xmm3
movdqa 0xeda(%rip),%xmm11
movdqa 0xee2(%rip),%xmm5
movdqa 0xeea(%rip),%xmm1
movdqa 0xef2(%rip),%xmm0
xor    %esi,%esi
jmp    12db <hf_rnd+0x1db>
and    $0xfffffffffffffffc,%rdx
movdqa 0xe6e(%rip),%xmm12
movdqa 0xe75(%rip),%xmm15
movdqa 0xe7c(%rip),%xmm9
movdqa 0xe84(%rip),%xmm3
movdqa 0xe8b(%rip),%xmm11
movdqa 0xe93(%rip),%xmm5
movdqa 0xe9b(%rip),%xmm1
movdqa 0xea3(%rip),%xmm0
xor    %esi,%esi
movdqa 0xea8(%rip),%xmm8
movdqa 0xec0(%rip),%xmm2
movdqa 0xec7(%rip),%xmm10
movdqa 0xece(%rip),%xmm13
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm0,%xmm7
pand   %xmm8,%xmm7
movdqa %xmm1,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm7
movdqa %xmm5,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm11,%xmm4
pand   %xmm8,%xmm4
packuswb %xmm4,%xmm6
packuswb %xmm6,%xmm7
movdqa %xmm3,%xmm4
pand   %xmm8,%xmm4
movdqa %xmm9,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm15,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm12,%xmm14
pand   %xmm8,%xmm14
packuswb %xmm14,%xmm6
packuswb %xmm6,%xmm4
packuswb %xmm4,%xmm7
movdqa %xmm7,%xmm4
psubb  0xe6b(%rip),%xmm4
movdqu %xmm4,(%rdi,%rsi,1)
movdqa %xmm7,%xmm4
paddb  0xe0a(%rip),%xmm4
movdqu %xmm4,0x10(%rdi,%rsi,1)
movdqa %xmm7,%xmm4
paddb  %xmm2,%xmm4
movdqu %xmm4,0x20(%rdi,%rsi,1)
paddb  %xmm10,%xmm7
movdqu %xmm7,0x30(%rdi,%rsi,1)
add    $0x40,%rsi
paddq  %xmm13,%xmm0
paddq  %xmm13,%xmm1
paddq  %xmm13,%xmm5
paddq  %xmm13,%xmm11
paddq  %xmm13,%xmm3
paddq  %xmm13,%xmm9
paddq  %xmm13,%xmm15
paddq  %xmm13,%xmm12
add    $0xfffffffffffffffc,%rdx
jne    1200 <hf_rnd+0x100>
test   %r8,%r8
je     13b7 <hf_rnd+0x2b7>
add    %rdi,%rsi
shl    $0x4,%r8
xor    %edx,%edx
movdqa 0xd8a(%rip),%xmm8
pcmpeqd %xmm13,%xmm13
movdqa 0xdcc(%rip),%xmm10
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqa %xmm0,%xmm4
pand   %xmm8,%xmm4
movdqa %xmm1,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm5,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm11,%xmm7
pand   %xmm8,%xmm7
packuswb %xmm7,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm3,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm9,%xmm7
pand   %xmm8,%xmm7
packuswb %xmm7,%xmm6
movdqa %xmm15,%xmm7
pand   %xmm8,%xmm7
movdqa %xmm12,%xmm2
pand   %xmm8,%xmm2
packuswb %xmm2,%xmm7
packuswb %xmm7,%xmm6
packuswb %xmm6,%xmm4
psubb  %xmm13,%xmm4
movdqu %xmm4,(%rsi,%rdx,1)
paddq  %xmm10,%xmm0
paddq  %xmm10,%xmm1
paddq  %xmm10,%xmm5
paddq  %xmm10,%xmm11
paddq  %xmm10,%xmm3
paddq  %xmm10,%xmm9
paddq  %xmm10,%xmm15
paddq  %xmm10,%xmm12
add    $0x10,%rdx
cmp    %rdx,%r8
jne    1310 <hf_rnd+0x210>
cmp    %rax,%rcx
je     13cf <hf_rnd+0x2cf>
nopl   0x0(%rax)
lea    0x1(%rcx),%rdx
mov    %dl,(%rdi,%rcx,1)
mov    %rdx,%rcx
cmp    %rdx,%rax
jne    13c0 <hf_rnd+0x2c0>
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @hf_rnd(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i64
store i8* %0, i8** %3
store i32 %1, i32* %4
store i64 0, i64* %5
br label %6
6: ; preds = %18, %2
%7 = load i64, i64* %5
%8 = load i32, i32* %4
%9 = sext i32 %8 to i64
%10 = icmp ult i64 %7, %9
br i1 %10, label %11, label %21
11: ; preds = %6
%12 = load i64, i64* %5
%13 = add i64 %12, 1
%14 = trunc i64 %13 to i8
%15 = load i8*, i8** %3
%16 = load i64, i64* %5
%17 = getelementptr inbounds i8, i8* %15, i64 %16
store i8 %14, i8* %17
br label %18
18: ; preds = %11
%19 = load i64, i64* %5
%20 = add i64 %19, 1
store i64 %20, i64* %5
br label %6
21: ; preds = %6
ret i32 1
}

LLVM IR (-O2):
define i32 @hf_rnd(i8* nocapture writeonly %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br i1 %3, label %63, label %4
4: ; preds = %2
%5 = sext i32 %1 to i64
%6 = icmp ult i32 %1, 16
br i1 %6, label %61, label %7
7: ; preds = %4
%8 = and i64 %5, -16
%9 = add nsw i64 %8, -16
%10 = lshr exact i64 %9, 4
%11 = add nuw nsw i64 %10, 1
%12 = and i64 %11, 3
%13 = icmp ult i64 %9, 48
br i1 %13, label %43, label %14
14: ; preds = %7
%15 = and i64 %11, 2305843009213693948
br label %16
16: ; preds = %16, %14
%17 = phi i64 [ 0, %14 ], [ %39, %16 ]
%18 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %14 ], [ %40, %16 ]
%19 = phi i64 [ 0, %14 ], [ %41, %16 ]
%20 = trunc <16 x i64> %18 to <16 x i8>
%21 = add <16 x i8> %20, <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>
%22 = getelementptr inbounds i8, i8* %0, i64 %17
%23 = bitcast i8* %22 to <16 x i8>*
store <16 x i8> %21, <16 x i8>* %23
%24 = or i64 %17, 16
%25 = trunc <16 x i64> %18 to <16 x i8>
%26 = add <16 x i8> %25, <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>
%27 = getelementptr inbounds i8, i8* %0, i64 %24
%28 = bitcast i8* %27 to <16 x i8>*
store <16 x i8> %26, <16 x i8>* %28
%29 = or i64 %17, 32
%30 = trunc <16 x i64> %18 to <16 x i8>
%31 = add <16 x i8> %30, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>
%32 = getelementptr inbounds i8, i8* %0, i64 %29
%33 = bitcast i8* %32 to <16 x i8>*
store <16 x i8> %31, <16 x i8>* %33
%34 = or i64 %17, 48
%35 = trunc <16 x i64> %18 to <16 x i8>
%36 = add <16 x i8> %35, <i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49>
%37 = getelementptr inbounds i8, i8* %0, i64 %34
%38 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %36, <16 x i8>* %38
%39 = add nuw i64 %17, 64
%40 = add <16 x i64> %18, <i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64>
%41 = add i64 %19, 4
%42 = icmp eq i64 %41, %15
br i1 %42, label %43, label %16
43: ; preds = %16, %7
%44 = phi i64 [ 0, %7 ], [ %39, %16 ]
%45 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %7 ], [ %40, %16 ]
%46 = icmp eq i64 %12, 0
br i1 %46, label %59, label %47
47: ; preds = %43, %47
%48 = phi i64 [ %55, %47 ], [ %44, %43 ]
%49 = phi <16 x i64> [ %56, %47 ], [ %45, %43 ]
%50 = phi i64 [ %57, %47 ], [ 0, %43 ]
%51 = trunc <16 x i64> %49 to <16 x i8>
%52 = add <16 x i8> %51, <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>
%53 = getelementptr inbounds i8, i8* %0, i64 %48
%54 = bitcast i8* %53 to <16 x i8>*
store <16 x i8> %52, <16 x i8>* %54
%55 = add nuw i64 %48, 16
%56 = add <16 x i64> %49, <i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16>
%57 = add i64 %50, 1
%58 = icmp eq i64 %57, %12
br i1 %58, label %59, label %47
59: ; preds = %47, %43
%60 = icmp eq i64 %8, %5
br i1 %60, label %63, label %61
61: ; preds = %4, %59
%62 = phi i64 [ 0, %4 ], [ %8, %59 ]
br label %64
63: ; preds = %64, %59, %2
ret i32 1
64: ; preds = %61, %64
%65 = phi i64 [ %66, %64 ], [ %62, %61 ]
%66 = add nuw i64 %65, 1
%67 = trunc i64 %66 to i8
%68 = getelementptr inbounds i8, i8* %0, i64 %65
store i8 %67, i8* %68
%69 = icmp eq i64 %66, %5
br i1 %69, label %63, label %64
}