#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 */
scalar_t__ is_fixed(int);
int simplify_nakedsingle_struc(int *struc[9]) {
  int progress = 0;
  int i, j;
  for (i = 0; i < 9; i++)
    if (is_fixed(*struc[i]))
      for (j = 0; j < 9; j++)
        if (i != j && (*struc[j] & *struc[i])) {
          *struc[j] -= *struc[i];
          progress = 1;
        }
  return progress;
}


x86 assembly (clang, -O0):
<simplify_nakedsingle_struc>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
cmpl   $0x9,-0x10(%rbp)
jge    11e5 <simplify_nakedsingle_struc+0xd5>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%edi
call   1030 <is_fixed@plt>
cmp    $0x0,%rax
je     11d2 <simplify_nakedsingle_struc+0xc2>
movl   $0x0,-0x14(%rbp)
cmpl   $0x9,-0x14(%rbp)
jge    11cd <simplify_nakedsingle_struc+0xbd>
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
je     11ba <simplify_nakedsingle_struc+0xaa>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11ba <simplify_nakedsingle_struc+0xaa>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%ecx
sub    %edx,%ecx
mov    %ecx,(%rax)
movl   $0x1,-0xc(%rbp)
jmp    11bf <simplify_nakedsingle_struc+0xaf>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1158 <simplify_nakedsingle_struc+0x48>
jmp    11d2 <simplify_nakedsingle_struc+0xc2>
jmp    11d7 <simplify_nakedsingle_struc+0xc7>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    112a <simplify_nakedsingle_struc+0x1a>
mov    -0xc(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<simplify_nakedsingle_struc>:
push   %rbp
push   %r14
push   %rbx
mov    %rdi,%rbx
xor    %ebp,%ebp
xor    %r14d,%r14d
jmp    112e <simplify_nakedsingle_struc+0x1e>
xchg   %ax,%ax
add    $0x8,%rbp
cmp    $0x48,%rbp
je     1265 <simplify_nakedsingle_struc+0x155>
mov    (%rbx,%rbp,1),%rax
mov    (%rax),%edi
call   1030 <is_fixed@plt>
test   %rax,%rax
je     1120 <simplify_nakedsingle_struc+0x10>
test   %rbp,%rbp
je     1162 <simplify_nakedsingle_struc+0x52>
mov    (%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     115c <simplify_nakedsingle_struc+0x4c>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x8,%rbp
je     1182 <simplify_nakedsingle_struc+0x72>
mov    0x8(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     117c <simplify_nakedsingle_struc+0x6c>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x10,%rbp
je     11a2 <simplify_nakedsingle_struc+0x92>
mov    0x10(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     119c <simplify_nakedsingle_struc+0x8c>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x18,%rbp
je     11c2 <simplify_nakedsingle_struc+0xb2>
mov    0x18(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     11bc <simplify_nakedsingle_struc+0xac>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x20,%rbp
je     11e2 <simplify_nakedsingle_struc+0xd2>
mov    0x20(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     11dc <simplify_nakedsingle_struc+0xcc>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x28,%rbp
je     1202 <simplify_nakedsingle_struc+0xf2>
mov    0x28(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     11fc <simplify_nakedsingle_struc+0xec>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x30,%rbp
je     1222 <simplify_nakedsingle_struc+0x112>
mov    0x30(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     121c <simplify_nakedsingle_struc+0x10c>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x38,%rbp
je     1242 <simplify_nakedsingle_struc+0x132>
mov    0x38(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     123c <simplify_nakedsingle_struc+0x12c>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
cmp    $0x40,%rbp
je     1265 <simplify_nakedsingle_struc+0x155>
mov    0x40(%rbx),%rax
mov    (%rax),%ecx
mov    (%rbx,%rbp,1),%rdx
mov    (%rdx),%edx
test   %ecx,%edx
je     1120 <simplify_nakedsingle_struc+0x10>
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    $0x1,%r14d
jmp    1120 <simplify_nakedsingle_struc+0x10>
mov    %r14d,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @simplify_nakedsingle_struc(i32** %0) {
%2 = alloca i32**
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32** %0, i32*** %2
store i32 0, i32* %3
store i32 0, i32* %4
br label %6
6: ; preds = %61, %1
%7 = load i32, i32* %4
%8 = icmp slt i32 %7, 9
br i1 %8, label %9, label %64
9: ; preds = %6
%10 = load i32**, i32*** %2
%11 = load i32, i32* %4
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds i32*, i32** %10, i64 %12
%14 = load i32*, i32** %13
%15 = load i32, i32* %14
%16 = call i64 @is_fixed(i32 %15)
%17 = icmp ne i64 %16, 0
br i1 %17, label %18, label %60
18: ; preds = %9
store i32 0, i32* %5
br label %19
19: ; preds = %56, %18
%20 = load i32, i32* %5
%21 = icmp slt i32 %20, 9
br i1 %21, label %22, label %59
22: ; preds = %19
%23 = load i32, i32* %4
%24 = load i32, i32* %5
%25 = icmp ne i32 %23, %24
br i1 %25, label %26, label %55
26: ; preds = %22
%27 = load i32**, i32*** %2
%28 = load i32, i32* %5
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i32*, i32** %27, i64 %29
%31 = load i32*, i32** %30
%32 = load i32, i32* %31
%33 = load i32**, i32*** %2
%34 = load i32, i32* %4
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i32*, i32** %33, i64 %35
%37 = load i32*, i32** %36
%38 = load i32, i32* %37
%39 = and i32 %32, %38
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %55
41: ; preds = %26
%42 = load i32**, i32*** %2
%43 = load i32, i32* %4
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i32*, i32** %42, i64 %44
%46 = load i32*, i32** %45
%47 = load i32, i32* %46
%48 = load i32**, i32*** %2
%49 = load i32, i32* %5
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i32*, i32** %48, i64 %50
%52 = load i32*, i32** %51
%53 = load i32, i32* %52
%54 = sub nsw i32 %53, %47
store i32 %54, i32* %52
store i32 1, i32* %3
br label %55
55: ; preds = %41, %26, %22
br label %56
56: ; preds = %55
%57 = load i32, i32* %5
%58 = add nsw i32 %57, 1
store i32 %58, i32* %5
br label %19
59: ; preds = %19
br label %60
60: ; preds = %59, %9
br label %61
61: ; preds = %60
%62 = load i32, i32* %4
%63 = add nsw i32 %62, 1
store i32 %63, i32* %4
br label %6
64: ; preds = %6
%65 = load i32, i32* %3
ret i32 %65
}

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