#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 */
scalar_t__ is_digit(char);
scalar_t__ is_not_nzdigit(char);
int strcmp_natural_scan_forward(char const *, char const *);
int strcmp_natural_tiebroken(const char *s1, const char *s2) {
  char c1 = *(++s1);
  char c2 = *(++s2);
  while (is_not_nzdigit(c1) && is_not_nzdigit(c2)) {
  strcmp_natural_tiebroken_state_2:
    if (c1 != c2) {
      if ((c1 >= 'a') && (c1 <= 'z')) {
        c1 -= 32;
      }
      if ((c2 >= 'a') && (c2 <= 'z')) {
        c2 -= 32;
      }
      if (c1 < c2) {
        return -1;
      } else if (c1 > c2) {
        return 1;
      }
    } else if (!c1) {
      return -1;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  }
  if (is_not_nzdigit(c1) || is_not_nzdigit(c2)) {
    return (c1 < c2) ? -1 : 1;
  }
  do {
    if (c1 != c2) {
      if (is_digit(c2)) {
        if (c1 < c2) {
          return strcmp_natural_scan_forward(s1, s2);
        } else {
          return -strcmp_natural_scan_forward(s2, s1);
        }
      }
      return 1;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  } while (is_digit(c1));
  if (is_digit(c2)) {
    return -1;
  }
  goto strcmp_natural_tiebroken_state_2;
}


x86 assembly (clang, -O0):
<strcmp_natural_tiebroken>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x1a(%rbp)
movsbl -0x19(%rbp),%edi
call   1030 <is_not_nzdigit@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x1b(%rbp)
je     1198 <strcmp_natural_tiebroken+0x68>
movsbl -0x1a(%rbp),%edi
call   1030 <is_not_nzdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
test   $0x1,%al
jne    11a8 <strcmp_natural_tiebroken+0x78>
jmp    1291 <strcmp_natural_tiebroken+0x161>
jmp    11ad <strcmp_natural_tiebroken+0x7d>
movsbl -0x19(%rbp),%eax
movsbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
je     1247 <strcmp_natural_tiebroken+0x117>
movsbl -0x19(%rbp),%eax
cmp    $0x61,%eax
jl     11e1 <strcmp_natural_tiebroken+0xb1>
movsbl -0x19(%rbp),%eax
cmp    $0x7a,%eax
jg     11e1 <strcmp_natural_tiebroken+0xb1>
movsbl -0x19(%rbp),%eax
sub    $0x20,%eax
mov    %al,-0x19(%rbp)
movsbl -0x1a(%rbp),%eax
cmp    $0x61,%eax
jl     1205 <strcmp_natural_tiebroken+0xd5>
movsbl -0x1a(%rbp),%eax
cmp    $0x7a,%eax
jg     1205 <strcmp_natural_tiebroken+0xd5>
movsbl -0x1a(%rbp),%eax
sub    $0x20,%eax
mov    %al,-0x1a(%rbp)
movsbl -0x19(%rbp),%eax
movsbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jge    1221 <strcmp_natural_tiebroken+0xf1>
movl   $0xffffffff,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
movsbl -0x19(%rbp),%eax
movsbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jle    123d <strcmp_natural_tiebroken+0x10d>
movl   $0x1,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
jmp    1242 <strcmp_natural_tiebroken+0x112>
jmp    1262 <strcmp_natural_tiebroken+0x132>
cmpb   $0x0,-0x19(%rbp)
jne    125d <strcmp_natural_tiebroken+0x12d>
movl   $0xffffffff,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
jmp    1262 <strcmp_natural_tiebroken+0x132>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x1a(%rbp)
jmp    116a <strcmp_natural_tiebroken+0x3a>
movsbl -0x19(%rbp),%edi
call   1030 <is_not_nzdigit@plt>
cmp    $0x0,%rax
jne    12b7 <strcmp_natural_tiebroken+0x187>
movsbl -0x1a(%rbp),%edi
call   1030 <is_not_nzdigit@plt>
cmp    $0x0,%rax
je     12d6 <strcmp_natural_tiebroken+0x1a6>
movsbl -0x19(%rbp),%edx
movsbl -0x1a(%rbp),%esi
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
jmp    12db <strcmp_natural_tiebroken+0x1ab>
movsbl -0x19(%rbp),%eax
movsbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
je     134a <strcmp_natural_tiebroken+0x21a>
movsbl -0x1a(%rbp),%edi
call   1040 <is_digit@plt>
cmp    $0x0,%rax
je     133e <strcmp_natural_tiebroken+0x20e>
movsbl -0x19(%rbp),%eax
movsbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jge    1323 <strcmp_natural_tiebroken+0x1f3>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1050 <strcmp_natural_scan_forward@plt>
mov    %eax,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
mov    -0x18(%rbp),%rdi
mov    -0x10(%rbp),%rsi
call   1050 <strcmp_natural_scan_forward@plt>
mov    %eax,%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
movl   $0x1,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x1a(%rbp)
movsbl -0x19(%rbp),%edi
call   1040 <is_digit@plt>
cmp    $0x0,%rax
jne    12db <strcmp_natural_tiebroken+0x1ab>
movsbl -0x1a(%rbp),%edi
call   1040 <is_digit@plt>
cmp    $0x0,%rax
je     13a6 <strcmp_natural_tiebroken+0x276>
movl   $0xffffffff,-0x4(%rbp)
jmp    13ab <strcmp_natural_tiebroken+0x27b>
jmp    11ad <strcmp_natural_tiebroken+0x7d>
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strcmp_natural_tiebroken>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
mov    0x1(%r14),%r13b
add    $0x1,%r14
mov    0x1(%rbx),%bpl
add    $0x1,%rbx
movsbl %bpl,%r12d
mov    %r12d,%edi
call   1030 <is_not_nzdigit@plt>
movsbl %r13b,%r15d
test   %rax,%rax
je     1173 <strcmp_natural_tiebroken+0x43>
mov    %r15d,%edi
call   1030 <is_not_nzdigit@plt>
test   %rax,%rax
jne    11d6 <strcmp_natural_tiebroken+0xa6>
mov    %r12d,%edi
call   1030 <is_not_nzdigit@plt>
test   %rax,%rax
jne    1264 <strcmp_natural_tiebroken+0x134>
mov    %r15d,%edi
call   1030 <is_not_nzdigit@plt>
test   %rax,%rax
jne    1264 <strcmp_natural_tiebroken+0x134>
cs nopw 0x0(%rax,%rax,1)
nop
cmp    %r13b,%bpl
jne    1222 <strcmp_natural_tiebroken+0xf2>
movzbl 0x1(%rbx),%ebp
add    $0x1,%rbx
movzbl 0x1(%r14),%r13d
add    $0x1,%r14
movsbl %bpl,%edi
call   1040 <is_digit@plt>
test   %rax,%rax
jne    11a0 <strcmp_natural_tiebroken+0x70>
movsbl %r13b,%edi
call   1040 <is_digit@plt>
test   %rax,%rax
jne    1273 <strcmp_natural_tiebroken+0x143>
cmp    %r13b,%bpl
jne    11f0 <strcmp_natural_tiebroken+0xc0>
test   %bpl,%bpl
jne    1141 <strcmp_natural_tiebroken+0x11>
jmp    1273 <strcmp_natural_tiebroken+0x143>
nopl   0x0(%rax)
lea    -0x61(%rbp),%eax
lea    -0x20(%rbp),%ecx
cmp    $0x1a,%al
movzbl %bpl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
lea    -0x61(%r13),%eax
lea    -0x20(%r13),%edx
cmp    $0x1a,%al
movzbl %r13b,%eax
movzbl %dl,%edx
cmovae %eax,%edx
cmp    %dl,%cl
jl     1273 <strcmp_natural_tiebroken+0x143>
jle    1141 <strcmp_natural_tiebroken+0x11>
jmp    124e <strcmp_natural_tiebroken+0x11e>
movsbl %r13b,%edi
call   1040 <is_digit@plt>
test   %rax,%rax
je     124e <strcmp_natural_tiebroken+0x11e>
cmp    %r13b,%bpl
jge    1255 <strcmp_natural_tiebroken+0x125>
mov    %rbx,%rdi
mov    %r14,%rsi
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1050 <strcmp_natural_scan_forward@plt>
mov    $0x1,%eax
jmp    1278 <strcmp_natural_tiebroken+0x148>
mov    %r14,%rdi
mov    %rbx,%rsi
call   1050 <strcmp_natural_scan_forward@plt>
neg    %eax
jmp    1278 <strcmp_natural_tiebroken+0x148>
xor    %eax,%eax
cmp    %r13b,%bpl
setge  %al
add    %eax,%eax
add    $0xffffffff,%eax
jmp    1278 <strcmp_natural_tiebroken+0x148>
mov    $0xffffffff,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @strcmp_natural_tiebroken(i8* %0, i8* %1) {
br label %3
3: ; preds = %35, %2
%4 = phi i8* [ %0, %2 ], [ %16, %35 ]
%5 = phi i8* [ %1, %2 ], [ %17, %35 ]
%6 = getelementptr inbounds i8, i8* %5, i64 1
%7 = getelementptr inbounds i8, i8* %4, i64 1
%8 = load i8, i8* %6
%9 = load i8, i8* %7
%10 = tail call i64 @is_not_nzdigit(i8 signext %9)
%11 = icmp eq i64 %10, 0
br i1 %11, label %36, label %12
12: ; preds = %3
%13 = tail call i64 @is_not_nzdigit(i8 signext %8)
%14 = icmp eq i64 %13, 0
br i1 %14, label %36, label %15
15: ; preds = %68, %12
%16 = phi i8* [ %7, %12 ], [ %62, %68 ]
%17 = phi i8* [ %6, %12 ], [ %64, %68 ]
%18 = phi i8 [ %9, %12 ], [ %63, %68 ]
%19 = phi i8 [ %8, %12 ], [ %65, %68 ]
%20 = icmp eq i8 %18, %19
br i1 %20, label %33, label %21
21: ; preds = %15
%22 = add i8 %18, -97
%23 = icmp ult i8 %22, 26
%24 = add i8 %18, -32
%25 = select i1 %23, i8 %24, i8 %18
%26 = add i8 %19, -97
%27 = icmp ult i8 %26, 26
%28 = add i8 %19, -32
%29 = select i1 %27, i8 %28, i8 %19
%30 = icmp slt i8 %25, %29
br i1 %30, label %71, label %31
31: ; preds = %21
%32 = icmp sgt i8 %25, %29
br i1 %32, label %71, label %35
33: ; preds = %15
%34 = icmp eq i8 %18, 0
br i1 %34, label %71, label %35
35: ; preds = %33, %31
br label %3
36: ; preds = %3, %12
%37 = tail call i64 @is_not_nzdigit(i8 signext %9)
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %42
39: ; preds = %36
%40 = tail call i64 @is_not_nzdigit(i8 signext %8)
%41 = icmp eq i64 %40, 0
br i1 %41, label %45, label %42
42: ; preds = %39, %36
%43 = icmp slt i8 %9, %8
%44 = select i1 %43, i32 -1, i32 1
br label %71
45: ; preds = %39, %61
%46 = phi i8* [ %62, %61 ], [ %7, %39 ]
%47 = phi i8* [ %64, %61 ], [ %6, %39 ]
%48 = phi i8 [ %63, %61 ], [ %9, %39 ]
%49 = phi i8 [ %65, %61 ], [ %8, %39 ]
%50 = icmp eq i8 %48, %49
br i1 %50, label %61, label %51
51: ; preds = %45
%52 = tail call i64 @is_digit(i8 signext %49)
%53 = icmp eq i64 %52, 0
br i1 %53, label %71, label %54
54: ; preds = %51
%55 = icmp slt i8 %48, %49
br i1 %55, label %56, label %58
56: ; preds = %54
%57 = tail call i32 @strcmp_natural_scan_forward(i8* %46, i8* %47)
br label %71
58: ; preds = %54
%59 = tail call i32 @strcmp_natural_scan_forward(i8* %47, i8* %46)
%60 = sub nsw i32 0, %59
br label %71
61: ; preds = %45
%62 = getelementptr inbounds i8, i8* %46, i64 1
%63 = load i8, i8* %62
%64 = getelementptr inbounds i8, i8* %47, i64 1
%65 = load i8, i8* %64
%66 = tail call i64 @is_digit(i8 signext %63)
%67 = icmp eq i64 %66, 0
br i1 %67, label %68, label %45
68: ; preds = %61
%69 = tail call i64 @is_digit(i8 signext %65)
%70 = icmp eq i64 %69, 0
br i1 %70, label %15, label %71
71: ; preds = %68, %33, %31, %21, %51, %58, %56, %42
%72 = phi i32 [ %44, %42 ], [ %57, %56 ], [ %60, %58 ], [ 1, %51 ], [ -1, %68 ], [ -1, %33 ], [ 1, %31 ], [ -1, %21 ]
ret i32 %72
}