#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__ islower(char);
scalar_t__ isspace(char);
char toupper(char);
int pgx_same_string(char *s1, char *s2) {
  if (s1 == NULL || s2 == NULL)
    return s1 == NULL && s2 == NULL;
  while (*s1 && isspace(*s1))
    s1++;
  while (*s2 && isspace(*s2))
    s2++;
  while (*s1 && *s2 &&
         (islower(*s1) ? toupper(*s1) : *s1) ==
             (islower(*s2) ? toupper(*s2) : *s2)) {
    s1++;
    s2++;
  };
  while (*s1 && isspace(*s1))
    s1++;
  while (*s2 && isspace(*s2))
    s2++;
  return (*s1 == '\0' && *s2 == '\0');
}


x86 assembly (clang, -O0):
<pgx_same_string>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1156 <pgx_same_string+0x26>
cmpq   $0x0,-0x18(%rbp)
jne    1181 <pgx_same_string+0x51>
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x19(%rbp)
jne    1171 <pgx_same_string+0x41>
cmpq   $0x0,-0x18(%rbp)
sete   %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    13d3 <pgx_same_string+0x2a3>
jmp    1186 <pgx_same_string+0x56>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1a(%rbp)
je     11b1 <pgx_same_string+0x81>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
test   $0x1,%al
jne    11c1 <pgx_same_string+0x91>
jmp    11d2 <pgx_same_string+0xa2>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1186 <pgx_same_string+0x56>
jmp    11d7 <pgx_same_string+0xa7>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1b(%rbp)
je     1202 <pgx_same_string+0xd2>
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
test   $0x1,%al
jne    1212 <pgx_same_string+0xe2>
jmp    1223 <pgx_same_string+0xf3>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    11d7 <pgx_same_string+0xa7>
jmp    1228 <pgx_same_string+0xf8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1c(%rbp)
je     12d4 <pgx_same_string+0x1a4>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1c(%rbp)
je     12d4 <pgx_same_string+0x1a4>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <islower@plt>
cmp    $0x0,%rax
je     127f <pgx_same_string+0x14f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1040 <toupper@plt>
movsbl %al,%eax
mov    %eax,-0x20(%rbp)
jmp    1289 <pgx_same_string+0x159>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1030 <islower@plt>
cmp    $0x0,%rax
je     12bc <pgx_same_string+0x18c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1040 <toupper@plt>
movsbl %al,%eax
mov    %eax,-0x28(%rbp)
jmp    12c6 <pgx_same_string+0x196>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%al
test   $0x1,%al
jne    12e4 <pgx_same_string+0x1b4>
jmp    1301 <pgx_same_string+0x1d1>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1228 <pgx_same_string+0xf8>
jmp    1306 <pgx_same_string+0x1d6>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x29(%rbp)
je     1331 <pgx_same_string+0x201>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    1341 <pgx_same_string+0x211>
jmp    1352 <pgx_same_string+0x222>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1306 <pgx_same_string+0x1d6>
jmp    1357 <pgx_same_string+0x227>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2a(%rbp)
je     1382 <pgx_same_string+0x252>
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
test   $0x1,%al
jne    1392 <pgx_same_string+0x262>
jmp    13a3 <pgx_same_string+0x273>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1357 <pgx_same_string+0x227>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2b(%rbp)
jne    13c8 <pgx_same_string+0x298>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
sete   %al
mov    %al,-0x2b(%rbp)
mov    -0x2b(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pgx_same_string>:
push   %rbp
push   %r14
push   %rbx
mov    %rsi,%rbx
mov    %rdi,%r14
test   %rdi,%rdi
je     11f4 <pgx_same_string+0xc4>
test   %rbx,%rbx
je     11f4 <pgx_same_string+0xc4>
mov    (%r14),%al
test   %al,%al
je     117a <pgx_same_string+0x4a>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     117a <pgx_same_string+0x4a>
movzbl 0x1(%r14),%eax
add    $0x1,%r14
test   %al,%al
jne    1160 <pgx_same_string+0x30>
mov    (%rbx),%al
test   %al,%al
je     1199 <pgx_same_string+0x69>
movsbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     1199 <pgx_same_string+0x69>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1180 <pgx_same_string+0x50>
mov    (%r14),%al
test   %al,%al
je     1217 <pgx_same_string+0xe7>
cmpb   $0x0,(%rbx)
je     1200 <pgx_same_string+0xd0>
movsbl %al,%edi
call   1030 <islower@plt>
movzbl (%r14),%ebp
test   %rax,%rax
je     11c1 <pgx_same_string+0x91>
movsbl %bpl,%edi
call   1040 <toupper@plt>
mov    %eax,%ebp
movsbl (%rbx),%edi
call   1030 <islower@plt>
mov    %rax,%rcx
movzbl (%rbx),%eax
test   %rcx,%rcx
je     11dc <pgx_same_string+0xac>
movsbl %al,%edi
call   1040 <toupper@plt>
cmp    %al,%bpl
jne    11f9 <pgx_same_string+0xc9>
add    $0x1,%rbx
movzbl 0x1(%r14),%eax
add    $0x1,%r14
test   %al,%al
jne    11a0 <pgx_same_string+0x70>
jmp    1217 <pgx_same_string+0xe7>
or     %rbx,%r14
jmp    1246 <pgx_same_string+0x116>
mov    (%r14),%al
test   %al,%al
je     1217 <pgx_same_string+0xe7>
movsbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     1217 <pgx_same_string+0xe7>
mov    0x1(%r14),%al
add    $0x1,%r14
jmp    11fc <pgx_same_string+0xcc>
mov    (%rbx),%al
test   %al,%al
je     1239 <pgx_same_string+0x109>
nopl   (%rax)
movsbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     1239 <pgx_same_string+0x109>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1220 <pgx_same_string+0xf0>
cmpb   $0x0,(%r14)
je     1243 <pgx_same_string+0x113>
xor    %eax,%eax
jmp    1249 <pgx_same_string+0x119>
cmpb   $0x0,(%rbx)
sete   %al
movzbl %al,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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