#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 */
char *alloca(scalar_t__);
int /*<<< orphan*/ isalnum(char);
scalar_t__ isalpha(char);
scalar_t__ isdigit(char);
int strcmp(char const *, char const *);
int /*<<< orphan*/ strcpy(char *, char const *);
scalar_t__ strlen(char const *);
int rpmvercmp(const char *a, const char *b) {
  char oldch1, oldch2;
  char *str1, *str2;
  char *one, *two;
  int rc;
  int isnum;
  if (!strcmp(a, b))
    return 0;
  str1 = alloca(strlen(a) + 1);
  str2 = alloca(strlen(b) + 1);
  strcpy(str1, a);
  strcpy(str2, b);
  one = str1;
  two = str2;
  while (*one && *two) {
    while (*one && !isalnum(*one))
      one++;
    while (*two && !isalnum(*two))
      two++;
    if (!(*one && *two))
      break;
    str1 = one;
    str2 = two;
    if (isdigit(*str1)) {
      while (*str1 && isdigit(*str1))
        str1++;
      while (*str2 && isdigit(*str2))
        str2++;
      isnum = 1;
    } else {
      while (*str1 && isalpha(*str1))
        str1++;
      while (*str2 && isalpha(*str2))
        str2++;
      isnum = 0;
    }
    oldch1 = *str1;
    *str1 = '\0';
    oldch2 = *str2;
    *str2 = '\0';
    if (one == str1)
      return -1;
    if (two == str2)
      return (isnum ? 1 : -1);
    if (isnum) {
      while (*one == '0')
        one++;
      while (*two == '0')
        two++;
      if (strlen(one) > strlen(two))
        return 1;
      if (strlen(two) > strlen(one))
        return -1;
    }
    rc = strcmp(one, two);
    if (rc)
      return (rc < 1 ? -1 : 1);
    *str1 = oldch1;
    one = str1;
    *str2 = oldch2;
    two = str2;
  }
  if ((!*one) && (!*two))
    return 0;
  if (!*one)
    return -1;
  else
    return 1;
}


x86 assembly (clang, -O0):
<rpmvercmp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1070 <strcmp@plt>
cmp    $0x0,%eax
jne    11a2 <rpmvercmp+0x32>
movl   $0x0,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
mov    -0x10(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,%rdi
add    $0x1,%rdi
call   1080 <alloca@plt>
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,%rdi
add    $0x1,%rdi
call   1080 <alloca@plt>
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x10(%rbp),%rsi
call   1040 <strcpy@plt>
mov    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <strcpy@plt>
mov    -0x28(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x49(%rbp)
je     1223 <rpmvercmp+0xb3>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    1233 <rpmvercmp+0xc3>
jmp    15f7 <rpmvercmp+0x487>
jmp    1238 <rpmvercmp+0xc8>
mov    -0x38(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4a(%rbp)
je     1264 <rpmvercmp+0xf4>
mov    -0x38(%rbp),%rax
movsbl (%rax),%edi
call   1060 <isalnum@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x4a(%rbp)
mov    -0x4a(%rbp),%al
test   $0x1,%al
jne    1274 <rpmvercmp+0x104>
jmp    1285 <rpmvercmp+0x115>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1238 <rpmvercmp+0xc8>
jmp    128a <rpmvercmp+0x11a>
mov    -0x40(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4b(%rbp)
je     12b6 <rpmvercmp+0x146>
mov    -0x40(%rbp),%rax
movsbl (%rax),%edi
call   1060 <isalnum@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x4b(%rbp)
mov    -0x4b(%rbp),%al
test   $0x1,%al
jne    12c6 <rpmvercmp+0x156>
jmp    12d7 <rpmvercmp+0x167>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    128a <rpmvercmp+0x11a>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12f7 <rpmvercmp+0x187>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12fc <rpmvercmp+0x18c>
jmp    15f7 <rpmvercmp+0x487>
mov    -0x38(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     13d0 <rpmvercmp+0x260>
jmp    1327 <rpmvercmp+0x1b7>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4c(%rbp)
je     1352 <rpmvercmp+0x1e2>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x4c(%rbp)
mov    -0x4c(%rbp),%al
test   $0x1,%al
jne    1362 <rpmvercmp+0x1f2>
jmp    1373 <rpmvercmp+0x203>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1327 <rpmvercmp+0x1b7>
jmp    1378 <rpmvercmp+0x208>
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4d(%rbp)
je     13a3 <rpmvercmp+0x233>
mov    -0x30(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x4d(%rbp)
mov    -0x4d(%rbp),%al
test   $0x1,%al
jne    13b3 <rpmvercmp+0x243>
jmp    13c4 <rpmvercmp+0x254>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1378 <rpmvercmp+0x208>
movl   $0x1,-0x48(%rbp)
jmp    1479 <rpmvercmp+0x309>
jmp    13d5 <rpmvercmp+0x265>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4e(%rbp)
je     1400 <rpmvercmp+0x290>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1090 <isalpha@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x4e(%rbp)
mov    -0x4e(%rbp),%al
test   $0x1,%al
jne    1410 <rpmvercmp+0x2a0>
jmp    1421 <rpmvercmp+0x2b1>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13d5 <rpmvercmp+0x265>
jmp    1426 <rpmvercmp+0x2b6>
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4f(%rbp)
je     1451 <rpmvercmp+0x2e1>
mov    -0x30(%rbp),%rax
movsbl (%rax),%edi
call   1090 <isalpha@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x4f(%rbp)
mov    -0x4f(%rbp),%al
test   $0x1,%al
jne    1461 <rpmvercmp+0x2f1>
jmp    1472 <rpmvercmp+0x302>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1426 <rpmvercmp+0x2b6>
movl   $0x0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x1a(%rbp)
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
jne    14b3 <rpmvercmp+0x343>
movl   $0xffffffff,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
mov    -0x40(%rbp),%rax
cmp    -0x30(%rbp),%rax
jne    14dc <rpmvercmp+0x36c>
mov    -0x48(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
cmpl   $0x0,-0x48(%rbp)
je     159b <rpmvercmp+0x42b>
jmp    14eb <rpmvercmp+0x37b>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    150c <rpmvercmp+0x39c>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    14eb <rpmvercmp+0x37b>
jmp    1511 <rpmvercmp+0x3a1>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1532 <rpmvercmp+0x3c2>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1511 <rpmvercmp+0x3a1>
mov    -0x38(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x58(%rbp)
mov    -0x40(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,%rcx
mov    -0x58(%rbp),%rax
cmp    %rcx,%rax
jle    1564 <rpmvercmp+0x3f4>
movl   $0x1,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
mov    -0x40(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x60(%rbp)
mov    -0x38(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,%rcx
mov    -0x60(%rbp),%rax
cmp    %rcx,%rax
jle    1596 <rpmvercmp+0x426>
movl   $0xffffffff,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
jmp    159b <rpmvercmp+0x42b>
mov    -0x38(%rbp),%rdi
mov    -0x40(%rbp),%rsi
call   1070 <strcmp@plt>
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
je     15d0 <rpmvercmp+0x460>
mov    -0x44(%rbp),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x1,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
mov    -0x19(%rbp),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x1a(%rbp),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    11fe <rpmvercmp+0x8e>
mov    -0x38(%rbp),%rax
cmpb   $0x0,(%rax)
jne    161d <rpmvercmp+0x4ad>
mov    -0x40(%rbp),%rax
cmpb   $0x0,(%rax)
jne    161d <rpmvercmp+0x4ad>
movl   $0x0,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
mov    -0x38(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1636 <rpmvercmp+0x4c6>
movl   $0xffffffff,-0x4(%rbp)
jmp    163d <rpmvercmp+0x4cd>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rpmvercmp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%rbp
call   1070 <strcmp@plt>
test   %eax,%eax
je     13c3 <rpmvercmp+0x253>
mov    %rbp,%rdi
call   1050 <strlen@plt>
lea    0x1(%rax),%rdi
call   1080 <alloca@plt>
mov    %rax,%r15
mov    %rbx,%rdi
call   1050 <strlen@plt>
lea    0x1(%rax),%rdi
call   1080 <alloca@plt>
mov    %rax,%r12
mov    %r15,%rdi
mov    %rbp,%rsi
call   1040 <strcpy@plt>
mov    %r12,%rdi
mov    %rbx,%rsi
call   1040 <strcpy@plt>
mov    (%r15),%cl
test   %cl,%cl
je     13ca <rpmvercmp+0x25a>
mov    (%r12),%r14b
mov    $0x1,%eax
test   %r14b,%r14b
je     13d2 <rpmvercmp+0x262>
mov    %r15,%rbx
nopl   0x0(%rax)
movsbl %cl,%edi
call   1060 <isalnum@plt>
test   %eax,%eax
jne    1208 <rpmvercmp+0x98>
movzbl 0x1(%rbx),%ecx
add    $0x1,%rbx
test   %cl,%cl
jne    11f0 <rpmvercmp+0x80>
mov    (%r12),%al
mov    %r12,%rbp
test   %al,%al
je     1238 <rpmvercmp+0xc8>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl %al,%edi
call   1060 <isalnum@plt>
test   %eax,%eax
jne    1238 <rpmvercmp+0xc8>
movzbl 0x1(%rbp),%eax
add    $0x1,%rbp
test   %al,%al
jne    1220 <rpmvercmp+0xb0>
mov    (%rbx),%al
test   %al,%al
je     13c7 <rpmvercmp+0x257>
cmpb   $0x0,0x0(%rbp)
je     13e1 <rpmvercmp+0x271>
movsbl %al,%edi
call   1030 <isdigit@plt>
mov    %rax,%r14
mov    (%rbx),%al
mov    %rbx,%r15
test   %r14,%r14
je     12c9 <rpmvercmp+0x159>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %al,%al
je     128e <rpmvercmp+0x11e>
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     128e <rpmvercmp+0x11e>
movzbl 0x1(%r15),%eax
add    $0x1,%r15
test   %al,%al
jne    1274 <rpmvercmp+0x104>
mov    0x0(%rbp),%al
test   %al,%al
je     1320 <rpmvercmp+0x1b0>
mov    %rbp,%r12
nopl   0x0(%rax)
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     1310 <rpmvercmp+0x1a0>
movzbl 0x1(%r12),%eax
add    $0x1,%r12
test   %al,%al
jne    12a0 <rpmvercmp+0x130>
jmp    1310 <rpmvercmp+0x1a0>
nopl   (%rax)
movzbl 0x1(%r15),%eax
add    $0x1,%r15
test   %al,%al
je     12da <rpmvercmp+0x16a>
movsbl %al,%edi
call   1090 <isalpha@plt>
test   %rax,%rax
jne    12c0 <rpmvercmp+0x150>
mov    0x0(%rbp),%al
test   %al,%al
je     1320 <rpmvercmp+0x1b0>
mov    %rbp,%r12
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsbl %al,%edi
call   1090 <isalpha@plt>
test   %rax,%rax
je     1310 <rpmvercmp+0x1a0>
movzbl 0x1(%r12),%eax
add    $0x1,%r12
test   %al,%al
jne    12f0 <rpmvercmp+0x180>
nopl   0x0(%rax,%rax,1)
mov    %r14,%rax
jmp    1326 <rpmvercmp+0x1b6>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r14,%rax
mov    %rbp,%r12
mov    (%r15),%r13b
movb   $0x0,(%r15)
mov    (%r12),%r14b
movb   $0x0,(%r12)
cmp    %r15,%rbx
je     13e8 <rpmvercmp+0x278>
cmp    %r12,%rbp
je     13ef <rpmvercmp+0x27f>
test   %rax,%rax
je     13a0 <rpmvercmp+0x230>
add    $0xffffffffffffffff,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmpb   $0x30,0x1(%rbx)
lea    0x1(%rbx),%rbx
je     1360 <rpmvercmp+0x1f0>
add    $0xffffffffffffffff,%rbp
xchg   %ax,%ax
cmpb   $0x30,0x1(%rbp)
lea    0x1(%rbp),%rbp
je     1370 <rpmvercmp+0x200>
mov    %rbx,%rdi
call   1050 <strlen@plt>
mov    %rax,(%rsp)
mov    %rbp,%rdi
call   1050 <strlen@plt>
cmp    %rax,(%rsp)
mov    $0x1,%eax
jg     13d2 <rpmvercmp+0x262>
mov    $0xffffffff,%eax
jl     13d2 <rpmvercmp+0x262>
mov    %rbx,%rdi
mov    %rbp,%rsi
call   1070 <strcmp@plt>
test   %eax,%eax
jne    13fa <rpmvercmp+0x28a>
mov    %r13b,(%r15)
mov    %r14b,(%r12)
mov    (%r15),%cl
test   %cl,%cl
jne    11db <rpmvercmp+0x6b>
jmp    13ca <rpmvercmp+0x25a>
xor    %eax,%eax
jmp    13d2 <rpmvercmp+0x262>
mov    %rbp,%r12
xor    %eax,%eax
cmp    (%r12),%al
sbb    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x1,%eax
jmp    13d2 <rpmvercmp+0x262>
mov    $0xffffffff,%eax
jmp    13d2 <rpmvercmp+0x262>
cmp    $0x1,%rax
sbb    %eax,%eax
or     $0x1,%eax
jmp    13d2 <rpmvercmp+0x262>
setg   %al
movzbl %al,%eax
add    %eax,%eax
add    $0xffffffff,%eax
jmp    13d2 <rpmvercmp+0x262>

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

LLVM IR (-O2):
define i32 @rpmvercmp(i8* %0, i8* %1) {
%3 = tail call i32 @strcmp(i8* dereferenceable(1) %0, i8* dereferenceable(1) %1)
%4 = icmp eq i32 %3, 0
br i1 %4, label %147, label %5
5: ; preds = %2
%6 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%7 = add nsw i64 %6, 1
%8 = tail call i8* @alloca(i64 %7)
%9 = tail call i64 @strlen(i8* dereferenceable(1) %1)
%10 = add nsw i64 %9, 1
%11 = tail call i8* @alloca(i64 %10)
%12 = tail call i32 @strcpy(i8* %8, i8* %0)
%13 = tail call i32 @strcpy(i8* %11, i8* %1)
%14 = load i8, i8* %8
%15 = icmp eq i8 %14, 0
br i1 %15, label %142, label %16
16: ; preds = %5
%17 = load i8, i8* %11
br label %18
18: ; preds = %16, %139
%19 = phi i8 [ %108, %139 ], [ %17, %16 ]
%20 = phi i8 [ %140, %139 ], [ %14, %16 ]
%21 = phi i8* [ %106, %139 ], [ %11, %16 ]
%22 = phi i8* [ %105, %139 ], [ %8, %16 ]
%23 = icmp eq i8 %19, 0
br i1 %23, label %147, label %24
24: ; preds = %18, %29
%25 = phi i8* [ %30, %29 ], [ %22, %18 ]
%26 = phi i8 [ %31, %29 ], [ %20, %18 ]
%27 = tail call i32 @isalnum(i8 signext %26)
%28 = icmp eq i32 %27, 0
br i1 %28, label %29, label %33
29: ; preds = %24
%30 = getelementptr inbounds i8, i8* %25, i64 1
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 0
br i1 %32, label %33, label %24
33: ; preds = %24, %29
%34 = phi i8* [ %30, %29 ], [ %25, %24 ]
%35 = load i8, i8* %21
%36 = icmp eq i8 %35, 0
br i1 %36, label %46, label %37
37: ; preds = %33, %42
%38 = phi i8 [ %44, %42 ], [ %35, %33 ]
%39 = phi i8* [ %43, %42 ], [ %21, %33 ]
%40 = tail call i32 @isalnum(i8 signext %38)
%41 = icmp eq i32 %40, 0
br i1 %41, label %42, label %46
42: ; preds = %37
%43 = getelementptr inbounds i8, i8* %39, i64 1
%44 = load i8, i8* %43
%45 = icmp eq i8 %44, 0
br i1 %45, label %46, label %37
46: ; preds = %37, %42, %33
%47 = phi i8* [ %21, %33 ], [ %43, %42 ], [ %39, %37 ]
%48 = load i8, i8* %34
%49 = icmp eq i8 %48, 0
br i1 %49, label %142, label %50
50: ; preds = %46
%51 = load i8, i8* %47
%52 = icmp eq i8 %51, 0
br i1 %52, label %147, label %53
53: ; preds = %50
%54 = tail call i64 @isdigit(i8 signext %48)
%55 = icmp eq i64 %54, 0
%56 = load i8, i8* %34
%57 = icmp eq i8 %56, 0
br i1 %55, label %59, label %58
58: ; preds = %53
br i1 %57, label %69, label %60
59: ; preds = %53
br i1 %57, label %91, label %82
60: ; preds = %58, %65
%61 = phi i8 [ %67, %65 ], [ %56, %58 ]
%62 = phi i8* [ %66, %65 ], [ %34, %58 ]
%63 = tail call i64 @isdigit(i8 signext %61)
%64 = icmp eq i64 %63, 0
br i1 %64, label %69, label %65
65: ; preds = %60
%66 = getelementptr inbounds i8, i8* %62, i64 1
%67 = load i8, i8* %66
%68 = icmp eq i8 %67, 0
br i1 %68, label %69, label %60
69: ; preds = %60, %65, %58
%70 = phi i8* [ %34, %58 ], [ %66, %65 ], [ %62, %60 ]
%71 = load i8, i8* %47
%72 = icmp eq i8 %71, 0
br i1 %72, label %104, label %73
73: ; preds = %69, %78
%74 = phi i8 [ %80, %78 ], [ %71, %69 ]
%75 = phi i8* [ %79, %78 ], [ %47, %69 ]
%76 = tail call i64 @isdigit(i8 signext %74)
%77 = icmp eq i64 %76, 0
br i1 %77, label %104, label %78
78: ; preds = %73
%79 = getelementptr inbounds i8, i8* %75, i64 1
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 0
br i1 %81, label %104, label %73
82: ; preds = %59, %87
%83 = phi i8 [ %89, %87 ], [ %56, %59 ]
%84 = phi i8* [ %88, %87 ], [ %34, %59 ]
%85 = tail call i64 @isalpha(i8 signext %83)
%86 = icmp eq i64 %85, 0
br i1 %86, label %91, label %87
87: ; preds = %82
%88 = getelementptr inbounds i8, i8* %84, i64 1
%89 = load i8, i8* %88
%90 = icmp eq i8 %89, 0
br i1 %90, label %91, label %82
91: ; preds = %82, %87, %59
%92 = phi i8* [ %34, %59 ], [ %88, %87 ], [ %84, %82 ]
%93 = load i8, i8* %47
%94 = icmp eq i8 %93, 0
br i1 %94, label %104, label %95
95: ; preds = %91, %100
%96 = phi i8 [ %102, %100 ], [ %93, %91 ]
%97 = phi i8* [ %101, %100 ], [ %47, %91 ]
%98 = tail call i64 @isalpha(i8 signext %96)
%99 = icmp eq i64 %98, 0
br i1 %99, label %104, label %100
100: ; preds = %95
%101 = getelementptr inbounds i8, i8* %97, i64 1
%102 = load i8, i8* %101
%103 = icmp eq i8 %102, 0
br i1 %103, label %104, label %95
104: ; preds = %78, %73, %100, %95, %69, %91
%105 = phi i8* [ %92, %91 ], [ %70, %69 ], [ %92, %95 ], [ %92, %100 ], [ %70, %73 ], [ %70, %78 ]
%106 = phi i8* [ %47, %91 ], [ %47, %69 ], [ %101, %100 ], [ %97, %95 ], [ %79, %78 ], [ %75, %73 ]
%107 = load i8, i8* %105
store i8 0, i8* %105
%108 = load i8, i8* %106
store i8 0, i8* %106
%109 = icmp eq i8* %34, %105
br i1 %109, label %147, label %110
110: ; preds = %104
%111 = icmp eq i8* %47, %106
br i1 %111, label %112, label %114
112: ; preds = %110
%113 = select i1 %55, i32 -1, i32 1
br label %147
114: ; preds = %110
br i1 %55, label %131, label %115
115: ; preds = %114, %115
%116 = phi i8* [ %119, %115 ], [ %34, %114 ]
%117 = load i8, i8* %116
%118 = icmp eq i8 %117, 48
%119 = getelementptr inbounds i8, i8* %116, i64 1
br i1 %118, label %115, label %120
120: ; preds = %115, %120
%121 = phi i8* [ %124, %120 ], [ %47, %115 ]
%122 = load i8, i8* %121
%123 = icmp eq i8 %122, 48
%124 = getelementptr inbounds i8, i8* %121, i64 1
br i1 %123, label %120, label %125
125: ; preds = %120
%126 = tail call i64 @strlen(i8* %116)
%127 = tail call i64 @strlen(i8* %121)
%128 = icmp sgt i64 %126, %127
br i1 %128, label %147, label %129
129: ; preds = %125
%130 = icmp sgt i64 %127, %126
br i1 %130, label %147, label %131
131: ; preds = %129, %114
%132 = phi i8* [ %116, %129 ], [ %34, %114 ]
%133 = phi i8* [ %121, %129 ], [ %47, %114 ]
%134 = tail call i32 @strcmp(i8* %132, i8* %133)
%135 = icmp eq i32 %134, 0
br i1 %135, label %139, label %136
136: ; preds = %131
%137 = icmp slt i32 %134, 1
%138 = select i1 %137, i32 -1, i32 1
br label %147
139: ; preds = %131
store i8 %107, i8* %105
store i8 %108, i8* %106
%140 = load i8, i8* %105
%141 = icmp eq i8 %140, 0
br i1 %141, label %142, label %18
142: ; preds = %46, %139, %5
%143 = phi i8* [ %11, %5 ], [ %106, %139 ], [ %47, %46 ]
%144 = load i8, i8* %143
%145 = icmp ne i8 %144, 0
%146 = sext i1 %145 to i32
br label %147
147: ; preds = %18, %50, %129, %125, %104, %142, %2, %136, %112
%148 = phi i32 [ %113, %112 ], [ %138, %136 ], [ 0, %2 ], [ %146, %142 ], [ 1, %18 ], [ 1, %50 ], [ -1, %129 ], [ 1, %125 ], [ -1, %104 ]
ret i32 %148
}