void grid(int *lev, int *fact, int *out) {
  int a = 0, b = 0, j = 0, h = 0, trace = 1;
  int eachrep, numrep = 1;
  for (a = 0; a < *fact; a++) {
    eachrep = 1;
    for (j = a + 1; j < *fact; j++)
      eachrep = eachrep * lev[j];
    numrep = 1;
    for (j = 0; j < a; j++)
      numrep *= lev[j];
    for (j = 0; j < numrep; j++) {
      for (trace = 1; trace <= lev[a]; trace++) {
        for (b = 0; b < eachrep; b++) {
          out[h] = trace;
          h++;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<grid>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x1,-0x2c(%rbp)
movl   $0x1,-0x34(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    1268 <grid+0x168>
movl   $0x1,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    118f <grid+0x8f>
mov    -0x30(%rbp),%eax
mov    -0x8(%rbp),%rcx
movslq -0x24(%rbp),%rdx
imul   (%rcx,%rdx,4),%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1160 <grid+0x60>
movl   $0x1,-0x34(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11c9 <grid+0xc9>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
imul   -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    119d <grid+0x9d>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    1255 <grid+0x155>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x8(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jg     1242 <grid+0x142>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    122f <grid+0x12f>
mov    -0x2c(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11fe <grid+0xfe>
jmp    1234 <grid+0x134>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11e3 <grid+0xe3>
jmp    1247 <grid+0x147>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11d0 <grid+0xd0>
jmp    125a <grid+0x15a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1141 <grid+0x41>
pop    %rbp
ret

x86 assembly (clang, -O2):
<grid>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,-0x48(%rsp)
mov    (%rsi),%r10d
test   %r10d,%r10d
jle    17c2 <grid+0x6c2>
lea    0x74(%rdi),%r8
lea    0x14(%rdi),%r11
lea    0x10(%rdi),%rax
mov    %rax,-0x50(%rsp)
lea    0x70(%rdx),%rax
mov    %rax,-0x20(%rsp)
lea    0x10(%rdx),%rax
mov    %rax,-0x10(%rsp)
xor    %esi,%esi
mov    $0x1,%r15d
mov    $0xffffffffffffffff,%r13
movdqa 0xeaa(%rip),%xmm8
xor    %eax,%eax
mov    %rdi,-0x68(%rsp)
jmp    119d <grid+0x9d>
nop
mov    -0x48(%rsp),%rcx
mov    (%rcx),%r10d
mov    -0x28(%rsp),%r8
mov    -0x30(%rsp),%r11
mov    -0x38(%rsp),%r15
mov    -0x40(%rsp),%r13
mov    -0x58(%rsp),%rsi
movslq %r10d,%rcx
add    $0x1,%r15
add    $0x4,%r8
add    $0xffffffffffffffff,%r13
add    $0x4,%r11
cmp    %rcx,%rsi
jge    17c2 <grid+0x6c2>
mov    %rsi,%rbx
add    $0x1,%rsi
movslq %r10d,%rcx
movl   $0x1,-0x6c(%rsp)
mov    $0x1,%r9d
mov    %rsi,-0x58(%rsp)
cmp    %rcx,%rsi
mov    %rbx,-0x60(%rsp)
jge    140e <grid+0x30e>
mov    %rbx,%rbp
not    %rbp
mov    %r10d,%r12d
add    %r12,%rbp
mov    $0x1,%r9d
mov    %r15,%r14
cmp    $0x8,%rbp
jb     1400 <grid+0x300>
mov    %rbp,%r14
and    $0xfffffffffffffff8,%r14
lea    -0x8(%r14),%rsi
mov    %rsi,%rcx
shr    $0x3,%rcx
add    $0x1,%rcx
cmp    $0x18,%rsi
jae    1214 <grid+0x114>
xor    %esi,%esi
movdqa %xmm8,%xmm2
movdqa %xmm8,%xmm1
jmp    1313 <grid+0x213>
lea    (%r12,%r13,1),%rbx
and    $0xfffffffffffffff8,%rbx
add    $0xfffffffffffffff8,%rbx
shr    $0x3,%rbx
add    $0x1,%rbx
and    $0xfffffffffffffffc,%rbx
xor    %esi,%esi
movdqa %xmm8,%xmm2
movdqa %xmm8,%xmm1
nopl   0x0(%rax,%rax,1)
movdqu -0x70(%r8,%rsi,4),%xmm4
movdqu -0x60(%r8,%rsi,4),%xmm3
movdqu -0x50(%r8,%rsi,4),%xmm5
movdqu -0x40(%r8,%rsi,4),%xmm6
pshufd $0xf5,%xmm4,%xmm7
pshufd $0xf5,%xmm2,%xmm0
pmuludq %xmm7,%xmm0
pmuludq %xmm2,%xmm4
pshufd $0xf5,%xmm3,%xmm2
pshufd $0xf5,%xmm1,%xmm7
pmuludq %xmm2,%xmm7
pmuludq %xmm1,%xmm3
pmuludq %xmm5,%xmm4
pshufd $0xf5,%xmm5,%xmm1
pmuludq %xmm0,%xmm1
pmuludq %xmm6,%xmm3
pshufd $0xf5,%xmm6,%xmm0
pmuludq %xmm7,%xmm0
movdqu -0x30(%r8,%rsi,4),%xmm2
movdqu -0x20(%r8,%rsi,4),%xmm5
pshufd $0xf5,%xmm2,%xmm6
pmuludq %xmm1,%xmm6
pmuludq %xmm2,%xmm4
pshufd $0xf5,%xmm5,%xmm7
pmuludq %xmm0,%xmm7
pmuludq %xmm5,%xmm3
movdqu -0x10(%r8,%rsi,4),%xmm0
movdqu (%r8,%rsi,4),%xmm5
pmuludq %xmm0,%xmm4
pshufd $0xe8,%xmm4,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm6,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
pmuludq %xmm5,%xmm3
pshufd $0xe8,%xmm3,%xmm1
pshufd $0xf5,%xmm5,%xmm0
pmuludq %xmm7,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
add    $0x20,%rsi
add    $0xfffffffffffffffc,%rbx
jne    1240 <grid+0x140>
movdqa %xmm2,%xmm3
movdqa %xmm1,%xmm4
test   $0x3,%cl
je     13ac <grid+0x2ac>
lea    (%r11,%rsi,4),%rcx
lea    (%r12,%r13,1),%esi
and    $0x18,%sil
add    $0xf8,%sil
shr    $0x3,%sil
add    $0x1,%sil
movzbl %sil,%esi
and    $0x3,%esi
shl    $0x5,%rsi
xor    %ebx,%ebx
nopl   0x0(%rax)
movdqu -0x10(%rcx,%rbx,1),%xmm0
movdqu (%rcx,%rbx,1),%xmm4
pshufd $0xf5,%xmm0,%xmm5
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm3
pshufd $0xf5,%xmm2,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm3
pshufd $0xf5,%xmm4,%xmm0
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm4
add    $0x20,%rbx
movdqa %xmm3,%xmm2
movdqa %xmm4,%xmm1
cmp    %rbx,%rsi
jne    1350 <grid+0x250>
pshufd $0xf5,%xmm3,%xmm0
pshufd $0xf5,%xmm4,%xmm1
pmuludq %xmm0,%xmm1
pmuludq %xmm3,%xmm4
pshufd $0xee,%xmm4,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xaa,%xmm1,%xmm2
pmuludq %xmm1,%xmm2
pmuludq %xmm0,%xmm2
movd   %xmm2,%r9d
cmp    %r14,%rbp
jne    13ea <grid+0x2ea>
mov    -0x68(%rsp),%rdi
mov    -0x60(%rsp),%rbx
jmp    140e <grid+0x30e>
add    %r15,%r14
mov    -0x68(%rsp),%rdi
mov    -0x60(%rsp),%rbx
nopw   0x0(%rax,%rax,1)
imul   (%rdi,%r14,4),%r9d
add    $0x1,%r14
cmp    %r14,%r12
jne    1400 <grid+0x300>
test   %rbx,%rbx
je     1649 <grid+0x549>
cmp    $0x8,%rbx
jae    1430 <grid+0x330>
mov    $0x1,%ecx
xor    %ebp,%ebp
jmp    1630 <grid+0x530>
nopl   0x0(%rax)
mov    %r10d,%r14d
mov    %rbx,%rcx
and    $0xfffffffffffffff8,%rcx
add    $0xfffffffffffffff8,%rcx
shr    $0x3,%rcx
mov    %rbx,%rbp
movabs $0x7ffffffffffffff8,%rsi
ff ff 7f
and    %rsi,%rbp
lea    -0x8(%rbp),%rsi
mov    %rsi,%r10
shr    $0x3,%r10
add    $0x1,%r10
cmp    $0x18,%rsi
jae    1478 <grid+0x378>
xor    %ebx,%ebx
movdqa %xmm8,%xmm2
movdqa %xmm8,%xmm1
jmp    155b <grid+0x45b>
lea    0x1(%rcx),%rsi
and    $0xfffffffffffffffc,%rsi
xor    %ebx,%ebx
movdqa %xmm8,%xmm2
movdqa %xmm8,%xmm1
nopl   0x0(%rax)
movdqu (%rdi,%rbx,4),%xmm4
movdqu 0x10(%rdi,%rbx,4),%xmm3
movdqu 0x20(%rdi,%rbx,4),%xmm0
movdqu 0x30(%rdi,%rbx,4),%xmm5
pshufd $0xf5,%xmm4,%xmm6
pshufd $0xf5,%xmm2,%xmm7
pmuludq %xmm6,%xmm7
pmuludq %xmm2,%xmm4
pshufd $0xf5,%xmm3,%xmm2
pshufd $0xf5,%xmm1,%xmm6
pmuludq %xmm2,%xmm6
pmuludq %xmm1,%xmm3
pmuludq %xmm0,%xmm4
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm7,%xmm0
pmuludq %xmm5,%xmm3
pshufd $0xf5,%xmm5,%xmm1
pmuludq %xmm6,%xmm1
movdqu 0x40(%rdi,%rbx,4),%xmm2
movdqu 0x50(%rdi,%rbx,4),%xmm5
pshufd $0xf5,%xmm2,%xmm6
pmuludq %xmm0,%xmm6
pmuludq %xmm2,%xmm4
pshufd $0xf5,%xmm5,%xmm0
pmuludq %xmm1,%xmm0
pmuludq %xmm5,%xmm3
movdqu 0x60(%rdi,%rbx,4),%xmm1
movdqu 0x70(%rdi,%rbx,4),%xmm5
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm2
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm6,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm2
pmuludq %xmm5,%xmm3
pshufd $0xe8,%xmm3,%xmm1
pshufd $0xf5,%xmm5,%xmm3
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm0
punpckldq %xmm0,%xmm1
add    $0x20,%rbx
add    $0xfffffffffffffffc,%rsi
jne    1490 <grid+0x390>
movdqa %xmm2,%xmm3
movdqa %xmm1,%xmm4
test   $0x3,%r10b
je     15ec <grid+0x4ec>
add    $0x1,%cl
movzbl %cl,%ecx
and    $0x3,%ecx
shl    $0x5,%rcx
mov    -0x50(%rsp),%rsi
lea    (%rsi,%rbx,4),%rsi
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
movdqu -0x10(%rsi,%rbx,1),%xmm0
movdqu (%rsi,%rbx,1),%xmm4
pshufd $0xf5,%xmm0,%xmm5
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm3
pshufd $0xf5,%xmm2,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm3
pshufd $0xf5,%xmm4,%xmm0
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm4
add    $0x20,%rbx
movdqa %xmm3,%xmm2
movdqa %xmm4,%xmm1
cmp    %rbx,%rcx
jne    1590 <grid+0x490>
pshufd $0xf5,%xmm3,%xmm0
pshufd $0xf5,%xmm4,%xmm1
pmuludq %xmm0,%xmm1
pmuludq %xmm3,%xmm4
pshufd $0xee,%xmm4,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xaa,%xmm1,%xmm2
pmuludq %xmm1,%xmm2
pmuludq %xmm0,%xmm2
movd   %xmm2,%ecx
mov    -0x60(%rsp),%rbx
cmp    %rbp,%rbx
mov    -0x68(%rsp),%rdi
mov    %r14d,%r10d
je     163d <grid+0x53d>
nopw   0x0(%rax,%rax,1)
imul   (%rdi,%rbp,4),%ecx
add    $0x1,%rbp
cmp    %rbp,%rbx
jne    1630 <grid+0x530>
mov    %ecx,-0x6c(%rsp)
test   %ecx,%ecx
jle    117c <grid+0x7c>
mov    %r13,-0x40(%rsp)
mov    %r15,-0x38(%rsp)
mov    %r11,-0x30(%rsp)
mov    %r8,-0x28(%rsp)
mov    (%rdi,%rbx,4),%r10d
lea    -0x1(%r9),%r8d
lea    0x1(%r8),%r12
mov    %r12,-0x8(%rsp)
movabs $0x1fffffff8,%rcx
and    %rcx,%r12
lea    -0x8(%r12),%r13
mov    %r13,%rcx
shr    $0x3,%rcx
add    $0x1,%rcx
mov    %ecx,%r14d
and    $0x3,%r14d
and    $0xfffffffffffffffc,%rcx
mov    %rcx,-0x18(%rsp)
mov    %r14,%rcx
shl    $0x5,%rcx
xor    %r15d,%r15d
jmp    16bf <grid+0x5bf>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r15d
cmp    -0x6c(%rsp),%r15d
je     1160 <grid+0x60>
test   %r10d,%r10d
jle    16b0 <grid+0x5b0>
mov    $0x1,%r11d
jmp    16e0 <grid+0x5e0>
nopl   0x0(%rax)
mov    (%rdi,%rbx,4),%r10d
lea    0x1(%r11),%esi
cmp    %r10d,%r11d
mov    %esi,%r11d
jge    16b0 <grid+0x5b0>
test   %r9d,%r9d
jle    16d4 <grid+0x5d4>
xor    %ebp,%ebp
cltq
cmp    $0x7,%r8d
jb     179f <grid+0x69f>
movd   %r11d,%xmm0
pshufd $0x0,%xmm0,%xmm1
cmp    $0x18,%r13
jae    1707 <grid+0x607>
xor    %ebx,%ebx
jmp    175a <grid+0x65a>
mov    -0x20(%rsp),%rsi
lea    (%rsi,%rax,4),%rbp
mov    -0x18(%rsp),%rsi
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movdqu %xmm1,-0x70(%rbp,%rbx,4)
movdqu %xmm1,-0x60(%rbp,%rbx,4)
movdqu %xmm1,-0x50(%rbp,%rbx,4)
movdqu %xmm1,-0x40(%rbp,%rbx,4)
movdqu %xmm1,-0x30(%rbp,%rbx,4)
movdqu %xmm1,-0x20(%rbp,%rbx,4)
movdqu %xmm1,-0x10(%rbp,%rbx,4)
movdqu %xmm1,0x0(%rbp,%rbx,4)
add    $0x20,%rbx
add    $0xfffffffffffffffc,%rsi
jne    1720 <grid+0x620>
test   %r14,%r14
je     1784 <grid+0x684>
add    %rax,%rbx
mov    -0x10(%rsp),%rsi
lea    (%rsi,%rbx,4),%rsi
xor    %ebp,%ebp
nopl   (%rax)
movdqu %xmm1,-0x10(%rsi,%rbp,1)
movdqu %xmm1,(%rsi,%rbp,1)
add    $0x20,%rbp
cmp    %rbp,%rcx
jne    1770 <grid+0x670>
add    %r12,%rax
mov    %r12d,%ebp
cmp    %r12,-0x8(%rsp)
mov    -0x68(%rsp),%rdi
mov    -0x60(%rsp),%rbx
je     16d0 <grid+0x5d0>
mov    %r9d,%esi
sub    %ebp,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r11d,(%rdx,%rax,4)
add    $0x1,%rax
add    $0xffffffff,%esi
jne    17b0 <grid+0x6b0>
jmp    16d0 <grid+0x5d0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @grid(i32* nocapture %0, i32* nocapture %1, i32* nocapture writeonly %2) {
%4 = load i32, i32* %1
%5 = icmp sgt i32 %4, 0
br i1 %5, label %14, label %332
6: ; preds = %326
%7 = load i32, i32* %1
br label %8
8: ; preds = %6, %215
%9 = phi i32 [ %15, %215 ], [ %7, %6 ]
%10 = phi i32 [ %18, %215 ], [ %329, %6 ]
%11 = sext i32 %9 to i64
%12 = icmp slt i64 %23, %11
%13 = add nuw nsw i64 %17, 1
br i1 %12, label %14, label %332
14: ; preds = %3, %8
%15 = phi i32 [ %9, %8 ], [ %4, %3 ]
%16 = phi i64 [ %23, %8 ], [ 0, %3 ]
%17 = phi i64 [ %13, %8 ], [ 1, %3 ]
%18 = phi i32 [ %10, %8 ], [ 0, %3 ]
%19 = and i64 %16, 9223372036854775800
%20 = add nsw i64 %19, -8
%21 = lshr exact i64 %20, 3
%22 = add nuw nsw i64 %21, 1
%23 = add nuw nsw i64 %16, 1
%24 = sext i32 %15 to i64
%25 = icmp slt i64 %23, %24
br i1 %25, label %26, label %121
26: ; preds = %14
%27 = xor i64 %16, -1
%28 = zext i32 %15 to i64
%29 = add nsw i64 %27, %28
%30 = icmp ult i64 %29, 8
br i1 %30, label %118, label %31
31: ; preds = %26
%32 = and i64 %29, -8
%33 = add i64 %17, %32
%34 = add i64 %32, -8
%35 = lshr exact i64 %34, 3
%36 = add nuw nsw i64 %35, 1
%37 = and i64 %36, 3
%38 = icmp ult i64 %34, 24
br i1 %38, label %88, label %39
39: ; preds = %31
%40 = and i64 %36, 4611686018427387900
br label %41
41: ; preds = %41, %39
%42 = phi i64 [ 0, %39 ], [ %85, %41 ]
%43 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %39 ], [ %83, %41 ]
%44 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %39 ], [ %84, %41 ]
%45 = phi i64 [ 0, %39 ], [ %86, %41 ]
%46 = add i64 %17, %42
%47 = getelementptr inbounds i32, i32* %0, i64 %46
%48 = bitcast i32* %47 to <4 x i32>*
%49 = load <4 x i32>, <4 x i32>* %48
%50 = getelementptr inbounds i32, i32* %47, i64 4
%51 = bitcast i32* %50 to <4 x i32>*
%52 = load <4 x i32>, <4 x i32>* %51
%53 = mul <4 x i32> %49, %43
%54 = mul <4 x i32> %52, %44
%55 = or i64 %42, 8
%56 = add i64 %17, %55
%57 = getelementptr inbounds i32, i32* %0, i64 %56
%58 = bitcast i32* %57 to <4 x i32>*
%59 = load <4 x i32>, <4 x i32>* %58
%60 = getelementptr inbounds i32, i32* %57, i64 4
%61 = bitcast i32* %60 to <4 x i32>*
%62 = load <4 x i32>, <4 x i32>* %61
%63 = mul <4 x i32> %59, %53
%64 = mul <4 x i32> %62, %54
%65 = or i64 %42, 16
%66 = add i64 %17, %65
%67 = getelementptr inbounds i32, i32* %0, i64 %66
%68 = bitcast i32* %67 to <4 x i32>*
%69 = load <4 x i32>, <4 x i32>* %68
%70 = getelementptr inbounds i32, i32* %67, i64 4
%71 = bitcast i32* %70 to <4 x i32>*
%72 = load <4 x i32>, <4 x i32>* %71
%73 = mul <4 x i32> %69, %63
%74 = mul <4 x i32> %72, %64
%75 = or i64 %42, 24
%76 = add i64 %17, %75
%77 = getelementptr inbounds i32, i32* %0, i64 %76
%78 = bitcast i32* %77 to <4 x i32>*
%79 = load <4 x i32>, <4 x i32>* %78
%80 = getelementptr inbounds i32, i32* %77, i64 4
%81 = bitcast i32* %80 to <4 x i32>*
%82 = load <4 x i32>, <4 x i32>* %81
%83 = mul <4 x i32> %79, %73
%84 = mul <4 x i32> %82, %74
%85 = add nuw i64 %42, 32
%86 = add i64 %45, 4
%87 = icmp eq i64 %86, %40
br i1 %87, label %88, label %41
88: ; preds = %41, %31
%89 = phi <4 x i32> [ undef, %31 ], [ %83, %41 ]
%90 = phi <4 x i32> [ undef, %31 ], [ %84, %41 ]
%91 = phi i64 [ 0, %31 ], [ %85, %41 ]
%92 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %31 ], [ %83, %41 ]
%93 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %31 ], [ %84, %41 ]
%94 = icmp eq i64 %37, 0
br i1 %94, label %112, label %95
95: ; preds = %88, %95
%96 = phi i64 [ %109, %95 ], [ %91, %88 ]
%97 = phi <4 x i32> [ %107, %95 ], [ %92, %88 ]
%98 = phi <4 x i32> [ %108, %95 ], [ %93, %88 ]
%99 = phi i64 [ %110, %95 ], [ 0, %88 ]
%100 = add i64 %17, %96
%101 = getelementptr inbounds i32, i32* %0, i64 %100
%102 = bitcast i32* %101 to <4 x i32>*
%103 = load <4 x i32>, <4 x i32>* %102
%104 = getelementptr inbounds i32, i32* %101, i64 4
%105 = bitcast i32* %104 to <4 x i32>*
%106 = load <4 x i32>, <4 x i32>* %105
%107 = mul <4 x i32> %103, %97
%108 = mul <4 x i32> %106, %98
%109 = add nuw i64 %96, 8
%110 = add i64 %99, 1
%111 = icmp eq i64 %110, %37
br i1 %111, label %112, label %95
112: ; preds = %95, %88
%113 = phi <4 x i32> [ %89, %88 ], [ %107, %95 ]
%114 = phi <4 x i32> [ %90, %88 ], [ %108, %95 ]
%115 = mul <4 x i32> %114, %113
%116 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %115)
%117 = icmp eq i64 %29, %32
br i1 %117, label %121, label %118
118: ; preds = %26, %112
%119 = phi i64 [ %17, %26 ], [ %33, %112 ]
%120 = phi i32 [ 1, %26 ], [ %116, %112 ]
br label %207
121: ; preds = %207, %112, %14
%122 = phi i32 [ 1, %14 ], [ %116, %112 ], [ %212, %207 ]
%123 = icmp eq i64 %16, 0
br i1 %123, label %218, label %124
124: ; preds = %121
%125 = icmp ult i64 %16, 8
br i1 %125, label %204, label %126
126: ; preds = %124
%127 = and i64 %16, 9223372036854775800
%128 = and i64 %22, 3
%129 = icmp ult i64 %20, 24
br i1 %129, label %175, label %130
130: ; preds = %126
%131 = and i64 %22, 4611686018427387900
br label %132
132: ; preds = %132, %130
%133 = phi i64 [ 0, %130 ], [ %172, %132 ]
%134 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %130 ], [ %170, %132 ]
%135 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %130 ], [ %171, %132 ]
%136 = phi i64 [ 0, %130 ], [ %173, %132 ]
%137 = getelementptr inbounds i32, i32* %0, i64 %133
%138 = bitcast i32* %137 to <4 x i32>*
%139 = load <4 x i32>, <4 x i32>* %138
%140 = getelementptr inbounds i32, i32* %137, i64 4
%141 = bitcast i32* %140 to <4 x i32>*
%142 = load <4 x i32>, <4 x i32>* %141
%143 = mul <4 x i32> %139, %134
%144 = mul <4 x i32> %142, %135
%145 = or i64 %133, 8
%146 = getelementptr inbounds i32, i32* %0, i64 %145
%147 = bitcast i32* %146 to <4 x i32>*
%148 = load <4 x i32>, <4 x i32>* %147
%149 = getelementptr inbounds i32, i32* %146, i64 4
%150 = bitcast i32* %149 to <4 x i32>*
%151 = load <4 x i32>, <4 x i32>* %150
%152 = mul <4 x i32> %148, %143
%153 = mul <4 x i32> %151, %144
%154 = or i64 %133, 16
%155 = getelementptr inbounds i32, i32* %0, i64 %154
%156 = bitcast i32* %155 to <4 x i32>*
%157 = load <4 x i32>, <4 x i32>* %156
%158 = getelementptr inbounds i32, i32* %155, i64 4
%159 = bitcast i32* %158 to <4 x i32>*
%160 = load <4 x i32>, <4 x i32>* %159
%161 = mul <4 x i32> %157, %152
%162 = mul <4 x i32> %160, %153
%163 = or i64 %133, 24
%164 = getelementptr inbounds i32, i32* %0, i64 %163
%165 = bitcast i32* %164 to <4 x i32>*
%166 = load <4 x i32>, <4 x i32>* %165
%167 = getelementptr inbounds i32, i32* %164, i64 4
%168 = bitcast i32* %167 to <4 x i32>*
%169 = load <4 x i32>, <4 x i32>* %168
%170 = mul <4 x i32> %166, %161
%171 = mul <4 x i32> %169, %162
%172 = add nuw i64 %133, 32
%173 = add i64 %136, 4
%174 = icmp eq i64 %173, %131
br i1 %174, label %175, label %132
175: ; preds = %132, %126
%176 = phi <4 x i32> [ undef, %126 ], [ %170, %132 ]
%177 = phi <4 x i32> [ undef, %126 ], [ %171, %132 ]
%178 = phi i64 [ 0, %126 ], [ %172, %132 ]
%179 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %126 ], [ %170, %132 ]
%180 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %126 ], [ %171, %132 ]
%181 = icmp eq i64 %128, 0
br i1 %181, label %198, label %182
182: ; preds = %175, %182
%183 = phi i64 [ %195, %182 ], [ %178, %175 ]
%184 = phi <4 x i32> [ %193, %182 ], [ %179, %175 ]
%185 = phi <4 x i32> [ %194, %182 ], [ %180, %175 ]
%186 = phi i64 [ %196, %182 ], [ 0, %175 ]
%187 = getelementptr inbounds i32, i32* %0, i64 %183
%188 = bitcast i32* %187 to <4 x i32>*
%189 = load <4 x i32>, <4 x i32>* %188
%190 = getelementptr inbounds i32, i32* %187, i64 4
%191 = bitcast i32* %190 to <4 x i32>*
%192 = load <4 x i32>, <4 x i32>* %191
%193 = mul <4 x i32> %189, %184
%194 = mul <4 x i32> %192, %185
%195 = add nuw i64 %183, 8
%196 = add i64 %186, 1
%197 = icmp eq i64 %196, %128
br i1 %197, label %198, label %182
198: ; preds = %182, %175
%199 = phi <4 x i32> [ %176, %175 ], [ %193, %182 ]
%200 = phi <4 x i32> [ %177, %175 ], [ %194, %182 ]
%201 = mul <4 x i32> %200, %199
%202 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %201)
%203 = icmp eq i64 %16, %127
br i1 %203, label %215, label %204
204: ; preds = %124, %198
%205 = phi i64 [ 0, %124 ], [ %127, %198 ]
%206 = phi i32 [ 1, %124 ], [ %202, %198 ]
br label %238
207: ; preds = %118, %207
%208 = phi i64 [ %213, %207 ], [ %119, %118 ]
%209 = phi i32 [ %212, %207 ], [ %120, %118 ]
%210 = getelementptr inbounds i32, i32* %0, i64 %208
%211 = load i32, i32* %210
%212 = mul nsw i32 %211, %209
%213 = add nuw nsw i64 %208, 1
%214 = icmp eq i64 %213, %28
br i1 %214, label %121, label %207
215: ; preds = %238, %198
%216 = phi i32 [ %202, %198 ], [ %243, %238 ]
%217 = icmp sgt i32 %216, 0
br i1 %217, label %218, label %8
218: ; preds = %121, %215
%219 = phi i32 [ %216, %215 ], [ 1, %121 ]
%220 = getelementptr inbounds i32, i32* %0, i64 %16
%221 = icmp sgt i32 %122, 0
%222 = load i32, i32* %220
%223 = add i32 %122, -1
%224 = zext i32 %223 to i64
%225 = add nuw nsw i64 %224, 1
%226 = and i64 %225, 8589934584
%227 = add nsw i64 %226, -8
%228 = lshr exact i64 %227, 3
%229 = add nuw nsw i64 %228, 1
%230 = icmp ult i32 %223, 7
%231 = and i64 %225, 8589934584
%232 = trunc i64 %231 to i32
%233 = and i64 %229, 3
%234 = icmp ult i64 %227, 24
%235 = and i64 %229, 4611686018427387900
%236 = icmp eq i64 %233, 0
%237 = icmp eq i64 %225, %231
br label %246
238: ; preds = %204, %238
%239 = phi i64 [ %244, %238 ], [ %205, %204 ]
%240 = phi i32 [ %243, %238 ], [ %206, %204 ]
%241 = getelementptr inbounds i32, i32* %0, i64 %239
%242 = load i32, i32* %241
%243 = mul nsw i32 %242, %240
%244 = add nuw nsw i64 %239, 1
%245 = icmp eq i64 %244, %16
br i1 %245, label %215, label %238
246: ; preds = %218, %326
%247 = phi i32 [ %222, %218 ], [ %327, %326 ]
%248 = phi i32 [ %222, %218 ], [ %328, %326 ]
%249 = phi i32 [ %18, %218 ], [ %329, %326 ]
%250 = phi i32 [ 0, %218 ], [ %330, %326 ]
%251 = icmp slt i32 %248, 1
br i1 %251, label %326, label %252
252: ; preds = %246, %321
%253 = phi i32 [ %322, %321 ], [ %247, %246 ]
%254 = phi i32 [ %324, %321 ], [ 1, %246 ]
%255 = phi i32 [ %323, %321 ], [ %249, %246 ]
br i1 %221, label %256, label %321
256: ; preds = %252
%257 = sext i32 %255 to i64
br i1 %230, label %307, label %258
258: ; preds = %256
%259 = add nsw i64 %231, %257
%260 = insertelement <4 x i32> poison, i32 %254, i64 0
%261 = shufflevector <4 x i32> %260, <4 x i32> poison, <4 x i32> zeroinitializer
%262 = insertelement <4 x i32> poison, i32 %254, i64 0
%263 = shufflevector <4 x i32> %262, <4 x i32> poison, <4 x i32> zeroinitializer
br i1 %234, label %293, label %264
264: ; preds = %258, %264
%265 = phi i64 [ %290, %264 ], [ 0, %258 ]
%266 = phi i64 [ %291, %264 ], [ 0, %258 ]
%267 = add i64 %265, %257
%268 = getelementptr inbounds i32, i32* %2, i64 %267
%269 = bitcast i32* %268 to <4 x i32>*
store <4 x i32> %261, <4 x i32>* %269
%270 = getelementptr inbounds i32, i32* %268, i64 4
%271 = bitcast i32* %270 to <4 x i32>*
store <4 x i32> %263, <4 x i32>* %271
%272 = or i64 %265, 8
%273 = add i64 %272, %257
%274 = getelementptr inbounds i32, i32* %2, i64 %273
%275 = bitcast i32* %274 to <4 x i32>*
store <4 x i32> %261, <4 x i32>* %275
%276 = getelementptr inbounds i32, i32* %274, i64 4
%277 = bitcast i32* %276 to <4 x i32>*
store <4 x i32> %263, <4 x i32>* %277
%278 = or i64 %265, 16
%279 = add i64 %278, %257
%280 = getelementptr inbounds i32, i32* %2, i64 %279
%281 = bitcast i32* %280 to <4 x i32>*
store <4 x i32> %261, <4 x i32>* %281
%282 = getelementptr inbounds i32, i32* %280, i64 4
%283 = bitcast i32* %282 to <4 x i32>*
store <4 x i32> %263, <4 x i32>* %283
%284 = or i64 %265, 24
%285 = add i64 %284, %257
%286 = getelementptr inbounds i32, i32* %2, i64 %285
%287 = bitcast i32* %286 to <4 x i32>*
store <4 x i32> %261, <4 x i32>* %287
%288 = getelementptr inbounds i32, i32* %286, i64 4
%289 = bitcast i32* %288 to <4 x i32>*
store <4 x i32> %263, <4 x i32>* %289
%290 = add nuw i64 %265, 32
%291 = add i64 %266, 4
%292 = icmp eq i64 %291, %235
br i1 %292, label %293, label %264
293: ; preds = %264, %258
%294 = phi i64 [ 0, %258 ], [ %290, %264 ]
br i1 %236, label %306, label %295
295: ; preds = %293, %295
%296 = phi i64 [ %303, %295 ], [ %294, %293 ]
%297 = phi i64 [ %304, %295 ], [ 0, %293 ]
%298 = add i64 %296, %257
%299 = getelementptr inbounds i32, i32* %2, i64 %298
%300 = bitcast i32* %299 to <4 x i32>*
store <4 x i32> %261, <4 x i32>* %300
%301 = getelementptr inbounds i32, i32* %299, i64 4
%302 = bitcast i32* %301 to <4 x i32>*
store <4 x i32> %263, <4 x i32>* %302
%303 = add nuw i64 %296, 8
%304 = add i64 %297, 1
%305 = icmp eq i64 %304, %233
br i1 %305, label %306, label %295
306: ; preds = %295, %293
br i1 %237, label %317, label %307
307: ; preds = %256, %306
%308 = phi i64 [ %257, %256 ], [ %259, %306 ]
%309 = phi i32 [ 0, %256 ], [ %232, %306 ]
br label %310
310: ; preds = %307, %310
%311 = phi i64 [ %314, %310 ], [ %308, %307 ]
%312 = phi i32 [ %315, %310 ], [ %309, %307 ]
%313 = getelementptr inbounds i32, i32* %2, i64 %311
store i32 %254, i32* %313
%314 = add nsw i64 %311, 1
%315 = add nuw nsw i32 %312, 1
%316 = icmp eq i32 %315, %122
br i1 %316, label %317, label %310
317: ; preds = %310, %306
%318 = phi i64 [ %259, %306 ], [ %314, %310 ]
%319 = trunc i64 %318 to i32
%320 = load i32, i32* %220
br label %321
321: ; preds = %317, %252
%322 = phi i32 [ %253, %252 ], [ %320, %317 ]
%323 = phi i32 [ %255, %252 ], [ %319, %317 ]
%324 = add nuw nsw i32 %254, 1
%325 = icmp slt i32 %254, %322
br i1 %325, label %252, label %326
326: ; preds = %321, %246
%327 = phi i32 [ %247, %246 ], [ %322, %321 ]
%328 = phi i32 [ %248, %246 ], [ %322, %321 ]
%329 = phi i32 [ %249, %246 ], [ %323, %321 ]
%330 = add nuw nsw i32 %250, 1
%331 = icmp eq i32 %330, %219
br i1 %331, label %6, label %246
332: ; preds = %8, %3
ret void
}