#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 */
scalar_t__ space(int);
int *get_indx(unsigned int length) {
  unsigned int i;
  int *idx = (int *)space(sizeof(int) * (length + 1));
  for (i = 1; i <= length; i++)
    idx[i] = (i * (i - 1)) >> 1;
  return idx;
}


x86 assembly (clang, -O0):
<get_indx>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,%eax
shl    $0x2,%rax
mov    %eax,%edi
call   1030 <space@plt>
mov    %rax,-0x10(%rbp)
movl   $0x1,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
ja     116c <get_indx+0x5c>
mov    -0x8(%rbp),%edx
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
imul   %eax,%edx
shr    $0x1,%edx
mov    -0x10(%rbp),%rax
mov    -0x8(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1139 <get_indx+0x29>
mov    -0x10(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_indx>:
push   %rbx
mov    %edi,%ebx
lea    0x4(,%rbx,4),%edi
call   1030 <space@plt>
test   %ebx,%ebx
je     1354 <get_indx+0x244>
mov    %ebx,%ecx
mov    $0x1,%edx
cmp    $0x8,%ebx
jb     132e <get_indx+0x21e>
mov    %ecx,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%rsi
mov    %rsi,%rbx
shr    $0x3,%rbx
add    $0x1,%rbx
test   %rsi,%rsi
je     1356 <get_indx+0x246>
mov    %rbx,%rdi
and    $0xfffffffffffffffe,%rdi
movdqa 0xe9d(%rip),%xmm4
mov    $0x1,%esi
movdqa 0xe9f(%rip),%xmm8
pcmpeqd %xmm9,%xmm9
movdqa 0xea1(%rip),%xmm10
movdqa 0xea8(%rip),%xmm11
movdqa 0xeaf(%rip),%xmm12
movdqa 0xeb6(%rip),%xmm13
movdqa 0xebe(%rip),%xmm7
movdqa 0xec6(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
movdqa %xmm4,%xmm0
paddd  %xmm8,%xmm0
movdqa %xmm4,%xmm2
paddd  %xmm9,%xmm2
movdqa %xmm4,%xmm3
paddd  %xmm10,%xmm3
pshufd $0xf5,%xmm2,%xmm5
pmuludq %xmm4,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm5,%xmm6
pshufd $0xe8,%xmm6,%xmm5
punpckldq %xmm5,%xmm2
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm3
psrld  $0x1,%xmm2
psrld  $0x1,%xmm3
movdqu %xmm2,(%rax,%rsi,4)
movdqu %xmm3,0x10(%rax,%rsi,4)
movdqa %xmm4,%xmm0
paddd  %xmm11,%xmm0
movdqa %xmm4,%xmm2
paddd  %xmm12,%xmm2
movdqa %xmm4,%xmm3
paddd  %xmm13,%xmm3
movdqa %xmm4,%xmm5
paddd  %xmm7,%xmm5
pshufd $0xf5,%xmm3,%xmm6
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm6,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm3
pshufd $0xf5,%xmm5,%xmm0
pmuludq %xmm2,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm0
punpckldq %xmm0,%xmm5
psrld  $0x1,%xmm3
psrld  $0x1,%xmm5
movdqu %xmm3,0x20(%rax,%rsi,4)
movdqu %xmm5,0x30(%rax,%rsi,4)
paddd  %xmm1,%xmm4
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rdi
jne    11b0 <get_indx+0xa0>
test   $0x1,%bl
je     1325 <get_indx+0x215>
movdqa 0xd58(%rip),%xmm0
paddd  %xmm4,%xmm0
pcmpeqd %xmm1,%xmm1
paddd  %xmm4,%xmm1
movdqa 0xd54(%rip),%xmm2
paddd  %xmm4,%xmm2
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm4,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xf5,%xmm4,%xmm4
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm3
punpckldq %xmm3,%xmm1
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm3,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
psrld  $0x1,%xmm1
psrld  $0x1,%xmm2
movdqu %xmm1,(%rax,%rsi,4)
movdqu %xmm2,0x10(%rax,%rsi,4)
cmp    %rdx,%rcx
je     1354 <get_indx+0x244>
or     $0x1,%rdx
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    -0x1(%rdx),%esi
imul   %edx,%esi
shr    %esi
mov    %esi,(%rax,%rdx,4)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1340 <get_indx+0x230>
pop    %rbx
ret
movdqa 0xca2(%rip),%xmm4
mov    $0x1,%esi
test   $0x1,%bl
jne    12b0 <get_indx+0x1a0>
jmp    1325 <get_indx+0x215>

LLVM IR (-O0):
define i32* @get_indx(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32*
store i32 %0, i32* %2
%5 = load i32, i32* %2
%6 = add i32 %5, 1
%7 = zext i32 %6 to i64
%8 = mul i64 4, %7
%9 = trunc i64 %8 to i32
%10 = call i64 @space(i32 %9)
%11 = inttoptr i64 %10 to i32*
store i32* %11, i32** %4
store i32 1, i32* %3
br label %12
12: ; preds = %26, %1
%13 = load i32, i32* %3
%14 = load i32, i32* %2
%15 = icmp ule i32 %13, %14
br i1 %15, label %16, label %29
16: ; preds = %12
%17 = load i32, i32* %3
%18 = load i32, i32* %3
%19 = sub i32 %18, 1
%20 = mul i32 %17, %19
%21 = lshr i32 %20, 1
%22 = load i32*, i32** %4
%23 = load i32, i32* %3
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i32, i32* %22, i64 %24
store i32 %21, i32* %25
br label %26
26: ; preds = %16
%27 = load i32, i32* %3
%28 = add i32 %27, 1
store i32 %28, i32* %3
br label %12
29: ; preds = %12
%30 = load i32*, i32** %4
ret i32* %30
}

LLVM IR (-O2):
define i32* @get_indx(i32 %0) {
%2 = shl i32 %0, 2
%3 = add i32 %2, 4
%4 = tail call i64 @space(i32 %3)
%5 = inttoptr i64 %4 to i32*
%6 = icmp eq i32 %0, 0
br i1 %6, label %86, label %7
7: ; preds = %1
%8 = add nuw i32 %0, 1
%9 = zext i32 %8 to i64
%10 = add nsw i64 %9, -1
%11 = icmp ult i64 %10, 8
br i1 %11, label %75, label %12
12: ; preds = %7
%13 = and i64 %10, -8
%14 = or i64 %13, 1
%15 = add nsw i64 %13, -8
%16 = lshr exact i64 %15, 3
%17 = add nuw nsw i64 %16, 1
%18 = and i64 %17, 1
%19 = icmp eq i64 %15, 0
br i1 %19, label %57, label %20
20: ; preds = %12
%21 = and i64 %17, 4611686018427387902
br label %22
22: ; preds = %22, %20
%23 = phi i64 [ 0, %20 ], [ %51, %22 ]
%24 = phi <4 x i32> [ <i32 1, i32 2, i32 3, i32 4>, %20 ], [ %52, %22 ]
%25 = phi i64 [ 0, %20 ], [ %53, %22 ]
%26 = or i64 %23, 1
%27 = add <4 x i32> %24, <i32 4, i32 4, i32 4, i32 4>
%28 = add <4 x i32> %24, <i32 -1, i32 -1, i32 -1, i32 -1>
%29 = add <4 x i32> %24, <i32 3, i32 3, i32 3, i32 3>
%30 = mul <4 x i32> %28, %24
%31 = mul <4 x i32> %29, %27
%32 = lshr <4 x i32> %30, <i32 1, i32 1, i32 1, i32 1>
%33 = lshr <4 x i32> %31, <i32 1, i32 1, i32 1, i32 1>
%34 = getelementptr inbounds i32, i32* %5, i64 %26
%35 = bitcast i32* %34 to <4 x i32>*
store <4 x i32> %32, <4 x i32>* %35
%36 = getelementptr inbounds i32, i32* %34, i64 4
%37 = bitcast i32* %36 to <4 x i32>*
store <4 x i32> %33, <4 x i32>* %37
%38 = add <4 x i32> %24, <i32 8, i32 8, i32 8, i32 8>
%39 = or i64 %23, 9
%40 = add <4 x i32> %24, <i32 12, i32 12, i32 12, i32 12>
%41 = add <4 x i32> %24, <i32 7, i32 7, i32 7, i32 7>
%42 = add <4 x i32> %24, <i32 11, i32 11, i32 11, i32 11>
%43 = mul <4 x i32> %41, %38
%44 = mul <4 x i32> %42, %40
%45 = lshr <4 x i32> %43, <i32 1, i32 1, i32 1, i32 1>
%46 = lshr <4 x i32> %44, <i32 1, i32 1, i32 1, i32 1>
%47 = getelementptr inbounds i32, i32* %5, i64 %39
%48 = bitcast i32* %47 to <4 x i32>*
store <4 x i32> %45, <4 x i32>* %48
%49 = getelementptr inbounds i32, i32* %47, i64 4
%50 = bitcast i32* %49 to <4 x i32>*
store <4 x i32> %46, <4 x i32>* %50
%51 = add nuw i64 %23, 16
%52 = add <4 x i32> %24, <i32 16, i32 16, i32 16, i32 16>
%53 = add i64 %25, 2
%54 = icmp eq i64 %53, %21
br i1 %54, label %55, label %22
55: ; preds = %22
%56 = or i64 %51, 1
br label %57
57: ; preds = %55, %12
%58 = phi i64 [ 1, %12 ], [ %56, %55 ]
%59 = phi <4 x i32> [ <i32 1, i32 2, i32 3, i32 4>, %12 ], [ %52, %55 ]
%60 = icmp eq i64 %18, 0
br i1 %60, label %73, label %61
61: ; preds = %57
%62 = add <4 x i32> %59, <i32 4, i32 4, i32 4, i32 4>
%63 = add <4 x i32> %59, <i32 -1, i32 -1, i32 -1, i32 -1>
%64 = add <4 x i32> %59, <i32 3, i32 3, i32 3, i32 3>
%65 = mul <4 x i32> %63, %59
%66 = mul <4 x i32> %64, %62
%67 = lshr <4 x i32> %65, <i32 1, i32 1, i32 1, i32 1>
%68 = lshr <4 x i32> %66, <i32 1, i32 1, i32 1, i32 1>
%69 = getelementptr inbounds i32, i32* %5, i64 %58
%70 = bitcast i32* %69 to <4 x i32>*
store <4 x i32> %67, <4 x i32>* %70
%71 = getelementptr inbounds i32, i32* %69, i64 4
%72 = bitcast i32* %71 to <4 x i32>*
store <4 x i32> %68, <4 x i32>* %72
br label %73
73: ; preds = %57, %61
%74 = icmp eq i64 %10, %13
br i1 %74, label %86, label %75
75: ; preds = %7, %73
%76 = phi i64 [ 1, %7 ], [ %14, %73 ]
br label %77
77: ; preds = %75, %77
%78 = phi i64 [ %84, %77 ], [ %76, %75 ]
%79 = trunc i64 %78 to i32
%80 = add i32 %79, -1
%81 = mul i32 %80, %79
%82 = lshr i32 %81, 1
%83 = getelementptr inbounds i32, i32* %5, i64 %78
store i32 %82, i32* %83
%84 = add nuw nsw i64 %78, 1
%85 = icmp eq i64 %84, %9
br i1 %85, label %86, label %77
86: ; preds = %77, %73, %1
ret i32* %5
}