void create_coords(coords, dim, units_p_dim, total_units) int **coords;
int dim, units_p_dim, total_units;
{
  int i, j;
  for (j = 1; j <= dim; j++)
    coords[1][j] = 1;
  for (i = 1; i <= total_units - 1; i++) {
    next_coord(coords, dim, units_p_dim, i);
  }
}


x86 assembly (clang, -O0):
<create_coords>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1159 <create_coords+0x49>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112c <create_coords+0x1c>
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1193 <create_coords+0x83>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
mov    -0x18(%rbp),%ecx
mov    $0x0,%al
call   1030 <next_coord@plt>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1160 <create_coords+0x50>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<create_coords>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %ecx,%r12d
mov    %edx,%r14d
mov    %esi,%ebp
mov    %rdi,%r15
test   %esi,%esi
jle    11f0 <create_coords+0xe0>
mov    0x8(%r15),%rax
mov    %ebp,%ecx
mov    $0x1,%edx
cmp    $0x8,%ebp
jb     11d8 <create_coords+0xc8>
mov    %ecx,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%rdi
mov    %rdi,%rsi
shr    $0x3,%rsi
add    $0x1,%rsi
mov    %esi,%ebx
and    $0x3,%ebx
cmp    $0x18,%rdi
jae    1162 <create_coords+0x52>
xor    %edi,%edi
jmp    11a2 <create_coords+0x92>
and    $0xfffffffffffffffc,%rsi
xor    %edi,%edi
movaps 0xe91(%rip),%xmm0
nop
movups %xmm0,0x4(%rax,%rdi,4)
movups %xmm0,0x14(%rax,%rdi,4)
movups %xmm0,0x24(%rax,%rdi,4)
movups %xmm0,0x34(%rax,%rdi,4)
movups %xmm0,0x44(%rax,%rdi,4)
movups %xmm0,0x54(%rax,%rdi,4)
movups %xmm0,0x64(%rax,%rdi,4)
movups %xmm0,0x74(%rax,%rdi,4)
add    $0x20,%rdi
add    $0xfffffffffffffffc,%rsi
jne    1170 <create_coords+0x60>
test   %rbx,%rbx
je     11cf <create_coords+0xbf>
movaps 0xe52(%rip),%xmm0
xchg   %ax,%ax
lea    0x0(,%rdi,4),%rsi
or     $0x4,%rsi
movups %xmm0,(%rax,%rsi,1)
movups %xmm0,0x10(%rax,%rsi,1)
add    $0x8,%rdi
add    $0xffffffffffffffff,%rbx
jne    11b0 <create_coords+0xa0>
cmp    %rdx,%rcx
je     11f0 <create_coords+0xe0>
or     $0x1,%rdx
add    $0x1,%rcx
nopl   0x0(%rax)
movl   $0x1,(%rax,%rdx,4)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    11e0 <create_coords+0xd0>
cmp    $0x2,%r12d
jl     1219 <create_coords+0x109>
mov    $0x1,%ebx
nopl   0x0(%rax,%rax,1)
mov    %r15,%rdi
mov    %ebp,%esi
mov    %r14d,%edx
mov    %ebx,%ecx
xor    %eax,%eax
call   1030 <next_coord@plt>
add    $0x1,%ebx
cmp    %ebx,%r12d
jne    1200 <create_coords+0xf0>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @create_coords(i32** %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i32** %0, i32*** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 1, i32* %10
br label %11
11: ; preds = %22, %4
%12 = load i32, i32* %10
%13 = load i32, i32* %6
%14 = icmp sle i32 %12, %13
br i1 %14, label %15, label %25
15: ; preds = %11
%16 = load i32**, i32*** %5
%17 = getelementptr inbounds i32*, i32** %16, i64 1
%18 = load i32*, i32** %17
%19 = load i32, i32* %10
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i32, i32* %18, i64 %20
store i32 1, i32* %21
br label %22
22: ; preds = %15
%23 = load i32, i32* %10
%24 = add nsw i32 %23, 1
store i32 %24, i32* %10
br label %11
25: ; preds = %11
store i32 1, i32* %9
br label %26
26: ; preds = %37, %25
%27 = load i32, i32* %9
%28 = load i32, i32* %8
%29 = sub nsw i32 %28, 1
%30 = icmp sle i32 %27, %29
br i1 %30, label %31, label %40
31: ; preds = %26
%32 = load i32**, i32*** %5
%33 = load i32, i32* %6
%34 = load i32, i32* %7
%35 = load i32, i32* %9
%36 = call i32 (i32**, i32, i32, i32, ...) bitcast (i32 (...)* @next_coord to i32 (i32**, i32, i32, i32, ...)*)(i32** %32, i32 %33, i32 %34, i32 %35)
br label %37
37: ; preds = %31
%38 = load i32, i32* %9
%39 = add nsw i32 %38, 1
store i32 %39, i32* %9
br label %26
40: ; preds = %26
ret void
}

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