_Bool ist_zahl_im_char_array(const char array[], int laenge,
                             char gesuchte_zahl) {
  _Bool funde = 0;
  for (int i = 0; i < laenge; i++) {
    if (array[i] == gesuchte_zahl) {
      funde = 1;
    }
  }
  return funde;
}


x86 assembly (clang, -O0):
<ist_zahl_im_char_array>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %al,-0xd(%rbp)
movb   $0x0,-0xe(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1156 <ist_zahl_im_char_array+0x56>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0xd(%rbp),%ecx
cmp    %ecx,%eax
jne    1143 <ist_zahl_im_char_array+0x43>
movb   $0x1,-0xe(%rbp)
jmp    1148 <ist_zahl_im_char_array+0x48>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111b <ist_zahl_im_char_array+0x1b>
mov    -0xe(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ist_zahl_im_char_array>:
test   %esi,%esi
jle    1115 <ist_zahl_im_char_array+0x15>
mov    %esi,%r10d
cmp    $0x8,%esi
jae    1118 <ist_zahl_im_char_array+0x18>
xor    %esi,%esi
xor    %eax,%eax
jmp    12a6 <ist_zahl_im_char_array+0x1a6>
xor    %eax,%eax
ret
movzbl %dl,%r8d
cmp    $0x20,%esi
jae    112a <ist_zahl_im_char_array+0x2a>
xor    %eax,%eax
xor    %esi,%esi
jmp    1239 <ist_zahl_im_char_array+0x139>
mov    %r10d,%esi
and    $0xffffffe0,%esi
movd   %r8d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x20(%rsi),%rax
mov    %rax,%r9
shr    $0x5,%r9
add    $0x1,%r9
test   %rax,%rax
je     12c5 <ist_zahl_im_char_array+0x1c5>
mov    %r9,%rcx
and    $0xfffffffffffffffe,%rcx
pxor   %xmm3,%xmm3
xor    %eax,%eax
pxor   %xmm4,%xmm4
nopl   0x0(%rax)
movdqu (%rdi,%rax,1),%xmm1
movdqu 0x10(%rdi,%rax,1),%xmm2
movdqu 0x20(%rdi,%rax,1),%xmm5
movdqu 0x30(%rdi,%rax,1),%xmm6
pcmpeqb %xmm0,%xmm1
pcmpeqb %xmm0,%xmm2
pcmpeqb %xmm0,%xmm5
por    %xmm1,%xmm5
pcmpeqb %xmm0,%xmm6
por    %xmm2,%xmm6
movdqa %xmm5,%xmm1
pandn  %xmm3,%xmm1
psubb  %xmm5,%xmm1
movdqa %xmm6,%xmm2
pandn  %xmm4,%xmm2
psubb  %xmm6,%xmm2
add    $0x40,%rax
movdqa %xmm1,%xmm3
movdqa %xmm2,%xmm4
add    $0xfffffffffffffffe,%rcx
jne    1170 <ist_zahl_im_char_array+0x70>
test   $0x1,%r9b
je     1202 <ist_zahl_im_char_array+0x102>
movdqu (%rdi,%rax,1),%xmm3
movdqu 0x10(%rdi,%rax,1),%xmm4
pcmpeqb %xmm0,%xmm3
pcmpeqb %xmm0,%xmm4
movdqa %xmm3,%xmm0
pandn  %xmm1,%xmm0
psubb  %xmm3,%xmm0
movdqa %xmm4,%xmm3
pandn  %xmm2,%xmm3
psubb  %xmm4,%xmm3
movdqa %xmm0,%xmm1
movdqa %xmm3,%xmm2
pxor   %xmm0,%xmm0
movdqa %xmm1,%xmm3
pcmpeqb %xmm0,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm1,%xmm3
por    %xmm2,%xmm3
pcmpeqb %xmm0,%xmm3
pmovmskb %xmm3,%eax
cmp    $0xffff,%eax
setne  %al
cmp    %r10,%rsi
je     12c2 <ist_zahl_im_char_array+0x1c2>
test   $0x18,%r10b
je     12a6 <ist_zahl_im_char_array+0x1a6>
mov    %rsi,%rcx
mov    %r10d,%esi
and    $0xfffffff8,%esi
movzbl %al,%eax
movd   %eax,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
movd   %r8d,%xmm1
punpcklbw %xmm1,%xmm1
pshuflw $0x0,%xmm1,%xmm1
movdqa 0xd98(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movq   (%rdi,%rcx,1),%xmm3
pcmpeqb %xmm1,%xmm3
movdqa %xmm3,%xmm4
pandn  %xmm0,%xmm4
pand   %xmm2,%xmm3
movdqa %xmm3,%xmm0
por    %xmm4,%xmm0
add    $0x8,%rcx
cmp    %rcx,%rsi
jne    1270 <ist_zahl_im_char_array+0x170>
movq   %xmm0,%rax
test   %rax,%rax
setne  %al
cmp    %r10,%rsi
je     12c2 <ist_zahl_im_char_array+0x1c2>
mov    $0x1,%ecx
nopl   0x0(%rax,%rax,1)
cmp    %dl,(%rdi,%rsi,1)
movzbl %al,%eax
cmove  %ecx,%eax
add    $0x1,%rsi
cmp    %rsi,%r10
jne    12b0 <ist_zahl_im_char_array+0x1b0>
and    $0x1,%al
ret
pxor   %xmm1,%xmm1
xor    %eax,%eax
pxor   %xmm2,%xmm2
test   $0x1,%r9b
jne    11cf <ist_zahl_im_char_array+0xcf>
jmp    1202 <ist_zahl_im_char_array+0x102>

LLVM IR (-O0):
define zeroext i1 @ist_zahl_im_char_array(i8* %0, i32 %1, i8 signext %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i8
%7 = alloca i8
%8 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
store i8 %2, i8* %6
store i8 0, i8* %7
store i32 0, i32* %8
br label %9
9: ; preds = %25, %3
%10 = load i32, i32* %8
%11 = load i32, i32* %5
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %28
13: ; preds = %9
%14 = load i8*, i8** %4
%15 = load i32, i32* %8
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = load i8, i8* %6
%21 = sext i8 %20 to i32
%22 = icmp eq i32 %19, %21
br i1 %22, label %23, label %24
23: ; preds = %13
store i8 1, i8* %7
br label %24
24: ; preds = %23, %13
br label %25
25: ; preds = %24
%26 = load i32, i32* %8
%27 = add nsw i32 %26, 1
store i32 %27, i32* %8
br label %9
28: ; preds = %9
%29 = load i8, i8* %7
%30 = trunc i8 %29 to i1
ret i1 %30
}

LLVM IR (-O2):
define zeroext i1 @ist_zahl_im_char_array(i8* nocapture %0, i32 %1, i8 signext %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %113
5: ; preds = %3
%6 = zext i32 %1 to i64
%7 = icmp ult i32 %1, 8
br i1 %7, label %106, label %8
8: ; preds = %5
%9 = icmp ult i32 %1, 32
br i1 %9, label %83, label %10
10: ; preds = %8
%11 = and i64 %6, 4294967264
%12 = insertelement <16 x i8> poison, i8 %2, i64 0
%13 = shufflevector <16 x i8> %12, <16 x i8> poison, <16 x i32> zeroinitializer
%14 = insertelement <16 x i8> poison, i8 %2, i64 0
%15 = shufflevector <16 x i8> %14, <16 x i8> poison, <16 x i32> zeroinitializer
%16 = add nsw i64 %11, -32
%17 = lshr exact i64 %16, 5
%18 = add nuw nsw i64 %17, 1
%19 = and i64 %18, 1
%20 = icmp eq i64 %16, 0
br i1 %20, label %52, label %21
21: ; preds = %10
%22 = and i64 %18, 1152921504606846974
br label %23
23: ; preds = %23, %21
%24 = phi i64 [ 0, %21 ], [ %49, %23 ]
%25 = phi <16 x i8> [ zeroinitializer, %21 ], [ %46, %23 ]
%26 = phi <16 x i8> [ zeroinitializer, %21 ], [ %48, %23 ]
%27 = phi i64 [ 0, %21 ], [ %50, %23 ]
%28 = getelementptr inbounds i8, i8* %0, i64 %24
%29 = bitcast i8* %28 to <16 x i8>*
%30 = load <16 x i8>, <16 x i8>* %29
%31 = getelementptr inbounds i8, i8* %28, i64 16
%32 = bitcast i8* %31 to <16 x i8>*
%33 = load <16 x i8>, <16 x i8>* %32
%34 = icmp eq <16 x i8> %30, %13
%35 = icmp eq <16 x i8> %33, %15
%36 = or i64 %24, 32
%37 = getelementptr inbounds i8, i8* %0, i64 %36
%38 = bitcast i8* %37 to <16 x i8>*
%39 = load <16 x i8>, <16 x i8>* %38
%40 = getelementptr inbounds i8, i8* %37, i64 16
%41 = bitcast i8* %40 to <16 x i8>*
%42 = load <16 x i8>, <16 x i8>* %41
%43 = icmp eq <16 x i8> %39, %13
%44 = icmp eq <16 x i8> %42, %15
%45 = select <16 x i1> %43, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i1> %34
%46 = select <16 x i1> %45, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %25
%47 = select <16 x i1> %44, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i1> %35
%48 = select <16 x i1> %47, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %26
%49 = add nuw i64 %24, 64
%50 = add i64 %27, 2
%51 = icmp eq i64 %50, %22
br i1 %51, label %52, label %23
52: ; preds = %23, %10
%53 = phi <16 x i8> [ undef, %10 ], [ %46, %23 ]
%54 = phi <16 x i8> [ undef, %10 ], [ %48, %23 ]
%55 = phi i64 [ 0, %10 ], [ %49, %23 ]
%56 = phi <16 x i8> [ zeroinitializer, %10 ], [ %46, %23 ]
%57 = phi <16 x i8> [ zeroinitializer, %10 ], [ %48, %23 ]
%58 = icmp eq i64 %19, 0
br i1 %58, label %70, label %59
59: ; preds = %52
%60 = getelementptr inbounds i8, i8* %0, i64 %55
%61 = bitcast i8* %60 to <16 x i8>*
%62 = load <16 x i8>, <16 x i8>* %61
%63 = getelementptr inbounds i8, i8* %60, i64 16
%64 = bitcast i8* %63 to <16 x i8>*
%65 = load <16 x i8>, <16 x i8>* %64
%66 = icmp eq <16 x i8> %62, %13
%67 = icmp eq <16 x i8> %65, %15
%68 = select <16 x i1> %66, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %56
%69 = select <16 x i1> %67, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <16 x i8> %57
br label %70
70: ; preds = %52, %59
%71 = phi <16 x i8> [ %53, %52 ], [ %68, %59 ]
%72 = phi <16 x i8> [ %54, %52 ], [ %69, %59 ]
%73 = icmp eq <16 x i8> %71, zeroinitializer
%74 = select <16 x i1> %73, <16 x i8> %72, <16 x i8> %71
%75 = icmp ne <16 x i8> %74, zeroinitializer
%76 = bitcast <16 x i1> %75 to i16
%77 = icmp ne i16 %76, 0
%78 = zext i1 %77 to i8
%79 = icmp eq i64 %11, %6
br i1 %79, label %109, label %80
80: ; preds = %70
%81 = and i64 %6, 24
%82 = icmp eq i64 %81, 0
br i1 %82, label %106, label %83
83: ; preds = %8, %80
%84 = phi i8 [ 0, %8 ], [ %78, %80 ]
%85 = phi i64 [ 0, %8 ], [ %11, %80 ]
%86 = and i64 %6, 4294967288
%87 = insertelement <8 x i8> poison, i8 %84, i64 0
%88 = shufflevector <8 x i8> %87, <8 x i8> poison, <8 x i32> zeroinitializer
%89 = insertelement <8 x i8> poison, i8 %2, i64 0
%90 = shufflevector <8 x i8> %89, <8 x i8> poison, <8 x i32> zeroinitializer
br label %91
91: ; preds = %91, %83
%92 = phi i64 [ %85, %83 ], [ %99, %91 ]
%93 = phi <8 x i8> [ %88, %83 ], [ %98, %91 ]
%94 = getelementptr inbounds i8, i8* %0, i64 %92
%95 = bitcast i8* %94 to <8 x i8>*
%96 = load <8 x i8>, <8 x i8>* %95
%97 = icmp eq <8 x i8> %96, %90
%98 = select <8 x i1> %97, <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, <8 x i8> %93
%99 = add nuw i64 %92, 8
%100 = icmp eq i64 %99, %86
br i1 %100, label %101, label %91
101: ; preds = %91
%102 = bitcast <8 x i8> %98 to i64
%103 = icmp ne i64 %102, 0
%104 = zext i1 %103 to i8
%105 = icmp eq i64 %86, %6
br i1 %105, label %109, label %106
106: ; preds = %5, %80, %101
%107 = phi i64 [ 0, %5 ], [ %11, %80 ], [ %86, %101 ]
%108 = phi i8 [ 0, %5 ], [ %78, %80 ], [ %104, %101 ]
br label %115
109: ; preds = %115, %101, %70
%110 = phi i8 [ %78, %70 ], [ %104, %101 ], [ %121, %115 ]
%111 = and i8 %110, 1
%112 = icmp ne i8 %111, 0
br label %113
113: ; preds = %109, %3
%114 = phi i1 [ false, %3 ], [ %112, %109 ]
ret i1 %114
115: ; preds = %106, %115
%116 = phi i64 [ %122, %115 ], [ %107, %106 ]
%117 = phi i8 [ %121, %115 ], [ %108, %106 ]
%118 = getelementptr inbounds i8, i8* %0, i64 %116
%119 = load i8, i8* %118
%120 = icmp eq i8 %119, %2
%121 = select i1 %120, i8 1, i8 %117
%122 = add nuw nsw i64 %116, 1
%123 = icmp eq i64 %122, %6
br i1 %123, label %109, label %115
}