int queens(int n) {
  int dtab[100];
  int freetab1[100 + 1];
  int freetab2[2 * 100 + 1];
  int freetab3a[2 * 100 - 1];
  {
    int i;
    for (i = 1; i <= n; i++) {
      freetab1[i] = 0;
    }
  }
  {
    int i;
    for (i = 2; i <= 2 * n; i++) {
      freetab2[i] = 0;
    }
  }
  {
    int i;
    for (i = -(n - 1); i < n; i++) {
      (&freetab3a[100 - 1])[i] = 0;
    }
  }
  {
    int counter = 0;
    int i = 0;
    int *Dptr = &dtab[0];
  entry:
    i++;
    if (i > n) {
      counter++;
    } else {
      int j;
      for (j = 1; j <= n; j++) {
        if (freetab1[j] == 0 && freetab2[j + i] == 0 &&
            (&freetab3a[100 - 1])[j - i] == 0) {
          freetab1[j] = 1;
          freetab2[j + i] = 1;
          (&freetab3a[100 - 1])[j - i] = 1;
          *Dptr++ = j;
          goto entry;
        comeback:
          j = *--Dptr;
          freetab1[j] = 0;
          freetab2[j + i] = 0;
          (&freetab3a[100 - 1])[j - i] = 0;
        }
      }
    }
    i--;
    if (i > 0)
      goto comeback;
    return counter;
  }
}


x86 assembly (clang, -O0):
<queens>:
push   %rbp
mov    %rsp,%rbp
sub    $0x940,%rsp
mov    %edi,-0x4(%rbp)
movl   $0x1,-0x994(%rbp)
mov    -0x994(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     114d <queens+0x4d>
movslq -0x994(%rbp),%rax
movl   $0x0,-0x340(%rbp,%rax,4)
mov    -0x994(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x994(%rbp)
jmp    1118 <queens+0x18>
movl   $0x2,-0x998(%rbp)
mov    -0x998(%rbp),%eax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jg     1191 <queens+0x91>
movslq -0x998(%rbp),%rax
movl   $0x0,-0x670(%rbp,%rax,4)
mov    -0x998(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x998(%rbp)
jmp    1157 <queens+0x57>
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x99c(%rbp)
mov    -0x99c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11d6 <queens+0xd6>
movslq -0x99c(%rbp),%rax
movl   $0x0,-0x804(%rbp,%rax,4)
mov    -0x99c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x99c(%rbp)
jmp    11a1 <queens+0xa1>
movl   $0x0,-0x9a0(%rbp)
movl   $0x0,-0x9a4(%rbp)
lea    -0x1a0(%rbp),%rax
mov    %rax,-0x9b0(%rbp)
mov    -0x9a4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9a4(%rbp)
mov    -0x9a4(%rbp),%eax
cmp    -0x4(%rbp),%eax
jle    122a <queens+0x12a>
mov    -0x9a0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9a0(%rbp)
jmp    1376 <queens+0x276>
movl   $0x1,-0x9b4(%rbp)
mov    -0x9b4(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1371 <queens+0x271>
movslq -0x9b4(%rbp),%rax
cmpl   $0x0,-0x340(%rbp,%rax,4)
jne    1358 <queens+0x258>
mov    -0x9b4(%rbp),%eax
add    -0x9a4(%rbp),%eax
cltq
cmpl   $0x0,-0x670(%rbp,%rax,4)
jne    1358 <queens+0x258>
mov    -0x9b4(%rbp),%eax
sub    -0x9a4(%rbp),%eax
cltq
cmpl   $0x0,-0x804(%rbp,%rax,4)
jne    1358 <queens+0x258>
movslq -0x9b4(%rbp),%rax
movl   $0x1,-0x340(%rbp,%rax,4)
mov    -0x9b4(%rbp),%eax
add    -0x9a4(%rbp),%eax
cltq
movl   $0x1,-0x670(%rbp,%rax,4)
mov    -0x9b4(%rbp),%eax
sub    -0x9a4(%rbp),%eax
cltq
movl   $0x1,-0x804(%rbp,%rax,4)
mov    -0x9b4(%rbp),%ecx
mov    -0x9b0(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x9b0(%rbp)
mov    %ecx,(%rax)
jmp    11f8 <queens+0xf8>
mov    -0x9b0(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffc,%rcx
mov    %rcx,-0x9b0(%rbp)
mov    -0x4(%rax),%eax
mov    %eax,-0x9b4(%rbp)
movslq -0x9b4(%rbp),%rax
movl   $0x0,-0x340(%rbp,%rax,4)
mov    -0x9b4(%rbp),%eax
add    -0x9a4(%rbp),%eax
cltq
movl   $0x0,-0x670(%rbp,%rax,4)
mov    -0x9b4(%rbp),%eax
sub    -0x9a4(%rbp),%eax
cltq
movl   $0x0,-0x804(%rbp,%rax,4)
jmp    135d <queens+0x25d>
mov    -0x9b4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9b4(%rbp)
jmp    1234 <queens+0x134>
jmp    1376 <queens+0x276>
mov    -0x9a4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x9a4(%rbp)
cmpl   $0x0,-0x9a4(%rbp)
jle    1397 <queens+0x297>
jmp    12f6 <queens+0x1f6>
mov    -0x9a0(%rbp),%eax
add    $0x940,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<queens>:
push   %r15
push   %r14
push   %rbx
sub    $0x980,%rsp
mov    %edi,%r15d
test   %edi,%edi
jle    1163 <queens+0x53>
lea    0x4(%rsp),%rdi
mov    %r15d,%edx
shl    $0x2,%rdx
xor    %esi,%esi
call   1030 <memset@plt>
lea    (%r15,%r15,1),%r14d
lea    0x4c8(%rsp),%rdi
cmp    $0x3,%r14d
mov    $0x2,%eax
cmovge %r14d,%eax
add    $0xfffffffe,%eax
lea    0x4(,%rax,4),%rdx
xor    %esi,%esi
call   1030 <memset@plt>
jmp    1167 <queens+0x57>
lea    (%r15,%r15,1),%r14d
mov    $0x1,%eax
sub    %r15d,%eax
cmp    %r15d,%eax
jge    1197 <queens+0x87>
cltq
lea    (%rsp,%rax,4),%rdi
add    $0x32c,%rdi
add    $0xfffffffe,%r14d
shl    $0x2,%r14
or     $0x4,%r14
xor    %esi,%esi
mov    %r14,%rdx
call   1030 <memset@plt>
xor    %eax,%eax
lea    0x7f0(%rsp),%rcx
xor    %edx,%edx
mov    %edx,%edi
lea    0x1(%rdi),%edx
mov    $0x1,%esi
cmp    %r15d,%edi
jl     1203 <queens+0xf3>
add    $0x1,%eax
cs nopw 0x0(%rax,%rax,1)
nop
mov    %edx,%esi
lea    -0x1(%rsi),%edx
cmp    $0x2,%esi
jl     125e <queens+0x14e>
movslq -0x4(%rcx),%rsi
add    $0xfffffffffffffffc,%rcx
movl   $0x0,(%rsp,%rsi,4)
lea    (%rsi,%rdx,1),%edi
movslq %edi,%rdi
movl   $0x0,0x4c0(%rsp,%rdi,4)
mov    %esi,%edi
sub    %edx,%edi
movslq %edi,%rdi
movl   $0x0,0x32c(%rsp,%rdi,4)
add    $0x1,%esi
cmp    %r15d,%esi
jg     11c0 <queens+0xb0>
movslq %esi,%rdi
cmpl   $0x0,(%rsp,%rdi,4)
jne    1200 <queens+0xf0>
lea    (%rsi,%rdx,1),%ebx
movslq %ebx,%r9
cmpl   $0x0,0x4c0(%rsp,%r9,4)
jne    1200 <queens+0xf0>
mov    %esi,%ebx
sub    %edx,%ebx
movslq %ebx,%r8
cmpl   $0x0,0x32c(%rsp,%r8,4)
jne    1200 <queens+0xf0>
movl   $0x1,(%rsp,%rdi,4)
movl   $0x1,0x4c0(%rsp,%r9,4)
movl   $0x1,0x32c(%rsp,%r8,4)
mov    %esi,(%rcx)
add    $0x4,%rcx
jmp    11a3 <queens+0x93>
add    $0x980,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

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

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