int http_valid_raw_uri(const char *s) {
  if (*s == 0)
    return 0;
  for (; *s != 0; s++) {
    if (*s >= 0 && *s < 32)
      return 0;
    switch (*s) {
    case ' ':
      return 0;
    case '%':
      if (s[1] == 0 || s[2] == 0)
        return 0;
      if (!((s[1] >= '0' && s[1] <= '9') || (s[1] >= 'a' && s[1] <= 'f') ||
            (s[1] >= 'A' && s[1] <= 'F')))
        return 0;
      if (!((s[2] >= '0' && s[2] <= '9') || (s[2] >= 'a' && s[2] <= 'f') ||
            (s[2] >= 'A' && s[2] <= 'F')))
        return 0;
      break;
    default:
      break;
    }
  }
  return (!0);
}


x86 assembly (clang, -O0):
<http_valid_raw_uri>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1124 <http_valid_raw_uri+0x24>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
jmp    1129 <http_valid_raw_uri+0x29>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12cc <http_valid_raw_uri+0x1cc>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jl     1165 <http_valid_raw_uri+0x65>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
jge    1165 <http_valid_raw_uri+0x65>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
sub    $0x20,%eax
je     118e <http_valid_raw_uri+0x8e>
jmp    117d <http_valid_raw_uri+0x7d>
mov    -0x14(%rbp),%eax
sub    $0x25,%eax
je     119a <http_valid_raw_uri+0x9a>
jmp    12b1 <http_valid_raw_uri+0x1b1>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     11bc <http_valid_raw_uri+0xbc>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    11c8 <http_valid_raw_uri+0xc8>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     11ea <http_valid_raw_uri+0xea>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jle    123a <http_valid_raw_uri+0x13a>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x61,%eax
jl     120c <http_valid_raw_uri+0x10c>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x66,%eax
jle    123a <http_valid_raw_uri+0x13a>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x41,%eax
jl     122e <http_valid_raw_uri+0x12e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jle    123a <http_valid_raw_uri+0x13a>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     125c <http_valid_raw_uri+0x15c>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x39,%eax
jle    12ac <http_valid_raw_uri+0x1ac>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x61,%eax
jl     127e <http_valid_raw_uri+0x17e>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x66,%eax
jle    12ac <http_valid_raw_uri+0x1ac>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x41,%eax
jl     12a0 <http_valid_raw_uri+0x1a0>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x46,%eax
jle    12ac <http_valid_raw_uri+0x1ac>
movl   $0x0,-0x4(%rbp)
jmp    12d3 <http_valid_raw_uri+0x1d3>
jmp    12b6 <http_valid_raw_uri+0x1b6>
jmp    12b6 <http_valid_raw_uri+0x1b6>
jmp    12bb <http_valid_raw_uri+0x1bb>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1129 <http_valid_raw_uri+0x29>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<http_valid_raw_uri>:
mov    (%rdi),%dl
xor    %eax,%eax
test   %dl,%dl
je     118a <http_valid_raw_uri+0x8a>
add    $0x2,%rdi
movabs $0x3f0000003f,%r8
jmp    1131 <http_valid_raw_uri+0x31>
nopl   0x0(%rax)
cmp    $0x20,%edx
je     118a <http_valid_raw_uri+0x8a>
movzbl -0x1(%rdi),%edx
add    $0x1,%rdi
test   %dl,%dl
je     1185 <http_valid_raw_uri+0x85>
cmp    $0x20,%dl
jb     118a <http_valid_raw_uri+0x8a>
movsbl %dl,%edx
cmp    $0x25,%edx
jne    1120 <http_valid_raw_uri+0x20>
movzbl -0x1(%rdi),%edx
test   %dl,%dl
je     118a <http_valid_raw_uri+0x8a>
movzbl (%rdi),%esi
test   %sil,%sil
je     118a <http_valid_raw_uri+0x8a>
lea    -0x30(%rdx),%ecx
cmp    $0xa,%cl
jb     1167 <http_valid_raw_uri+0x67>
lea    -0x41(%rdx),%ecx
cmp    $0x25,%cl
ja     118a <http_valid_raw_uri+0x8a>
movzbl %cl,%ecx
bt     %rcx,%r8
jae    118a <http_valid_raw_uri+0x8a>
lea    -0x30(%rsi),%ecx
cmp    $0xa,%cl
jb     1129 <http_valid_raw_uri+0x29>
add    $0xbf,%sil
cmp    $0x25,%sil
ja     118a <http_valid_raw_uri+0x8a>
movzbl %sil,%ecx
bt     %rcx,%r8
jb     1129 <http_valid_raw_uri+0x29>
jmp    118a <http_valid_raw_uri+0x8a>
mov    $0x1,%eax
ret

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

LLVM IR (-O2):
define i32 @http_valid_raw_uri(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %35, label %4
4: ; preds = %1, %31
%5 = phi i8* [ %33, %31 ], [ %0, %1 ]
%6 = phi i8 [ %32, %31 ], [ %2, %1 ]
%7 = icmp ult i8 %6, 32
br i1 %7, label %35, label %8
8: ; preds = %4
%9 = sext i8 %6 to i32
switch i32 %9, label %10 [
i32 32, label %35
i32 37, label %13
]
10: ; preds = %8
%11 = getelementptr inbounds i8, i8* %5, i64 1
%12 = load i8, i8* %11
br label %31
13: ; preds = %8
%14 = getelementptr inbounds i8, i8* %5, i64 1
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 0
br i1 %16, label %35, label %17
17: ; preds = %13
%18 = getelementptr inbounds i8, i8* %5, i64 2
%19 = load i8, i8* %18
%20 = icmp eq i8 %19, 0
br i1 %20, label %35, label %21
21: ; preds = %17
%22 = freeze i8 %15
%23 = add i8 %22, -48
%24 = icmp ult i8 %23, 10
br i1 %24, label %26, label %25
25: ; preds = %21
switch i8 %22, label %35 [
i8 102, label %26
i8 101, label %26
i8 100, label %26
i8 99, label %26
i8 98, label %26
i8 97, label %26
i8 70, label %26
i8 69, label %26
i8 68, label %26
i8 67, label %26
i8 66, label %26
i8 65, label %26
]
26: ; preds = %25, %25, %25, %25, %25, %25, %25, %25, %25, %25, %25, %25, %21
%27 = freeze i8 %19
%28 = add i8 %27, -48
%29 = icmp ult i8 %28, 10
br i1 %29, label %31, label %30
30: ; preds = %26
switch i8 %27, label %35 [
i8 102, label %31
i8 101, label %31
i8 100, label %31
i8 99, label %31
i8 98, label %31
i8 97, label %31
i8 70, label %31
i8 69, label %31
i8 68, label %31
i8 67, label %31
i8 66, label %31
i8 65, label %31
]
31: ; preds = %10, %30, %30, %30, %30, %30, %30, %30, %30, %30, %30, %30, %30, %26
%32 = phi i8 [ %12, %10 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %30 ], [ %22, %26 ]
%33 = getelementptr inbounds i8, i8* %5, i64 1
%34 = icmp eq i8 %32, 0
br i1 %34, label %35, label %4
35: ; preds = %4, %8, %17, %13, %31, %25, %30, %1
%36 = phi i32 [ 0, %1 ], [ 0, %4 ], [ 0, %8 ], [ 0, %17 ], [ 0, %13 ], [ 1, %31 ], [ 0, %25 ], [ 0, %30 ]
ret i32 %36
}