void search_colour_only(unsigned int *colour_only, char *guessword_element,
                        char *codeword_element, char colour_count_code[],
                        char colour_count_guess[], int *index,
                        char *code_position_count, char *guess_position_count) {
  int which_colour;
  if (*codeword_element == 0) {
    if (*index == 0) {
      colour_count_code[0] = colour_count_code[0] + 1;
    }
    which_colour = 0;
  }
  if (*codeword_element == 1) {
    if (*index == 0) {
      colour_count_code[1] = colour_count_code[1] + 1;
    }
    which_colour = 1;
  }
  if (*codeword_element == 2) {
    if (*index == 0) {
      colour_count_code[2] = colour_count_code[2] + 1;
    }
    which_colour = 2;
  }
  if (*codeword_element == 3) {
    if (*index == 0) {
      colour_count_code[3] = colour_count_code[3] + 1;
    }
    which_colour = 3;
  }
  if (*codeword_element == 4) {
    if (*index == 0) {
      colour_count_code[4] = colour_count_code[4] + 1;
    }
    which_colour = 4;
  }
  if (*codeword_element == 5) {
    if (*index == 0) {
      colour_count_code[5] = colour_count_code[5] + 1;
    }
    which_colour = 5;
  }
  if (*guessword_element == *codeword_element) {
    if (colour_count_code[which_colour] > colour_count_guess[which_colour]) {
      if (*code_position_count == 0 && *guess_position_count == 0) {
        *colour_only = *colour_only + 1;
        colour_count_guess[which_colour] = colour_count_guess[which_colour] + 1;
      }
    }
  }
}


x86 assembly (clang, -O0):
<search_colour_only>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    115a <search_colour_only+0x5a>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1153 <search_colour_only+0x53>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
movl   $0x0,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x1,%eax
jne    1192 <search_colour_only+0x92>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    118b <search_colour_only+0x8b>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x1(%rax)
movl   $0x1,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2,%eax
jne    11ca <search_colour_only+0xca>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    11c3 <search_colour_only+0xc3>
mov    -0x20(%rbp),%rax
movsbl 0x2(%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x2(%rax)
movl   $0x2,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3,%eax
jne    1202 <search_colour_only+0x102>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    11fb <search_colour_only+0xfb>
mov    -0x20(%rbp),%rax
movsbl 0x3(%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x3(%rax)
movl   $0x3,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x4,%eax
jne    123a <search_colour_only+0x13a>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1233 <search_colour_only+0x133>
mov    -0x20(%rbp),%rax
movsbl 0x4(%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x4(%rax)
movl   $0x4,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5,%eax
jne    1272 <search_colour_only+0x172>
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jne    126b <search_colour_only+0x16b>
mov    -0x20(%rbp),%rax
movsbl 0x5(%rax),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x5(%rax)
movl   $0x5,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    12fd <search_colour_only+0x1fd>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x28(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jle    12f8 <search_colour_only+0x1f8>
mov    0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12f3 <search_colour_only+0x1f3>
mov    0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12f3 <search_colour_only+0x1f3>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0x1,%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    12f8 <search_colour_only+0x1f8>
jmp    12fd <search_colour_only+0x1fd>
pop    %rbp
ret

x86 assembly (clang, -O2):
<search_colour_only>:
mov    (%rdx),%al
test   %al,%al
je     111d <search_colour_only+0x1d>
cmp    $0x1,%al
jne    116c <search_colour_only+0x6c>
cmpl   $0x0,(%r9)
je     112d <search_colour_only+0x2d>
mov    $0x1,%r10d
mov    $0x1,%al
jmp    11d7 <search_colour_only+0xd7>
cmpl   $0x0,(%r9)
je     1163 <search_colour_only+0x63>
xor    %eax,%eax
xor    %r10d,%r10d
jmp    11d7 <search_colour_only+0xd7>
addb   $0x1,0x1(%rcx)
mov    (%rdx),%al
mov    $0x1,%r10d
cmp    $0x2,%al
je     1173 <search_colour_only+0x73>
cmp    $0x3,%al
je     1193 <search_colour_only+0x93>
cmp    $0x4,%al
je     11b3 <search_colour_only+0xb3>
cmp    $0x5,%al
jne    11d7 <search_colour_only+0xd7>
mov    $0x5,%r10d
mov    $0x5,%al
cmpl   $0x0,(%r9)
jne    11d7 <search_colour_only+0xd7>
addb   $0x1,0x5(%rcx)
mov    (%rdx),%al
jmp    11d7 <search_colour_only+0xd7>
addb   $0x1,(%rcx)
mov    (%rdx),%al
cmp    $0x1,%al
je     110a <search_colour_only+0xa>
xor    %r10d,%r10d
cmp    $0x2,%al
jne    113d <search_colour_only+0x3d>
cmpl   $0x0,(%r9)
je     1183 <search_colour_only+0x83>
mov    $0x2,%r10d
mov    $0x2,%al
jmp    11d7 <search_colour_only+0xd7>
addb   $0x1,0x2(%rcx)
mov    (%rdx),%al
mov    $0x2,%r10d
cmp    $0x3,%al
jne    1141 <search_colour_only+0x41>
cmpl   $0x0,(%r9)
je     11a3 <search_colour_only+0xa3>
mov    $0x3,%r10d
mov    $0x3,%al
jmp    11d7 <search_colour_only+0xd7>
addb   $0x1,0x3(%rcx)
mov    (%rdx),%al
mov    $0x3,%r10d
cmp    $0x4,%al
jne    1145 <search_colour_only+0x45>
cmpl   $0x0,(%r9)
je     11c3 <search_colour_only+0xc3>
mov    $0x4,%r10d
mov    $0x4,%al
jmp    11d7 <search_colour_only+0xd7>
addb   $0x1,0x4(%rcx)
mov    (%rdx),%al
mov    $0x4,%r10d
cmp    $0x5,%al
je     114d <search_colour_only+0x4d>
cmp    %al,(%rsi)
jne    11ef <search_colour_only+0xef>
mov    (%rcx,%r10,1),%al
cmp    (%r8,%r10,1),%al
jle    11ef <search_colour_only+0xef>
mov    0x8(%rsp),%rax
cmpb   $0x0,(%rax)
je     11f0 <search_colour_only+0xf0>
ret
mov    0x10(%rsp),%rax
cmpb   $0x0,(%rax)
jne    11ef <search_colour_only+0xef>
addl   $0x1,(%rdi)
addb   $0x1,(%r8,%r10,1)
ret

LLVM IR (-O0):
define void @search_colour_only(i32* %0, i8* %1, i8* %2, i8* %3, i8* %4, i32* %5, i8* %6, i8* %7) {
%9 = alloca i32*
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i32*
%15 = alloca i8*
%16 = alloca i8*
%17 = alloca i32
store i32* %0, i32** %9
store i8* %1, i8** %10
store i8* %2, i8** %11
store i8* %3, i8** %12
store i8* %4, i8** %13
store i32* %5, i32** %14
store i8* %6, i8** %15
store i8* %7, i8** %16
%18 = load i8*, i8** %11
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %36
22: ; preds = %8
%23 = load i32*, i32** %14
%24 = load i32, i32* %23
%25 = icmp eq i32 %24, 0
br i1 %25, label %26, label %35
26: ; preds = %22
%27 = load i8*, i8** %12
%28 = getelementptr inbounds i8, i8* %27, i64 0
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = add nsw i32 %30, 1
%32 = trunc i32 %31 to i8
%33 = load i8*, i8** %12
%34 = getelementptr inbounds i8, i8* %33, i64 0
store i8 %32, i8* %34
br label %35
35: ; preds = %26, %22
store i32 0, i32* %17
br label %36
36: ; preds = %35, %8
%37 = load i8*, i8** %11
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 1
br i1 %40, label %41, label %55
41: ; preds = %36
%42 = load i32*, i32** %14
%43 = load i32, i32* %42
%44 = icmp eq i32 %43, 0
br i1 %44, label %45, label %54
45: ; preds = %41
%46 = load i8*, i8** %12
%47 = getelementptr inbounds i8, i8* %46, i64 1
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = add nsw i32 %49, 1
%51 = trunc i32 %50 to i8
%52 = load i8*, i8** %12
%53 = getelementptr inbounds i8, i8* %52, i64 1
store i8 %51, i8* %53
br label %54
54: ; preds = %45, %41
store i32 1, i32* %17
br label %55
55: ; preds = %54, %36
%56 = load i8*, i8** %11
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 2
br i1 %59, label %60, label %74
60: ; preds = %55
%61 = load i32*, i32** %14
%62 = load i32, i32* %61
%63 = icmp eq i32 %62, 0
br i1 %63, label %64, label %73
64: ; preds = %60
%65 = load i8*, i8** %12
%66 = getelementptr inbounds i8, i8* %65, i64 2
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = add nsw i32 %68, 1
%70 = trunc i32 %69 to i8
%71 = load i8*, i8** %12
%72 = getelementptr inbounds i8, i8* %71, i64 2
store i8 %70, i8* %72
br label %73
73: ; preds = %64, %60
store i32 2, i32* %17
br label %74
74: ; preds = %73, %55
%75 = load i8*, i8** %11
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 3
br i1 %78, label %79, label %93
79: ; preds = %74
%80 = load i32*, i32** %14
%81 = load i32, i32* %80
%82 = icmp eq i32 %81, 0
br i1 %82, label %83, label %92
83: ; preds = %79
%84 = load i8*, i8** %12
%85 = getelementptr inbounds i8, i8* %84, i64 3
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = add nsw i32 %87, 1
%89 = trunc i32 %88 to i8
%90 = load i8*, i8** %12
%91 = getelementptr inbounds i8, i8* %90, i64 3
store i8 %89, i8* %91
br label %92
92: ; preds = %83, %79
store i32 3, i32* %17
br label %93
93: ; preds = %92, %74
%94 = load i8*, i8** %11
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = icmp eq i32 %96, 4
br i1 %97, label %98, label %112
98: ; preds = %93
%99 = load i32*, i32** %14
%100 = load i32, i32* %99
%101 = icmp eq i32 %100, 0
br i1 %101, label %102, label %111
102: ; preds = %98
%103 = load i8*, i8** %12
%104 = getelementptr inbounds i8, i8* %103, i64 4
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = add nsw i32 %106, 1
%108 = trunc i32 %107 to i8
%109 = load i8*, i8** %12
%110 = getelementptr inbounds i8, i8* %109, i64 4
store i8 %108, i8* %110
br label %111
111: ; preds = %102, %98
store i32 4, i32* %17
br label %112
112: ; preds = %111, %93
%113 = load i8*, i8** %11
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = icmp eq i32 %115, 5
br i1 %116, label %117, label %131
117: ; preds = %112
%118 = load i32*, i32** %14
%119 = load i32, i32* %118
%120 = icmp eq i32 %119, 0
br i1 %120, label %121, label %130
121: ; preds = %117
%122 = load i8*, i8** %12
%123 = getelementptr inbounds i8, i8* %122, i64 5
%124 = load i8, i8* %123
%125 = sext i8 %124 to i32
%126 = add nsw i32 %125, 1
%127 = trunc i32 %126 to i8
%128 = load i8*, i8** %12
%129 = getelementptr inbounds i8, i8* %128, i64 5
store i8 %127, i8* %129
br label %130
130: ; preds = %121, %117
store i32 5, i32* %17
br label %131
131: ; preds = %130, %112
%132 = load i8*, i8** %10
%133 = load i8, i8* %132
%134 = sext i8 %133 to i32
%135 = load i8*, i8** %11
%136 = load i8, i8* %135
%137 = sext i8 %136 to i32
%138 = icmp eq i32 %134, %137
br i1 %138, label %139, label %182
139: ; preds = %131
%140 = load i8*, i8** %12
%141 = load i32, i32* %17
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds i8, i8* %140, i64 %142
%144 = load i8, i8* %143
%145 = sext i8 %144 to i32
%146 = load i8*, i8** %13
%147 = load i32, i32* %17
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i8, i8* %146, i64 %148
%150 = load i8, i8* %149
%151 = sext i8 %150 to i32
%152 = icmp sgt i32 %145, %151
br i1 %152, label %153, label %181
153: ; preds = %139
%154 = load i8*, i8** %15
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp eq i32 %156, 0
br i1 %157, label %158, label %180
158: ; preds = %153
%159 = load i8*, i8** %16
%160 = load i8, i8* %159
%161 = sext i8 %160 to i32
%162 = icmp eq i32 %161, 0
br i1 %162, label %163, label %180
163: ; preds = %158
%164 = load i32*, i32** %9
%165 = load i32, i32* %164
%166 = add i32 %165, 1
%167 = load i32*, i32** %9
store i32 %166, i32* %167
%168 = load i8*, i8** %13
%169 = load i32, i32* %17
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds i8, i8* %168, i64 %170
%172 = load i8, i8* %171
%173 = sext i8 %172 to i32
%174 = add nsw i32 %173, 1
%175 = trunc i32 %174 to i8
%176 = load i8*, i8** %13
%177 = load i32, i32* %17
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds i8, i8* %176, i64 %178
store i8 %175, i8* %179
br label %180
180: ; preds = %163, %158, %153
br label %181
181: ; preds = %180, %139
br label %182
182: ; preds = %181, %131
ret void
}

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