#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 */

/* Variables and functions */
unsigned int X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS;
scalar_t__ strncasecmp(char *, char *, int);
const unsigned char *valid_star(const unsigned char *p, size_t len,
                                unsigned int flags) {
  const unsigned char *star = 0;
  size_t i;
  int state = (1 << 0);
  int dots = 0;
  for (i = 0; i < len; ++i) {
    if (p[i] == '*') {
      int atstart = (state & (1 << 0));
      int atend = (i == len - 1 || p[i + 1] == '.');
      if (star != NULL || (state & (1 << 3)) != 0 || dots)
        return NULL;
      if ((flags & X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS) &&
          (!atstart || !atend))
        return NULL;
      if (!atstart && !atend)
        return NULL;
      star = &p[i];
      state &= ~(1 << 0);
    } else if ((state & (1 << 0)) != 0) {
      if ((state & (1 << 3)) == 0 && len - i >= 4 &&
          strncasecmp((char *)&p[i], "xn--", 4) == 0) {
        i += 3;
        state |= (1 << 3);
        continue;
      }
      state &= ~(1 << 0);
      if (('a' <= p[i] && p[i] <= 'z') || ('A' <= p[i] && p[i] <= 'Z') ||
          ('0' <= p[i] && p[i] <= '9'))
        continue;
      return NULL;
    } else if (('a' <= p[i] && p[i] <= 'z') || ('A' <= p[i] && p[i] <= 'Z') ||
               ('0' <= p[i] && p[i] <= '9')) {
      state &= (1 << 3);
      continue;
    } else if (p[i] == '.') {
      if (state & ((1 << 2) | (1 << 0)))
        return NULL;
      state = (1 << 0);
      ++dots;
    } else if (p[i] == '-') {
      if ((state & (1 << 0)) != 0)
        return NULL;
      state |= (1 << 2);
    } else
      return NULL;
  }
  if ((state & ((1 << 0) | (1 << 2))) != 0 || dots < 2)
    return NULL;
  return star;
}


x86 assembly (clang, -O0):
<valid_star>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movq   $0x0,-0x28(%rbp)
movl   $0x1,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    14b0 <valid_star+0x3a0>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    124a <valid_star+0x13a>
mov    -0x34(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x1,%rdx
mov    $0x1,%al
cmp    %rdx,%rcx
mov    %al,-0x41(%rbp)
je     119d <valid_star+0x8d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl 0x1(%rax,%rcx,1),%eax
cmp    $0x2e,%eax
sete   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x40(%rbp)
cmpq   $0x0,-0x28(%rbp)
jne    11cc <valid_star+0xbc>
mov    -0x34(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
jne    11cc <valid_star+0xbc>
cmpl   $0x0,-0x38(%rbp)
je     11d9 <valid_star+0xc9>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
mov    -0x1c(%rbp),%eax
mov    0x2dfd(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     120f <valid_star+0xff>
cmpl   $0x0,-0x3c(%rbp)
je     1202 <valid_star+0xf2>
cmpl   $0x0,-0x40(%rbp)
jne    120f <valid_star+0xff>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
cmpl   $0x0,-0x3c(%rbp)
jne    1230 <valid_star+0x120>
cmpl   $0x0,-0x40(%rbp)
jne    1230 <valid_star+0x120>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
mov    -0x10(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x34(%rbp)
jmp    149a <valid_star+0x38a>
mov    -0x34(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     135c <valid_star+0x24c>
mov    -0x34(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
jne    12b7 <valid_star+0x1a7>
mov    -0x18(%rbp),%rax
sub    -0x30(%rbp),%rax
cmp    $0x4,%rax
jb     12b7 <valid_star+0x1a7>
mov    -0x10(%rbp),%rdi
add    -0x30(%rbp),%rdi
lea    0xd77(%rip),%rsi
mov    $0x4,%edx
call   1030 <strncasecmp@plt>
cmp    $0x0,%rax
jne    12b7 <valid_star+0x1a7>
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
or     $0x8,%eax
mov    %eax,-0x34(%rbp)
jmp    149f <valid_star+0x38f>
mov    -0x34(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     12ee <valid_star+0x1de>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jle    134a <valid_star+0x23a>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     131c <valid_star+0x20c>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    134a <valid_star+0x23a>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     134f <valid_star+0x23f>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     134f <valid_star+0x23f>
jmp    149f <valid_star+0x38f>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     138a <valid_star+0x27a>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jle    13e6 <valid_star+0x2d6>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     13b8 <valid_star+0x2a8>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    13e6 <valid_star+0x2d6>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     13f4 <valid_star+0x2e4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     13f4 <valid_star+0x2e4>
mov    -0x34(%rbp),%eax
and    $0x8,%eax
mov    %eax,-0x34(%rbp)
jmp    149f <valid_star+0x38f>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    143a <valid_star+0x32a>
mov    -0x34(%rbp),%eax
and    $0x5,%eax
cmp    $0x0,%eax
je     1425 <valid_star+0x315>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
movl   $0x1,-0x34(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    148b <valid_star+0x37b>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1479 <valid_star+0x369>
mov    -0x34(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     146b <valid_star+0x35b>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
mov    -0x34(%rbp),%eax
or     $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    1486 <valid_star+0x376>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
jmp    148b <valid_star+0x37b>
jmp    1490 <valid_star+0x380>
jmp    1495 <valid_star+0x385>
jmp    149a <valid_star+0x38a>
jmp    149f <valid_star+0x38f>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1141 <valid_star+0x31>
mov    -0x34(%rbp),%eax
and    $0x5,%eax
cmp    $0x0,%eax
jne    14c9 <valid_star+0x3b9>
cmpl   $0x2,-0x38(%rbp)
jge    14d6 <valid_star+0x3c6>
movq   $0x0,-0x8(%rbp)
jmp    14de <valid_star+0x3ce>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid_star>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
test   %rsi,%rsi
je     1298 <valid_star+0x188>
mov    %edx,%r8d
mov    %rdi,%rbp
lea    -0x1(%rsi),%rdi
mov    0x2ea8(%rip),%rax
and    (%rax),%r8d
mov    $0x1,%ebx
xor    %r14d,%r14d
xor    %r12d,%r12d
xor    %r15d,%r15d
mov    %rsi,0x10(%rsp)
mov    %rdi,0x8(%rsp)
mov    %r8d,0x4(%rsp)
jmp    1170 <valid_star+0x60>
and    $0x8,%ebx
mov    %r14,%rax
add    $0x1,%r15
mov    %rax,%r14
cmp    %rsi,%r15
jae    12a2 <valid_star+0x192>
lea    (%r15,%rbp,1),%rax
movzbl 0x0(%rbp,%r15,1),%r13d
cmp    $0x2a,%r13b
jne    11c0 <valid_star+0xb0>
mov    $0x1,%cl
cmp    %rdi,%r15
je     1190 <valid_star+0x80>
cmpb   $0x2e,0x1(%r15,%rbp,1)
sete   %cl
test   %r14,%r14
jne    1294 <valid_star+0x184>
mov    %ebx,%edx
and    $0x8,%edx
or     %r12d,%edx
jne    1294 <valid_star+0x184>
test   %r8d,%r8d
je     126e <valid_star+0x15e>
test   %cl,%bl
jne    1275 <valid_star+0x165>
jmp    1294 <valid_star+0x184>
nopl   (%rax)
test   $0x1,%bl
jne    1210 <valid_star+0x100>
mov    %r13d,%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x1a,%al
jb     115a <valid_star+0x4a>
lea    -0x30(%r13),%eax
cmp    $0x9,%al
jbe    115a <valid_star+0x4a>
cmp    $0x2d,%r13b
je     1280 <valid_star+0x170>
cmp    $0x2e,%r13b
jne    1294 <valid_star+0x184>
test   $0x5,%bl
jne    1294 <valid_star+0x184>
add    $0x1,%r12d
mov    $0x1,%ebx
jmp    115d <valid_star+0x4d>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
test   $0x8,%bl
jne    1249 <valid_star+0x139>
mov    %rsi,%rcx
sub    %r15,%rcx
cmp    $0x4,%rcx
jb     1249 <valid_star+0x139>
mov    %rax,%rdi
lea    0xdd5(%rip),%rsi
mov    $0x4,%edx
call   1030 <strncasecmp@plt>
mov    0x8(%rsp),%rdi
mov    0x10(%rsp),%rsi
mov    0x4(%rsp),%r8d
test   %rax,%rax
je     1288 <valid_star+0x178>
and    $0xfffffffe,%ebx
mov    %r13d,%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x1a,%al
jb     115d <valid_star+0x4d>
add    $0xd0,%r13b
mov    %r14,%rax
cmp    $0xa,%r13b
jb     1160 <valid_star+0x50>
jmp    1294 <valid_star+0x184>
or     %bl,%cl
test   $0x1,%cl
je     1294 <valid_star+0x184>
and    $0xfffffffe,%ebx
xor    %r12d,%r12d
jmp    1160 <valid_star+0x50>
or     $0x4,%ebx
jmp    115d <valid_star+0x4d>
add    $0x3,%r15
or     $0x8,%ebx
jmp    115d <valid_star+0x4d>
xor    %eax,%eax
jmp    12b3 <valid_star+0x1a3>
xor    %r12d,%r12d
mov    $0x1,%ebx
xor    %eax,%eax
xor    %ecx,%ecx
cmp    $0x2,%r12d
cmovl  %rcx,%rax
test   $0x5,%bl
cmovne %rcx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS = global i32 0
@.str = [5 x i8] c"xn--\00"
define i8* @valid_star(i8* %0, i64 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i64
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i8* %0, i8** %5
store i64 %1, i64* %6
store i32 %2, i32* %7
store i8* null, i8** %8
store i32 1, i32* %10
store i32 0, i32* %11
store i64 0, i64* %9
br label %14
14: ; preds = %229, %3
%15 = load i64, i64* %9
%16 = load i64, i64* %6
%17 = icmp ult i64 %15, %16
br i1 %17, label %18, label %232
18: ; preds = %14
%19 = load i8*, i8** %5
%20 = load i64, i64* %9
%21 = getelementptr inbounds i8, i8* %19, i64 %20
%22 = load i8, i8* %21
%23 = zext i8 %22 to i32
%24 = icmp eq i32 %23, 42
br i1 %24, label %25, label %78
25: ; preds = %18
%26 = load i32, i32* %10
%27 = and i32 %26, 1
store i32 %27, i32* %12
%28 = load i64, i64* %9
%29 = load i64, i64* %6
%30 = sub i64 %29, 1
%31 = icmp eq i64 %28, %30
br i1 %31, label %40, label %32
32: ; preds = %25
%33 = load i8*, i8** %5
%34 = load i64, i64* %9
%35 = add i64 %34, 1
%36 = getelementptr inbounds i8, i8* %33, i64 %35
%37 = load i8, i8* %36
%38 = zext i8 %37 to i32
%39 = icmp eq i32 %38, 46
br label %40
40: ; preds = %32, %25
%41 = phi i1 [ true, %25 ], [ %39, %32 ]
%42 = zext i1 %41 to i32
store i32 %42, i32* %13
%43 = load i8*, i8** %8
%44 = icmp ne i8* %43, null
br i1 %44, label %52, label %45
45: ; preds = %40
%46 = load i32, i32* %10
%47 = and i32 %46, 8
%48 = icmp ne i32 %47, 0
br i1 %48, label %52, label %49
49: ; preds = %45
%50 = load i32, i32* %11
%51 = icmp ne i32 %50, 0
br i1 %51, label %52, label %53
52: ; preds = %49, %45, %40
store i8* null, i8** %4
br label %242
53: ; preds = %49
%54 = load i32, i32* %7
%55 = load i32, i32* @X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
%56 = and i32 %54, %55
%57 = icmp ne i32 %56, 0
br i1 %57, label %58, label %65
58: ; preds = %53
%59 = load i32, i32* %12
%60 = icmp ne i32 %59, 0
br i1 %60, label %61, label %64
61: ; preds = %58
%62 = load i32, i32* %13
%63 = icmp ne i32 %62, 0
br i1 %63, label %65, label %64
64: ; preds = %61, %58
store i8* null, i8** %4
br label %242
65: ; preds = %61, %53
%66 = load i32, i32* %12
%67 = icmp ne i32 %66, 0
br i1 %67, label %72, label %68
68: ; preds = %65
%69 = load i32, i32* %13
%70 = icmp ne i32 %69, 0
br i1 %70, label %72, label %71
71: ; preds = %68
store i8* null, i8** %4
br label %242
72: ; preds = %68, %65
%73 = load i8*, i8** %5
%74 = load i64, i64* %9
%75 = getelementptr inbounds i8, i8* %73, i64 %74
store i8* %75, i8** %8
%76 = load i32, i32* %10
%77 = and i32 %76, -2
store i32 %77, i32* %10
br label %228
78: ; preds = %18
%79 = load i32, i32* %10
%80 = and i32 %79, 1
%81 = icmp ne i32 %80, 0
br i1 %81, label %82, label %148
82: ; preds = %78
%83 = load i32, i32* %10
%84 = and i32 %83, 8
%85 = icmp eq i32 %84, 0
br i1 %85, label %86, label %102
86: ; preds = %82
%87 = load i64, i64* %6
%88 = load i64, i64* %9
%89 = sub i64 %87, %88
%90 = icmp uge i64 %89, 4
br i1 %90, label %91, label %102
91: ; preds = %86
%92 = load i8*, i8** %5
%93 = load i64, i64* %9
%94 = getelementptr inbounds i8, i8* %92, i64 %93
%95 = call i64 @strncasecmp(i8* %94, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i32 4)
%96 = icmp eq i64 %95, 0
br i1 %96, label %97, label %102
97: ; preds = %91
%98 = load i64, i64* %9
%99 = add i64 %98, 3
store i64 %99, i64* %9
%100 = load i32, i32* %10
%101 = or i32 %100, 8
store i32 %101, i32* %10
br label %229
102: ; preds = %91, %86, %82
%103 = load i32, i32* %10
%104 = and i32 %103, -2
store i32 %104, i32* %10
%105 = load i8*, i8** %5
%106 = load i64, i64* %9
%107 = getelementptr inbounds i8, i8* %105, i64 %106
%108 = load i8, i8* %107
%109 = zext i8 %108 to i32
%110 = icmp sle i32 97, %109
br i1 %110, label %111, label %118
111: ; preds = %102
%112 = load i8*, i8** %5
%113 = load i64, i64* %9
%114 = getelementptr inbounds i8, i8* %112, i64 %113
%115 = load i8, i8* %114
%116 = zext i8 %115 to i32
%117 = icmp sle i32 %116, 122
br i1 %117, label %146, label %118
118: ; preds = %111, %102
%119 = load i8*, i8** %5
%120 = load i64, i64* %9
%121 = getelementptr inbounds i8, i8* %119, i64 %120
%122 = load i8, i8* %121
%123 = zext i8 %122 to i32
%124 = icmp sle i32 65, %123
br i1 %124, label %125, label %132
125: ; preds = %118
%126 = load i8*, i8** %5
%127 = load i64, i64* %9
%128 = getelementptr inbounds i8, i8* %126, i64 %127
%129 = load i8, i8* %128
%130 = zext i8 %129 to i32
%131 = icmp sle i32 %130, 90
br i1 %131, label %146, label %132
132: ; preds = %125, %118
%133 = load i8*, i8** %5
%134 = load i64, i64* %9
%135 = getelementptr inbounds i8, i8* %133, i64 %134
%136 = load i8, i8* %135
%137 = zext i8 %136 to i32
%138 = icmp sle i32 48, %137
br i1 %138, label %139, label %147
139: ; preds = %132
%140 = load i8*, i8** %5
%141 = load i64, i64* %9
%142 = getelementptr inbounds i8, i8* %140, i64 %141
%143 = load i8, i8* %142
%144 = zext i8 %143 to i32
%145 = icmp sle i32 %144, 57
br i1 %145, label %146, label %147
146: ; preds = %139, %125, %111
br label %229
147: ; preds = %139, %132
store i8* null, i8** %4
br label %242
148: ; preds = %78
%149 = load i8*, i8** %5
%150 = load i64, i64* %9
%151 = getelementptr inbounds i8, i8* %149, i64 %150
%152 = load i8, i8* %151
%153 = zext i8 %152 to i32
%154 = icmp sle i32 97, %153
br i1 %154, label %155, label %162
155: ; preds = %148
%156 = load i8*, i8** %5
%157 = load i64, i64* %9
%158 = getelementptr inbounds i8, i8* %156, i64 %157
%159 = load i8, i8* %158
%160 = zext i8 %159 to i32
%161 = icmp sle i32 %160, 122
br i1 %161, label %190, label %162
162: ; preds = %155, %148
%163 = load i8*, i8** %5
%164 = load i64, i64* %9
%165 = getelementptr inbounds i8, i8* %163, i64 %164
%166 = load i8, i8* %165
%167 = zext i8 %166 to i32
%168 = icmp sle i32 65, %167
br i1 %168, label %169, label %176
169: ; preds = %162
%170 = load i8*, i8** %5
%171 = load i64, i64* %9
%172 = getelementptr inbounds i8, i8* %170, i64 %171
%173 = load i8, i8* %172
%174 = zext i8 %173 to i32
%175 = icmp sle i32 %174, 90
br i1 %175, label %190, label %176
176: ; preds = %169, %162
%177 = load i8*, i8** %5
%178 = load i64, i64* %9
%179 = getelementptr inbounds i8, i8* %177, i64 %178
%180 = load i8, i8* %179
%181 = zext i8 %180 to i32
%182 = icmp sle i32 48, %181
br i1 %182, label %183, label %193
183: ; preds = %176
%184 = load i8*, i8** %5
%185 = load i64, i64* %9
%186 = getelementptr inbounds i8, i8* %184, i64 %185
%187 = load i8, i8* %186
%188 = zext i8 %187 to i32
%189 = icmp sle i32 %188, 57
br i1 %189, label %190, label %193
190: ; preds = %183, %169, %155
%191 = load i32, i32* %10
%192 = and i32 %191, 8
store i32 %192, i32* %10
br label %229
193: ; preds = %183, %176
%194 = load i8*, i8** %5
%195 = load i64, i64* %9
%196 = getelementptr inbounds i8, i8* %194, i64 %195
%197 = load i8, i8* %196
%198 = zext i8 %197 to i32
%199 = icmp eq i32 %198, 46
br i1 %199, label %200, label %208
200: ; preds = %193
%201 = load i32, i32* %10
%202 = and i32 %201, 5
%203 = icmp ne i32 %202, 0
br i1 %203, label %204, label %205
204: ; preds = %200
store i8* null, i8** %4
br label %242
205: ; preds = %200
store i32 1, i32* %10
%206 = load i32, i32* %11
%207 = add nsw i32 %206, 1
store i32 %207, i32* %11
br label %225
208: ; preds = %193
%209 = load i8*, i8** %5
%210 = load i64, i64* %9
%211 = getelementptr inbounds i8, i8* %209, i64 %210
%212 = load i8, i8* %211
%213 = zext i8 %212 to i32
%214 = icmp eq i32 %213, 45
br i1 %214, label %215, label %223
215: ; preds = %208
%216 = load i32, i32* %10
%217 = and i32 %216, 1
%218 = icmp ne i32 %217, 0
br i1 %218, label %219, label %220
219: ; preds = %215
store i8* null, i8** %4
br label %242
220: ; preds = %215
%221 = load i32, i32* %10
%222 = or i32 %221, 4
store i32 %222, i32* %10
br label %224
223: ; preds = %208
store i8* null, i8** %4
br label %242
224: ; preds = %220
br label %225
225: ; preds = %224, %205
br label %226
226: ; preds = %225
br label %227
227: ; preds = %226
br label %228
228: ; preds = %227, %72
br label %229
229: ; preds = %228, %190, %146, %97
%230 = load i64, i64* %9
%231 = add i64 %230, 1
store i64 %231, i64* %9
br label %14
232: ; preds = %14
%233 = load i32, i32* %10
%234 = and i32 %233, 5
%235 = icmp ne i32 %234, 0
br i1 %235, label %239, label %236
236: ; preds = %232
%237 = load i32, i32* %11
%238 = icmp slt i32 %237, 2
br i1 %238, label %239, label %240
239: ; preds = %236, %232
store i8* null, i8** %4
br label %242
240: ; preds = %236
%241 = load i8*, i8** %8
store i8* %241, i8** %4
br label %242
242: ; preds = %240, %239, %223, %219, %204, %147, %71, %64, %52
%243 = load i8*, i8** %4
ret i8* %243
}

LLVM IR (-O2):
@X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS = global i32 0
@.str = [5 x i8] c"xn--\00"
define i8* @valid_star(i8* %0, i64 %1, i32 %2) {
%4 = icmp eq i64 %1, 0
br i1 %4, label %88, label %5
5: ; preds = %3
%6 = add i64 %1, -1
%7 = load i32, i32* @X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
%8 = and i32 %7, %2
%9 = icmp eq i32 %8, 0
br label %10
10: ; preds = %5, %81
%11 = phi i8* [ null, %5 ], [ %85, %81 ]
%12 = phi i32 [ 0, %5 ], [ %84, %81 ]
%13 = phi i32 [ 1, %5 ], [ %83, %81 ]
%14 = phi i64 [ 0, %5 ], [ %86, %81 ]
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = load i8, i8* %15
%17 = icmp eq i8 %16, 42
%18 = and i32 %13, 1
br i1 %17, label %19, label %42
19: ; preds = %10
%20 = icmp eq i64 %14, %6
br i1 %20, label %26, label %21
21: ; preds = %19
%22 = add nuw i64 %14, 1
%23 = getelementptr inbounds i8, i8* %0, i64 %22
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 46
br label %26
26: ; preds = %21, %19
%27 = phi i1 [ true, %19 ], [ %25, %21 ]
%28 = icmp eq i8* %11, null
br i1 %28, label %29, label %97
29: ; preds = %26
%30 = and i32 %13, 8
%31 = icmp ne i32 %30, 0
%32 = icmp ne i32 %12, 0
%33 = select i1 %31, i1 true, i1 %32
br i1 %33, label %97, label %34
34: ; preds = %29
%35 = icmp ne i32 %18, 0
br i1 %9, label %38, label %36
36: ; preds = %34
%37 = select i1 %35, i1 %27, i1 false
br i1 %37, label %40, label %97
38: ; preds = %34
%39 = select i1 %35, i1 true, i1 %27
br i1 %39, label %40, label %97
40: ; preds = %36, %38
%41 = and i32 %13, -2
br label %81
42: ; preds = %10
%43 = icmp eq i32 %18, 0
br i1 %43, label %64, label %44
44: ; preds = %42
%45 = and i32 %13, 8
%46 = icmp eq i32 %45, 0
%47 = sub i64 %1, %14
%48 = icmp ugt i64 %47, 3
%49 = select i1 %46, i1 %48, i1 false
br i1 %49, label %50, label %56
50: ; preds = %44
%51 = tail call i64 @strncasecmp(i8* %15, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i32 4)
%52 = icmp eq i64 %51, 0
br i1 %52, label %53, label %56
53: ; preds = %50
%54 = add i64 %14, 3
%55 = or i32 %13, 8
br label %81
56: ; preds = %50, %44
%57 = and i32 %13, -2
%58 = and i8 %16, -33
%59 = add i8 %58, -65
%60 = icmp ult i8 %59, 26
%61 = add i8 %16, -48
%62 = icmp ult i8 %61, 10
%63 = select i1 %60, i1 true, i1 %62
br i1 %63, label %81, label %97
64: ; preds = %42
%65 = and i8 %16, -33
%66 = add i8 %65, -65
%67 = icmp ult i8 %66, 26
%68 = add i8 %16, -48
%69 = icmp ult i8 %68, 10
%70 = select i1 %67, i1 true, i1 %69
br i1 %70, label %71, label %73
71: ; preds = %64
%72 = and i32 %13, 8
br label %81
73: ; preds = %64
switch i8 %16, label %97 [
i8 46, label %74
i8 45, label %79
]
74: ; preds = %73
%75 = and i32 %13, 5
%76 = icmp eq i32 %75, 0
br i1 %76, label %77, label %97
77: ; preds = %74
%78 = add nsw i32 %12, 1
br label %81
79: ; preds = %73
%80 = or i32 %13, 4
br label %81
81: ; preds = %40, %56, %79, %77, %71, %53
%82 = phi i64 [ %14, %40 ], [ %54, %53 ], [ %14, %71 ], [ %14, %77 ], [ %14, %79 ], [ %14, %56 ]
%83 = phi i32 [ %41, %40 ], [ %55, %53 ], [ %72, %71 ], [ 1, %77 ], [ %80, %79 ], [ %57, %56 ]
%84 = phi i32 [ 0, %40 ], [ %12, %53 ], [ %12, %71 ], [ %78, %77 ], [ %12, %79 ], [ %12, %56 ]
%85 = phi i8* [ %15, %40 ], [ %11, %53 ], [ %11, %71 ], [ %11, %77 ], [ %11, %79 ], [ %11, %56 ]
%86 = add i64 %82, 1
%87 = icmp ult i64 %86, %1
br i1 %87, label %10, label %88
88: ; preds = %81, %3
%89 = phi i32 [ 1, %3 ], [ %83, %81 ]
%90 = phi i32 [ 0, %3 ], [ %84, %81 ]
%91 = phi i8* [ null, %3 ], [ %85, %81 ]
%92 = and i32 %89, 5
%93 = icmp ne i32 %92, 0
%94 = icmp slt i32 %90, 2
%95 = select i1 %93, i1 true, i1 %94
%96 = select i1 %95, i8* null, i8* %91
br label %97
97: ; preds = %56, %38, %36, %26, %29, %73, %74, %88
%98 = phi i8* [ %96, %88 ], [ null, %74 ], [ null, %73 ], [ null, %29 ], [ null, %26 ], [ null, %36 ], [ null, %38 ], [ null, %56 ]
ret i8* %98
}