int is_sensible_string(const unsigned char *s, int len) {
  int i;
  for (i = 1; i < len; i++) {
    if (s[i] == 0 || s[i] == '\r' || s[i] == '\n' || s[i] == '\t') {
      continue;
    } else if (s[i] < ' ' || '~' < s[i]) {
      return 0;
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<is_sensible_string>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11c9 <is_sensible_string+0xc9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1172 <is_sensible_string+0x72>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
je     1172 <is_sensible_string+0x72>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     1172 <is_sensible_string+0x72>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
jne    1177 <is_sensible_string+0x77>
jmp    11bb <is_sensible_string+0xbb>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jl     11a5 <is_sensible_string+0xa5>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x7e,%eax
cmp    %ecx,%eax
jge    11b1 <is_sensible_string+0xb1>
movl   $0x0,-0x4(%rbp)
jmp    11d0 <is_sensible_string+0xd0>
jmp    11b6 <is_sensible_string+0xb6>
jmp    11bb <is_sensible_string+0xbb>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1112 <is_sensible_string+0x12>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_sensible_string>:
mov    $0x1,%eax
cmp    $0x2,%esi
jl     114b <is_sensible_string+0x4b>
mov    %esi,%ecx
mov    $0x1,%edx
mov    $0x2601,%r8d
jmp    1139 <is_sensible_string+0x39>
nopl   0x0(%rax)
add    $0x81,%sil
cmp    $0xa1,%sil
jb     114c <is_sensible_string+0x4c>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rdx
cmp    %rdx,%rcx
je     114b <is_sensible_string+0x4b>
movzbl (%rdi,%rdx,1),%esi
cmp    $0xd,%rsi
ja     1120 <is_sensible_string+0x20>
bt     %rsi,%r8
jb     1130 <is_sensible_string+0x30>
jmp    1120 <is_sensible_string+0x20>
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @is_sensible_string(i8* nocapture %0, i32 %1) {
%3 = icmp sgt i32 %1, 1
br i1 %3, label %4, label %16
4: ; preds = %2
%5 = zext i32 %1 to i64
br label %6
6: ; preds = %4, %13
%7 = phi i64 [ 1, %4 ], [ %14, %13 ]
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = load i8, i8* %8
switch i8 %9, label %10 [
i8 0, label %13
i8 13, label %13
i8 10, label %13
i8 9, label %13
]
10: ; preds = %6
%11 = add i8 %9, -127
%12 = icmp ult i8 %11, -95
br i1 %12, label %16, label %13
13: ; preds = %10, %6, %6, %6, %6
%14 = add nuw nsw i64 %7, 1
%15 = icmp eq i64 %14, %5
br i1 %15, label %16, label %6
16: ; preds = %10, %13, %2
%17 = phi i32 [ 1, %2 ], [ 1, %13 ], [ 0, %10 ]
ret i32 %17
}