void pet_c_allegro_build_all_lor(unsigned short int *idc1, int n1,
                                 unsigned short int *idd1, int n2,
                                 unsigned short int *idc2, int n3,
                                 unsigned short int *idd2, int n4) {
  int idmax = 22 * 29;
  int ndete = 28;
  int N = idmax * ndete;
  int Ntot = (N * N - N) / 2;
  int i1, i2;
  unsigned int dc1, dd1, dc2, dd2;
  int ct = 0;
  for (i1 = 0; i1 < (N - 1); ++i1) {
    dd1 = i1 / idmax;
    dc1 = i1 % idmax;
    for (i2 = i1 + 1; i2 < N; ++i2) {
      dd2 = i2 / idmax;
      dc2 = i2 % idmax;
      idc1[ct] = dc1;
      idd1[ct] = dd1;
      idc2[ct] = dc2;
      idd2[ct] = dd2;
      ++ct;
    }
  }
}


x86 assembly (clang, -O0):
<pet_c_allegro_build_all_lor>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0x27e,-0x30(%rbp)
movl   $0x1c,-0x34(%rbp)
mov    -0x30(%rbp),%eax
imul   -0x34(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
imul   -0x38(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x58(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    121c <pet_c_allegro_build_all_lor+0x11c>
mov    -0x40(%rbp),%eax
cltd
idivl  -0x30(%rbp)
mov    %eax,-0x4c(%rbp)
mov    -0x40(%rbp),%eax
cltd
idivl  -0x30(%rbp)
mov    %edx,-0x48(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    1209 <pet_c_allegro_build_all_lor+0x109>
mov    -0x44(%rbp),%eax
cltd
idivl  -0x30(%rbp)
mov    %eax,-0x54(%rbp)
mov    -0x44(%rbp),%eax
cltd
idivl  -0x30(%rbp)
mov    %edx,-0x50(%rbp)
mov    -0x48(%rbp),%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x4c(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x50(%rbp),%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x54(%rbp),%eax
mov    %ax,%dx
mov    0x10(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    118a <pet_c_allegro_build_all_lor+0x8a>
jmp    120e <pet_c_allegro_build_all_lor+0x10e>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    115c <pet_c_allegro_build_all_lor+0x5c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<pet_c_allegro_build_all_lor>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8,-0x8(%rsp)
mov    %rdx,-0x10(%rsp)
mov    %rdi,-0x18(%rsp)
mov    $0x45c7,%r8d
xor    %r11d,%r11d
movdqa 0xed5(%rip),%xmm8
movdqa 0xedc(%rip),%xmm9
movdqa 0xee4(%rip),%xmm2
movdqa 0xeec(%rip),%xmm3
xor    %r15d,%r15d
jmp    1161 <pet_c_allegro_build_all_lor+0x61>
nopl   0x0(%rax)
add    $0xffffffffffffffff,%r8
cmp    $0x45c7,%r11d
je     13cd <pet_c_allegro_build_all_lor+0x2cd>
mov    $0x45c7,%r9d
sub    %r11,%r9
movzwl %r11w,%eax
shr    %eax
imul   $0x66b9,%eax,%r13d
shr    $0x17,%r13d
imul   $0x27e,%r13d,%eax
mov    %r11d,%r12d
sub    %eax,%r12d
add    $0x1,%r11
movslq %r15d,%r14
cmp    $0x8,%r9
jae    11a0 <pet_c_allegro_build_all_lor+0xa0>
mov    %r14,%r15
mov    %r11d,%r10d
jmp    133b <pet_c_allegro_build_all_lor+0x23b>
mov    %r8,-0x20(%rsp)
mov    -0x10(%rsp),%rbx
lea    (%rbx,%r9,2),%rsi
mov    -0x18(%rsp),%rcx
cmp    %rcx,%rsi
seta   -0x21(%rsp)
lea    (%rcx,%r9,2),%rdx
cmp    %rbx,%rdx
seta   -0x22(%rsp)
mov    -0x8(%rsp),%rdi
lea    (%rdi,%r9,2),%r15
cmp    %rcx,%r15
seta   %al
cmp    %rdi,%rdx
seta   -0x23(%rsp)
mov    0x38(%rsp),%rbp
lea    0x0(,%r9,2),%r10
add    %rbp,%r10
cmp    %rcx,%r10
seta   %cl
cmp    %rbp,%rdx
seta   -0x24(%rsp)
cmp    %rbx,%r15
seta   %dl
cmp    %rdi,%rsi
seta   -0x25(%rsp)
cmp    %rbx,%r10
seta   %r8b
cmp    %rbp,%rsi
seta   -0x26(%rsp)
cmp    %rdi,%r10
seta   %sil
cmp    %rbp,%r15
seta   %dil
mov    -0x22(%rsp),%bl
test   %bl,-0x21(%rsp)
jne    1330 <pet_c_allegro_build_all_lor+0x230>
and    -0x23(%rsp),%al
jne    1330 <pet_c_allegro_build_all_lor+0x230>
and    -0x24(%rsp),%cl
jne    1330 <pet_c_allegro_build_all_lor+0x230>
and    -0x25(%rsp),%dl
jne    1330 <pet_c_allegro_build_all_lor+0x230>
and    -0x26(%rsp),%r8b
jne    1330 <pet_c_allegro_build_all_lor+0x230>
and    %dil,%sil
jne    1330 <pet_c_allegro_build_all_lor+0x230>
mov    -0x20(%rsp),%r8
mov    %r8,%rsi
and    $0xfffffffffffffff8,%rsi
mov    %r9,%rdi
and    $0xfffffffffffffff8,%rdi
lea    (%r14,%rdi,1),%r15
lea    (%r11,%rdi,1),%r10d
movd   %r11d,%xmm4
pshuflw $0x0,%xmm4,%xmm4
pshufd $0x0,%xmm4,%xmm1
paddw  %xmm8,%xmm1
movd   %r12d,%xmm5
pshuflw $0x0,%xmm5,%xmm5
pshufd $0x0,%xmm5,%xmm5
movd   %r13d,%xmm6
pshuflw $0x0,%xmm6,%xmm6
pshufd $0x0,%xmm6,%xmm6
mov    -0x18(%rsp),%rax
lea    (%rax,%r14,2),%rcx
mov    -0x10(%rsp),%rax
lea    (%rax,%r14,2),%rbp
mov    -0x8(%rsp),%rax
lea    (%rax,%r14,2),%rax
mov    0x38(%rsp),%rdx
lea    (%rdx,%r14,2),%rbx
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
movdqa %xmm1,%xmm7
psrlw  $0x1,%xmm7
pmulhuw %xmm9,%xmm7
psrlw  $0x7,%xmm7
movdqa %xmm7,%xmm0
pmullw %xmm2,%xmm0
movdqa %xmm1,%xmm4
psubw  %xmm0,%xmm4
movdqu %xmm5,(%rcx,%rdx,2)
movdqu %xmm6,0x0(%rbp,%rdx,2)
movdqu %xmm4,(%rax,%rdx,2)
movdqu %xmm7,(%rbx,%rdx,2)
add    $0x8,%rdx
paddw  %xmm3,%xmm1
cmp    %rdx,%rsi
jne    12e0 <pet_c_allegro_build_all_lor+0x1e0>
cmp    %rdi,%r9
je     1150 <pet_c_allegro_build_all_lor+0x50>
jmp    133b <pet_c_allegro_build_all_lor+0x23b>
mov    %r14,%r15
mov    %r11d,%r10d
mov    -0x20(%rsp),%r8
mov    -0x18(%rsp),%rax
lea    (%rax,%r15,2),%r14
mov    -0x10(%rsp),%rax
lea    (%rax,%r15,2),%rsi
mov    -0x8(%rsp),%rax
lea    (%rax,%r15,2),%rax
mov    0x38(%rsp),%rcx
lea    (%rcx,%r15,2),%rcx
mov    %r10d,%ebp
mov    %r10d,%r9d
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movzwl %r9w,%r9d
mov    %r9d,%edx
shr    %edx
imul   $0x66b9,%edx,%edx
shr    $0x17,%edx
imul   $0x27e,%edx,%edx
mov    %r10d,%edi
sub    %edx,%edi
lea    (%rbx,%rbp,1),%edx
movzwl %dx,%edx
shr    %edx
imul   $0x66b9,%edx,%edx
shr    $0x17,%edx
add    %ebx,%edi
mov    %r12w,(%r14,%rbx,2)
mov    %r13w,(%rsi,%rbx,2)
mov    %di,(%rax,%rbx,2)
mov    %dx,(%rcx,%rbx,2)
add    $0x1,%rbx
lea    (%rbx,%rbp,1),%edx
add    $0x1,%r9d
cmp    $0x45c8,%edx
jne    1370 <pet_c_allegro_build_all_lor+0x270>
add    %rbx,%r15
jmp    1150 <pet_c_allegro_build_all_lor+0x50>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @pet_c_allegro_build_all_lor(i16* nocapture writeonly %0, i32 %1, i16* nocapture writeonly %2, i32 %3, i16* nocapture writeonly %4, i32 %5, i16* nocapture writeonly %6, i32 %7) {
br label %13
9: ; preds = %91, %86
%10 = phi i64 [ %56, %86 ], [ %101, %91 ]
%11 = icmp eq i32 %22, 17863
%12 = add i64 %14, 1
br i1 %11, label %104, label %13
13: ; preds = %9, %8
%14 = phi i64 [ %12, %9 ], [ 0, %8 ]
%15 = phi i64 [ %10, %9 ], [ 0, %8 ]
%16 = phi i32 [ %22, %9 ], [ 0, %8 ]
%17 = sub i64 17863, %14
%18 = sub i64 17863, %14
%19 = trunc i32 %16 to i16
%20 = udiv i16 %19, 638
%21 = urem i16 %19, 638
%22 = add nuw nsw i32 %16, 1
%23 = shl i64 %15, 32
%24 = ashr exact i64 %23, 32
%25 = icmp ult i64 %17, 8
br i1 %25, label %88, label %26
26: ; preds = %13
%27 = getelementptr i16, i16* %6, i64 %18
%28 = getelementptr i16, i16* %4, i64 %18
%29 = getelementptr i16, i16* %2, i64 %18
%30 = getelementptr i16, i16* %0, i64 %18
%31 = icmp ugt i16* %29, %0
%32 = icmp ugt i16* %30, %2
%33 = and i1 %31, %32
%34 = icmp ugt i16* %28, %0
%35 = icmp ugt i16* %30, %4
%36 = and i1 %34, %35
%37 = or i1 %33, %36
%38 = icmp ugt i16* %27, %0
%39 = icmp ugt i16* %30, %6
%40 = and i1 %38, %39
%41 = or i1 %37, %40
%42 = icmp ugt i16* %28, %2
%43 = icmp ugt i16* %29, %4
%44 = and i1 %42, %43
%45 = or i1 %41, %44
%46 = icmp ugt i16* %27, %2
%47 = icmp ugt i16* %29, %6
%48 = and i1 %46, %47
%49 = or i1 %45, %48
%50 = icmp ugt i16* %27, %4
%51 = icmp ugt i16* %28, %6
%52 = and i1 %50, %51
%53 = or i1 %49, %52
br i1 %53, label %88, label %54
54: ; preds = %26
%55 = and i64 %17, -8
%56 = add i64 %24, %55
%57 = trunc i64 %55 to i32
%58 = add i32 %22, %57
%59 = trunc i32 %22 to i16
%60 = insertelement <8 x i16> poison, i16 %59, i64 0
%61 = shufflevector <8 x i16> %60, <8 x i16> poison, <8 x i32> zeroinitializer
%62 = add <8 x i16> %61, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
%63 = insertelement <8 x i16> poison, i16 %21, i64 0
%64 = shufflevector <8 x i16> %63, <8 x i16> poison, <8 x i32> zeroinitializer
%65 = insertelement <8 x i16> poison, i16 %20, i64 0
%66 = shufflevector <8 x i16> %65, <8 x i16> poison, <8 x i32> zeroinitializer
br label %67
67: ; preds = %67, %54
%68 = phi i64 [ 0, %54 ], [ %83, %67 ]
%69 = phi <8 x i16> [ %62, %54 ], [ %84, %67 ]
%70 = add i64 %24, %68
%71 = freeze <8 x i16> %69
%72 = udiv <8 x i16> %71, <i16 638, i16 638, i16 638, i16 638, i16 638, i16 638, i16 638, i16 638>
%73 = mul <8 x i16> %72, <i16 638, i16 638, i16 638, i16 638, i16 638, i16 638, i16 638, i16 638>
%74 = sub <8 x i16> %71, %73
%75 = getelementptr inbounds i16, i16* %0, i64 %70
%76 = bitcast i16* %75 to <8 x i16>*
store <8 x i16> %64, <8 x i16>* %76
%77 = getelementptr inbounds i16, i16* %2, i64 %70
%78 = bitcast i16* %77 to <8 x i16>*
store <8 x i16> %66, <8 x i16>* %78
%79 = getelementptr inbounds i16, i16* %4, i64 %70
%80 = bitcast i16* %79 to <8 x i16>*
store <8 x i16> %74, <8 x i16>* %80
%81 = getelementptr inbounds i16, i16* %6, i64 %70
%82 = bitcast i16* %81 to <8 x i16>*
store <8 x i16> %72, <8 x i16>* %82
%83 = add nuw i64 %68, 8
%84 = add <8 x i16> %69, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%85 = icmp eq i64 %83, %55
br i1 %85, label %86, label %67
86: ; preds = %67
%87 = icmp eq i64 %17, %55
br i1 %87, label %9, label %88
88: ; preds = %26, %13, %86
%89 = phi i64 [ %24, %26 ], [ %24, %13 ], [ %56, %86 ]
%90 = phi i32 [ %22, %26 ], [ %22, %13 ], [ %58, %86 ]
br label %91
91: ; preds = %88, %91
%92 = phi i64 [ %101, %91 ], [ %89, %88 ]
%93 = phi i32 [ %102, %91 ], [ %90, %88 ]
%94 = trunc i32 %93 to i16
%95 = udiv i16 %94, 638
%96 = urem i16 %94, 638
%97 = getelementptr inbounds i16, i16* %0, i64 %92
store i16 %21, i16* %97
%98 = getelementptr inbounds i16, i16* %2, i64 %92
store i16 %20, i16* %98
%99 = getelementptr inbounds i16, i16* %4, i64 %92
store i16 %96, i16* %99
%100 = getelementptr inbounds i16, i16* %6, i64 %92
store i16 %95, i16* %100
%101 = add nsw i64 %92, 1
%102 = add nuw nsw i32 %93, 1
%103 = icmp eq i32 %102, 17864
br i1 %103, label %9, label %91
104: ; preds = %9
ret void
}