int check(char in[10000]) {
  for (int i = 0; in[i] != " "; i++) {
    if (in[i] < 0 || in[i] > 9)
      return 3;
  }
  return 0;
}


x86 assembly (clang, -O0):
<check>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbq (%rax,%rcx,1),%rax
lea    0xedd(%rip),%rcx
cmp    %rcx,%rax
je     1175 <check+0x75>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jl     1156 <check+0x56>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
jle    1162 <check+0x62>
movl   $0x3,-0x4(%rbp)
jmp    117c <check+0x7c>
jmp    1167 <check+0x67>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <check+0xf>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check>:
movsbq (%rdi),%rdx
xor    %eax,%eax
lea    0xef3(%rip),%rcx
cmp    %rcx,%rdx
je     1132 <check+0x32>
add    $0x1,%rdi
cs nopw 0x0(%rax,%rax,1)
cmp    $0xa,%dl
jae    1133 <check+0x33>
movsbq (%rdi),%rdx
add    $0x1,%rdi
cmp    %rcx,%rdx
jne    1120 <check+0x20>
ret
mov    $0x3,%eax
ret

LLVM IR (-O0):
@.str = [2 x i8] c" \00"
define i32 @check(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %4
br label %5
5: ; preds = %32, %1
%6 = load i8*, i8** %3
%7 = load i32, i32* %4
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds i8, i8* %6, i64 %8
%10 = load i8, i8* %9
%11 = sext i8 %10 to i64
%12 = inttoptr i64 %11 to i8*
%13 = icmp ne i8* %12, getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)
br i1 %13, label %14, label %35
14: ; preds = %5
%15 = load i8*, i8** %3
%16 = load i32, i32* %4
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %15, i64 %17
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp slt i32 %20, 0
br i1 %21, label %30, label %22
22: ; preds = %14
%23 = load i8*, i8** %3
%24 = load i32, i32* %4
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp sgt i32 %28, 9
br i1 %29, label %30, label %31
30: ; preds = %22, %14
store i32 3, i32* %2
br label %36
31: ; preds = %22
br label %32
32: ; preds = %31
%33 = load i32, i32* %4
%34 = add nsw i32 %33, 1
store i32 %34, i32* %4
br label %5
35: ; preds = %5
store i32 0, i32* %2
br label %36
36: ; preds = %35, %30
%37 = load i32, i32* %2
ret i32 %37
}

LLVM IR (-O2):
@.str = [2 x i8] c" \00"
define i32 @check(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = sext i8 %2 to i64
%4 = inttoptr i64 %3 to i8*
%5 = icmp eq i8* %4, getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)
br i1 %5, label %17, label %12
6: ; preds = %12
%7 = getelementptr inbounds i8, i8* %0, i64 %16
%8 = load i8, i8* %7
%9 = sext i8 %8 to i64
%10 = inttoptr i64 %9 to i8*
%11 = icmp eq i8* %10, getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)
br i1 %11, label %17, label %12
12: ; preds = %1, %6
%13 = phi i64 [ %16, %6 ], [ 0, %1 ]
%14 = phi i8 [ %8, %6 ], [ %2, %1 ]
%15 = icmp ugt i8 %14, 9
%16 = add nuw i64 %13, 1
br i1 %15, label %17, label %6
17: ; preds = %6, %12, %1
%18 = phi i32 [ 0, %1 ], [ 3, %12 ], [ 0, %6 ]
ret i32 %18
}