#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 */
void init_pascal(size_t *result, size_t row_length) {
  unsigned int i, j;
  result[0] = 1;
  for (i = 1; i < row_length; ++i)
    result[i] = 2 * result[i - 1];
  for (i = row_length; i < row_length * row_length; i += row_length) {
    for (j = 0; j < row_length; ++j) {
      if (0 == j || i == row_length * j)
        result[i + j] = 1;
      else if (i > j * row_length)
        result[i + j] =
            result[i - row_length + j - 1] + result[i - row_length + j];
      else
        result[i + j] = result[i + j - 1] + result[i - row_length + j - 1];
    }
  }
}


x86 assembly (clang, -O0):
<init_pascal>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movq   $0x1,(%rax)
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%rax
jae    1158 <init_pascal+0x58>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,8),%rdx
shl    $0x1,%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111e <init_pascal+0x1e>
mov    -0x10(%rbp),%rax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%rcx
imul   -0x10(%rbp),%rcx
cmp    %rcx,%rax
jae    1285 <init_pascal+0x185>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%rax
jae    126e <init_pascal+0x16e>
xor    %eax,%eax
cmp    -0x18(%rbp),%eax
je     11aa <init_pascal+0xaa>
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%edx
imul   %rdx,%rcx
cmp    %rcx,%rax
jne    11c3 <init_pascal+0xc3>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
mov    %ecx,%ecx
movq   $0x1,(%rax,%rcx,8)
jmp    125b <init_pascal+0x15b>
mov    -0x14(%rbp),%eax
mov    -0x18(%rbp),%ecx
imul   -0x10(%rbp),%rcx
cmp    %rcx,%rax
jbe    121a <init_pascal+0x11a>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%edx
add    %rdx,%rcx
sub    $0x1,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%esi
add    %rsi,%rcx
add    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
mov    %ecx,%ecx
mov    %rdx,(%rax,%rcx,8)
jmp    1256 <init_pascal+0x156>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%esi
add    %rsi,%rcx
sub    $0x1,%rcx
add    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
mov    %ecx,%ecx
mov    %rdx,(%rax,%rcx,8)
jmp    125b <init_pascal+0x15b>
jmp    1260 <init_pascal+0x160>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    117b <init_pascal+0x7b>
jmp    1273 <init_pascal+0x173>
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%eax
add    %rcx,%rax
mov    %eax,-0x14(%rbp)
jmp    115f <init_pascal+0x5f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_pascal>:
push   %r15
push   %r14
push   %rbx
movq   $0x1,(%rdi)
cmp    $0x2,%rsi
jb     1136 <init_pascal+0x36>
mov    $0x1,%eax
nopw   0x0(%rax,%rax,1)
lea    -0x1(%rax),%ecx
mov    (%rdi,%rcx,8),%rcx
add    %rcx,%rcx
mov    %rcx,(%rdi,%rax,8)
add    $0x1,%eax
cmp    %rsi,%rax
jb     1120 <init_pascal+0x20>
mov    %rsi,%r9
imul   %rsi,%r9
mov    %esi,%r14d
cmp    %r9,%r14
jae    11e1 <init_pascal+0xe1>
mov    %rsi,%r8
not    %r8
mov    %rsi,%rcx
jmp    116e <init_pascal+0x6e>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r14,%rcx
add    %rsi,%rcx
mov    %ecx,%r14d
cmp    %r9,%r14
jae    11e1 <init_pascal+0xe1>
test   %rsi,%rsi
je     1160 <init_pascal+0x60>
lea    (%r14,%r8,1),%r10
mov    %r14,%r11
sub    %rsi,%r11
xor    %eax,%eax
jmp    11a4 <init_pascal+0xa4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    (%rax,%rcx,1),%edx
mov    $0x1,%ebx
mov    %rbx,(%rdi,%rdx,8)
add    $0x1,%eax
cmp    %rsi,%rax
jae    1160 <init_pascal+0x60>
test   %eax,%eax
je     1190 <init_pascal+0x90>
mov    %rax,%rdx
imul   %rsi,%rdx
cmp    %rdx,%r14
je     1190 <init_pascal+0x90>
jbe    11c8 <init_pascal+0xc8>
lea    (%rax,%r11,1),%rdx
mov    (%rdi,%rdx,8),%rbx
add    -0x8(%rdi,%rdx,8),%rbx
lea    (%rax,%rcx,1),%edx
jmp    1198 <init_pascal+0x98>
lea    (%rax,%rcx,1),%edx
lea    (%rax,%rcx,1),%r15d
add    $0xffffffff,%r15d
lea    (%r10,%rax,1),%rbx
mov    (%rdi,%rbx,8),%rbx
add    (%rdi,%r15,8),%rbx
jmp    1198 <init_pascal+0x98>
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @init_pascal(i64* %0, i64 %1) {
%3 = alloca i64*
%4 = alloca i64
%5 = alloca i32
%6 = alloca i32
store i64* %0, i64** %3
store i64 %1, i64* %4
%7 = load i64*, i64** %3
%8 = getelementptr inbounds i64, i64* %7, i64 0
store i64 1, i64* %8
store i32 1, i32* %5
br label %9
9: ; preds = %26, %2
%10 = load i32, i32* %5
%11 = zext i32 %10 to i64
%12 = load i64, i64* %4
%13 = icmp ult i64 %11, %12
br i1 %13, label %14, label %29
14: ; preds = %9
%15 = load i64*, i64** %3
%16 = load i32, i32* %5
%17 = sub i32 %16, 1
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds i64, i64* %15, i64 %18
%20 = load i64, i64* %19
%21 = mul i64 2, %20
%22 = load i64*, i64** %3
%23 = load i32, i32* %5
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i64, i64* %22, i64 %24
store i64 %21, i64* %25
br label %26
26: ; preds = %14
%27 = load i32, i32* %5
%28 = add i32 %27, 1
store i32 %28, i32* %5
br label %9
29: ; preds = %9
%30 = load i64, i64* %4
%31 = trunc i64 %30 to i32
store i32 %31, i32* %5
br label %32
32: ; preds = %133, %29
%33 = load i32, i32* %5
%34 = zext i32 %33 to i64
%35 = load i64, i64* %4
%36 = load i64, i64* %4
%37 = mul i64 %35, %36
%38 = icmp ult i64 %34, %37
br i1 %38, label %39, label %139
39: ; preds = %32
store i32 0, i32* %6
br label %40
40: ; preds = %129, %39
%41 = load i32, i32* %6
%42 = zext i32 %41 to i64
%43 = load i64, i64* %4
%44 = icmp ult i64 %42, %43
br i1 %44, label %45, label %132
45: ; preds = %40
%46 = load i32, i32* %6
%47 = icmp eq i32 0, %46
br i1 %47, label %56, label %48
48: ; preds = %45
%49 = load i32, i32* %5
%50 = zext i32 %49 to i64
%51 = load i64, i64* %4
%52 = load i32, i32* %6
%53 = zext i32 %52 to i64
%54 = mul i64 %51, %53
%55 = icmp eq i64 %50, %54
br i1 %55, label %56, label %63
56: ; preds = %48, %45
%57 = load i64*, i64** %3
%58 = load i32, i32* %5
%59 = load i32, i32* %6
%60 = add i32 %58, %59
%61 = zext i32 %60 to i64
%62 = getelementptr inbounds i64, i64* %57, i64 %61
store i64 1, i64* %62
br label %128
63: ; preds = %48
%64 = load i32, i32* %5
%65 = zext i32 %64 to i64
%66 = load i32, i32* %6
%67 = zext i32 %66 to i64
%68 = load i64, i64* %4
%69 = mul i64 %67, %68
%70 = icmp ugt i64 %65, %69
br i1 %70, label %71, label %100
71: ; preds = %63
%72 = load i64*, i64** %3
%73 = load i32, i32* %5
%74 = zext i32 %73 to i64
%75 = load i64, i64* %4
%76 = sub i64 %74, %75
%77 = load i32, i32* %6
%78 = zext i32 %77 to i64
%79 = add i64 %76, %78
%80 = sub i64 %79, 1
%81 = getelementptr inbounds i64, i64* %72, i64 %80
%82 = load i64, i64* %81
%83 = load i64*, i64** %3
%84 = load i32, i32* %5
%85 = zext i32 %84 to i64
%86 = load i64, i64* %4
%87 = sub i64 %85, %86
%88 = load i32, i32* %6
%89 = zext i32 %88 to i64
%90 = add i64 %87, %89
%91 = getelementptr inbounds i64, i64* %83, i64 %90
%92 = load i64, i64* %91
%93 = add i64 %82, %92
%94 = load i64*, i64** %3
%95 = load i32, i32* %5
%96 = load i32, i32* %6
%97 = add i32 %95, %96
%98 = zext i32 %97 to i64
%99 = getelementptr inbounds i64, i64* %94, i64 %98
store i64 %93, i64* %99
br label %127
100: ; preds = %63
%101 = load i64*, i64** %3
%102 = load i32, i32* %5
%103 = load i32, i32* %6
%104 = add i32 %102, %103
%105 = sub i32 %104, 1
%106 = zext i32 %105 to i64
%107 = getelementptr inbounds i64, i64* %101, i64 %106
%108 = load i64, i64* %107
%109 = load i64*, i64** %3
%110 = load i32, i32* %5
%111 = zext i32 %110 to i64
%112 = load i64, i64* %4
%113 = sub i64 %111, %112
%114 = load i32, i32* %6
%115 = zext i32 %114 to i64
%116 = add i64 %113, %115
%117 = sub i64 %116, 1
%118 = getelementptr inbounds i64, i64* %109, i64 %117
%119 = load i64, i64* %118
%120 = add i64 %108, %119
%121 = load i64*, i64** %3
%122 = load i32, i32* %5
%123 = load i32, i32* %6
%124 = add i32 %122, %123
%125 = zext i32 %124 to i64
%126 = getelementptr inbounds i64, i64* %121, i64 %125
store i64 %120, i64* %126
br label %127
127: ; preds = %100, %71
br label %128
128: ; preds = %127, %56
br label %129
129: ; preds = %128
%130 = load i32, i32* %6
%131 = add i32 %130, 1
store i32 %131, i32* %6
br label %40
132: ; preds = %40
br label %133
133: ; preds = %132
%134 = load i64, i64* %4
%135 = load i32, i32* %5
%136 = zext i32 %135 to i64
%137 = add i64 %136, %134
%138 = trunc i64 %137 to i32
store i32 %138, i32* %5
br label %32
139: ; preds = %32
ret void
}

LLVM IR (-O2):
define void @init_pascal(i64* nocapture %0, i64 %1) {
store i64 1, i64* %0
%3 = icmp ugt i64 %1, 1
br i1 %3, label %11, label %4
4: ; preds = %11, %2
%5 = mul i64 %1, %1
%6 = and i64 %1, 4294967295
%7 = icmp ult i64 %6, %5
br i1 %7, label %8, label %73
8: ; preds = %4
%9 = icmp eq i64 %1, 0
%10 = xor i64 %1, -1
br label %22
11: ; preds = %2, %11
%12 = phi i64 [ %20, %11 ], [ 1, %2 ]
%13 = add nuw nsw i64 %12, 4294967295
%14 = and i64 %13, 4294967295
%15 = getelementptr inbounds i64, i64* %0, i64 %14
%16 = load i64, i64* %15
%17 = shl i64 %16, 1
%18 = getelementptr inbounds i64, i64* %0, i64 %12
store i64 %17, i64* %18
%19 = add nuw nsw i64 %12, 1
%20 = and i64 %19, 4294967295
%21 = icmp ult i64 %20, %1
br i1 %21, label %11, label %4
22: ; preds = %8, %69
%23 = phi i64 [ %6, %8 ], [ %71, %69 ]
%24 = phi i64 [ %1, %8 ], [ %70, %69 ]
%25 = trunc i64 %24 to i32
br i1 %9, label %69, label %26
26: ; preds = %22
%27 = add i64 %23, %10
%28 = sub i64 %23, %1
br label %29
29: ; preds = %26, %62
%30 = phi i64 [ 0, %26 ], [ %67, %62 ]
%31 = trunc i64 %30 to i32
%32 = icmp eq i32 %31, 0
br i1 %32, label %36, label %33
33: ; preds = %29
%34 = mul i64 %30, %1
%35 = icmp eq i64 %23, %34
br i1 %35, label %36, label %39
36: ; preds = %33, %29
%37 = add i64 %30, %24
%38 = and i64 %37, 4294967295
br label %62
39: ; preds = %33
%40 = icmp ugt i64 %23, %34
br i1 %40, label %41, label %51
41: ; preds = %39
%42 = add i64 %30, %28
%43 = add i64 %42, -1
%44 = getelementptr inbounds i64, i64* %0, i64 %43
%45 = load i64, i64* %44
%46 = getelementptr inbounds i64, i64* %0, i64 %42
%47 = load i64, i64* %46
%48 = add i64 %47, %45
%49 = add i64 %30, %24
%50 = and i64 %49, 4294967295
br label %62
51: ; preds = %39
%52 = add i32 %31, %25
%53 = add i32 %52, -1
%54 = zext i32 %53 to i64
%55 = getelementptr inbounds i64, i64* %0, i64 %54
%56 = load i64, i64* %55
%57 = add i64 %27, %30
%58 = getelementptr inbounds i64, i64* %0, i64 %57
%59 = load i64, i64* %58
%60 = add i64 %59, %56
%61 = zext i32 %52 to i64
br label %62
62: ; preds = %36, %51, %41
%63 = phi i64 [ %38, %36 ], [ %61, %51 ], [ %50, %41 ]
%64 = phi i64 [ 1, %36 ], [ %60, %51 ], [ %48, %41 ]
%65 = getelementptr inbounds i64, i64* %0, i64 %63
store i64 %64, i64* %65
%66 = add nuw nsw i64 %30, 1
%67 = and i64 %66, 4294967295
%68 = icmp ult i64 %67, %1
br i1 %68, label %29, label %69
69: ; preds = %62, %22
%70 = add i64 %23, %1
%71 = and i64 %70, 4294967295
%72 = icmp ult i64 %71, %5
br i1 %72, label %22, label %73
73: ; preds = %69, %4
ret void
}