#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 */
short *calloc(int, int);
short *make_ao_ident(int ao_ident) {
  short *ids = calloc(32, sizeof(short));
  if (ao_ident) {
    int ic;
    for (ic = 0; ic < 32; ++ic) {
      ids[ic] = ic * (32768 / 100) * ao_ident;
    }
  }
  return ids;
}


x86 assembly (clang, -O0):
<make_ao_ident>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    $0x20,%edi
mov    $0x2,%esi
call   1030 <calloc@plt>
mov    %rax,-0x10(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     1176 <make_ao_ident+0x66>
movl   $0x0,-0x14(%rbp)
cmpl   $0x20,-0x14(%rbp)
jge    1171 <make_ao_ident+0x61>
imul   $0x147,-0x14(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    113f <make_ao_ident+0x2f>
jmp    1176 <make_ao_ident+0x66>
mov    -0x10(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_ao_ident>:
push   %rbx
mov    %edi,%ebx
mov    $0x20,%edi
mov    $0x2,%esi
call   1030 <calloc@plt>
test   %ebx,%ebx
je     11bb <make_ao_ident+0xab>
movw   $0x0,(%rax)
movd   %ebx,%xmm0
pshufd $0x0,%xmm0,%xmm0
pslld  $0x10,%xmm0
psrad  $0x10,%xmm0
packssdw %xmm0,%xmm0
movdqa 0xeb2(%rip),%xmm1
pmullw %xmm0,%xmm1
movdqu %xmm1,0x2(%rax)
movdqa 0xeb1(%rip),%xmm1
pmullw %xmm0,%xmm1
pmullw 0xeb5(%rip),%xmm0
movdqu %xmm1,0x12(%rax)
movdqu %xmm0,0x22(%rax)
imul   $0x1fef,%ebx,%ecx
mov    %cx,0x32(%rax)
imul   $0x2136,%ebx,%ecx
mov    %cx,0x34(%rax)
imul   $0x227d,%ebx,%ecx
mov    %cx,0x36(%rax)
imul   $0x23c4,%ebx,%ecx
mov    %cx,0x38(%rax)
imul   $0x250b,%ebx,%ecx
mov    %cx,0x3a(%rax)
imul   $0x2652,%ebx,%ecx
mov    %cx,0x3c(%rax)
imul   $0x2799,%ebx,%ecx
mov    %cx,0x3e(%rax)
pop    %rbx
ret

LLVM IR (-O0):
define i16* @make_ao_ident(i32 %0) {
%2 = alloca i32
%3 = alloca i16*
%4 = alloca i32
store i32 %0, i32* %2
%5 = call i16* @calloc(i32 32, i32 2)
store i16* %5, i16** %3
%6 = load i32, i32* %2
%7 = icmp ne i32 %6, 0
br i1 %7, label %8, label %26
8: ; preds = %1
store i32 0, i32* %4
br label %9
9: ; preds = %22, %8
%10 = load i32, i32* %4
%11 = icmp slt i32 %10, 32
br i1 %11, label %12, label %25
12: ; preds = %9
%13 = load i32, i32* %4
%14 = mul nsw i32 %13, 327
%15 = load i32, i32* %2
%16 = mul nsw i32 %14, %15
%17 = trunc i32 %16 to i16
%18 = load i16*, i16** %3
%19 = load i32, i32* %4
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i16, i16* %18, i64 %20
store i16 %17, i16* %21
br label %22
22: ; preds = %12
%23 = load i32, i32* %4
%24 = add nsw i32 %23, 1
store i32 %24, i32* %4
br label %9
25: ; preds = %9
br label %26
26: ; preds = %25, %1
%27 = load i16*, i16** %3
ret i16* %27
}

LLVM IR (-O2):
define noalias i16* @make_ao_ident(i32 %0) {
%2 = tail call i16* @calloc(i32 32, i32 2)
%3 = icmp eq i32 %0, 0
br i1 %3, label %40, label %4
4: ; preds = %1
store i16 0, i16* %2
%5 = getelementptr inbounds i16, i16* %2, i64 1
%6 = insertelement <8 x i32> poison, i32 %0, i64 0
%7 = shufflevector <8 x i32> %6, <8 x i32> poison, <8 x i32> zeroinitializer
%8 = trunc <8 x i32> %7 to <8 x i16>
%9 = mul <8 x i16> %8, <i16 327, i16 654, i16 981, i16 1308, i16 1635, i16 1962, i16 2289, i16 2616>
%10 = bitcast i16* %5 to <8 x i16>*
store <8 x i16> %9, <8 x i16>* %10
%11 = getelementptr inbounds i16, i16* %2, i64 9
%12 = trunc <8 x i32> %7 to <8 x i16>
%13 = mul <8 x i16> %12, <i16 2943, i16 3270, i16 3597, i16 3924, i16 4251, i16 4578, i16 4905, i16 5232>
%14 = bitcast i16* %11 to <8 x i16>*
store <8 x i16> %13, <8 x i16>* %14
%15 = getelementptr inbounds i16, i16* %2, i64 17
%16 = trunc <8 x i32> %7 to <8 x i16>
%17 = mul <8 x i16> %16, <i16 5559, i16 5886, i16 6213, i16 6540, i16 6867, i16 7194, i16 7521, i16 7848>
%18 = bitcast i16* %15 to <8 x i16>*
store <8 x i16> %17, <8 x i16>* %18
%19 = trunc i32 %0 to i16
%20 = mul i16 %19, 8175
%21 = getelementptr inbounds i16, i16* %2, i64 25
store i16 %20, i16* %21
%22 = trunc i32 %0 to i16
%23 = mul i16 %22, 8502
%24 = getelementptr inbounds i16, i16* %2, i64 26
store i16 %23, i16* %24
%25 = trunc i32 %0 to i16
%26 = mul i16 %25, 8829
%27 = getelementptr inbounds i16, i16* %2, i64 27
store i16 %26, i16* %27
%28 = trunc i32 %0 to i16
%29 = mul i16 %28, 9156
%30 = getelementptr inbounds i16, i16* %2, i64 28
store i16 %29, i16* %30
%31 = trunc i32 %0 to i16
%32 = mul i16 %31, 9483
%33 = getelementptr inbounds i16, i16* %2, i64 29
store i16 %32, i16* %33
%34 = trunc i32 %0 to i16
%35 = mul i16 %34, 9810
%36 = getelementptr inbounds i16, i16* %2, i64 30
store i16 %35, i16* %36
%37 = trunc i32 %0 to i16
%38 = mul i16 %37, 10137
%39 = getelementptr inbounds i16, i16* %2, i64 31
store i16 %38, i16* %39
br label %40
40: ; preds = %4, %1
ret i16* %2
}