#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 */
typedef char uint8_t;

/* Variables and functions */
int _line_len(uint8_t line[40]) {
  int x;
  for (x = 0; x < 40; x++) {
    if (line[x] != ' ' && line[x] != '\0')
      break;
  }
  return (40 - x);
}


x86 assembly (clang, -O0):
<_line_len>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x28,-0xc(%rbp)
jge    115b <_line_len+0x5b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     1148 <_line_len+0x48>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1148 <_line_len+0x48>
jmp    115b <_line_len+0x5b>
jmp    114d <_line_len+0x4d>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    110f <_line_len+0xf>
mov    $0x28,%eax
sub    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_line_len>:
testb  $0xdf,(%rdi)
jne    128f <_line_len+0x18f>
testb  $0xdf,0x1(%rdi)
jne    1295 <_line_len+0x195>
testb  $0xdf,0x2(%rdi)
jne    129b <_line_len+0x19b>
testb  $0xdf,0x3(%rdi)
jne    12a1 <_line_len+0x1a1>
testb  $0xdf,0x4(%rdi)
jne    12a7 <_line_len+0x1a7>
testb  $0xdf,0x5(%rdi)
jne    12ad <_line_len+0x1ad>
testb  $0xdf,0x6(%rdi)
jne    12b3 <_line_len+0x1b3>
testb  $0xdf,0x7(%rdi)
jne    12b9 <_line_len+0x1b9>
testb  $0xdf,0x8(%rdi)
jne    12bf <_line_len+0x1bf>
testb  $0xdf,0x9(%rdi)
jne    12c5 <_line_len+0x1c5>
testb  $0xdf,0xa(%rdi)
jne    12cb <_line_len+0x1cb>
testb  $0xdf,0xb(%rdi)
jne    12d1 <_line_len+0x1d1>
testb  $0xdf,0xc(%rdi)
jne    12d7 <_line_len+0x1d7>
testb  $0xdf,0xd(%rdi)
jne    12dd <_line_len+0x1dd>
testb  $0xdf,0xe(%rdi)
jne    12e3 <_line_len+0x1e3>
testb  $0xdf,0xf(%rdi)
jne    12e9 <_line_len+0x1e9>
testb  $0xdf,0x10(%rdi)
jne    12ef <_line_len+0x1ef>
testb  $0xdf,0x11(%rdi)
jne    12f5 <_line_len+0x1f5>
testb  $0xdf,0x12(%rdi)
jne    12fb <_line_len+0x1fb>
testb  $0xdf,0x13(%rdi)
jne    1301 <_line_len+0x201>
testb  $0xdf,0x14(%rdi)
jne    1307 <_line_len+0x207>
testb  $0xdf,0x15(%rdi)
jne    130d <_line_len+0x20d>
testb  $0xdf,0x16(%rdi)
jne    1313 <_line_len+0x213>
testb  $0xdf,0x17(%rdi)
jne    1319 <_line_len+0x219>
testb  $0xdf,0x18(%rdi)
jne    131f <_line_len+0x21f>
testb  $0xdf,0x19(%rdi)
jne    1325 <_line_len+0x225>
testb  $0xdf,0x1a(%rdi)
jne    132b <_line_len+0x22b>
testb  $0xdf,0x1b(%rdi)
jne    1331 <_line_len+0x231>
testb  $0xdf,0x1c(%rdi)
jne    1337 <_line_len+0x237>
testb  $0xdf,0x1d(%rdi)
jne    133d <_line_len+0x23d>
testb  $0xdf,0x1e(%rdi)
jne    1343 <_line_len+0x243>
testb  $0xdf,0x1f(%rdi)
jne    1349 <_line_len+0x249>
testb  $0xdf,0x20(%rdi)
jne    134f <_line_len+0x24f>
testb  $0xdf,0x21(%rdi)
jne    1355 <_line_len+0x255>
testb  $0xdf,0x22(%rdi)
jne    135b <_line_len+0x25b>
testb  $0xdf,0x23(%rdi)
jne    1361 <_line_len+0x261>
testb  $0xdf,0x24(%rdi)
jne    1367 <_line_len+0x267>
testb  $0xdf,0x25(%rdi)
jne    136d <_line_len+0x26d>
testb  $0xdf,0x26(%rdi)
jne    1373 <_line_len+0x273>
xor    %eax,%eax
testb  $0xdf,0x27(%rdi)
setne  %al
ret
mov    $0x28,%eax
ret
mov    $0x27,%eax
ret
mov    $0x26,%eax
ret
mov    $0x25,%eax
ret
mov    $0x24,%eax
ret
mov    $0x23,%eax
ret
mov    $0x22,%eax
ret
mov    $0x21,%eax
ret
mov    $0x20,%eax
ret
mov    $0x1f,%eax
ret
mov    $0x1e,%eax
ret
mov    $0x1d,%eax
ret
mov    $0x1c,%eax
ret
mov    $0x1b,%eax
ret
mov    $0x1a,%eax
ret
mov    $0x19,%eax
ret
mov    $0x18,%eax
ret
mov    $0x17,%eax
ret
mov    $0x16,%eax
ret
mov    $0x15,%eax
ret
mov    $0x14,%eax
ret
mov    $0x13,%eax
ret
mov    $0x12,%eax
ret
mov    $0x11,%eax
ret
mov    $0x10,%eax
ret
mov    $0xf,%eax
ret
mov    $0xe,%eax
ret
mov    $0xd,%eax
ret
mov    $0xc,%eax
ret
mov    $0xb,%eax
ret
mov    $0xa,%eax
ret
mov    $0x9,%eax
ret
mov    $0x8,%eax
ret
mov    $0x7,%eax
ret
mov    $0x6,%eax
ret
mov    $0x5,%eax
ret
mov    $0x4,%eax
ret
mov    $0x3,%eax
ret
mov    $0x2,%eax
ret

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

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