#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 */
typedef int wchar_t;

/* Variables and functions */
wchar_t *wcschr(const wchar_t *wcs, const wchar_t wc) {
  const wchar_t *wcs2 = wcs + 1;
  if (*wcs == wc)
    return (wchar_t *)wcs;
  if (*wcs == L'\0')
    return NULL;
  do {
    wcs += 2;
    if (*wcs2 == wc)
      return (wchar_t *)wcs2;
    if (*wcs2 == L'\0')
      return NULL;
    wcs2 += 2;
    if (*wcs == wc)
      return (wchar_t *)wcs;
    if (*wcs == L'\0')
      return NULL;
    wcs += 2;
    if (*wcs2 == wc)
      return (wchar_t *)wcs2;
    if (*wcs2 == L'\0')
      return NULL;
    wcs2 += 2;
    if (*wcs == wc)
      return (wchar_t *)wcs;
    if (*wcs == L'\0')
      return NULL;
    wcs += 2;
    if (*wcs2 == wc)
      return (wchar_t *)wcs2;
    if (*wcs2 == L'\0')
      return NULL;
    wcs2 += 2;
    if (*wcs == wc)
      return (wchar_t *)wcs;
    if (*wcs == L'\0')
      return NULL;
    wcs += 2;
    if (*wcs2 == wc)
      return (wchar_t *)wcs2;
    if (*wcs2 == L'\0')
      return NULL;
    wcs2 += 2;
    if (*wcs == wc)
      return (wchar_t *)wcs;
  } while (*wcs != L'\0');
  return NULL;
}


x86 assembly (clang, -O0):
<wcschr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    1133 <wcschr+0x33>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    114d <wcschr+0x4d>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
jmp    1152 <wcschr+0x52>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    117a <wcschr+0x7a>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1194 <wcschr+0x94>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    11bc <wcschr+0xbc>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    11d6 <wcschr+0xd6>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    11fe <wcschr+0xfe>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1218 <wcschr+0x118>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    1240 <wcschr+0x140>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    125a <wcschr+0x15a>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    1282 <wcschr+0x182>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jne    129c <wcschr+0x19c>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    12c4 <wcschr+0x1c4>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    12de <wcschr+0x1de>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    1306 <wcschr+0x206>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1320 <wcschr+0x220>
movq   $0x0,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jne    1348 <wcschr+0x248>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1362 <wcschr+0x262>
jmp    134d <wcschr+0x24d>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1152 <wcschr+0x52>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<wcschr>:
mov    %rdi,%rax
mov    (%rdi),%ecx
cmp    %esi,%ecx
je     11a9 <wcschr+0xa9>
test   %ecx,%ecx
je     117b <wcschr+0x7b>
mov    %rax,%rcx
add    $0x20,%rcx
xor    %eax,%eax
mov    -0x1c(%rcx),%edx
cmp    %esi,%edx
je     117e <wcschr+0x7e>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0x18(%rcx),%edx
cmp    %esi,%edx
je     1184 <wcschr+0x84>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0x14(%rcx),%edx
cmp    %esi,%edx
je     118a <wcschr+0x8a>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0x10(%rcx),%edx
cmp    %esi,%edx
je     1190 <wcschr+0x90>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0xc(%rcx),%edx
cmp    %esi,%edx
je     1196 <wcschr+0x96>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0x8(%rcx),%edx
cmp    %esi,%edx
je     119c <wcschr+0x9c>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    -0x4(%rcx),%edx
cmp    %esi,%edx
je     11a2 <wcschr+0xa2>
test   %edx,%edx
je     11a9 <wcschr+0xa9>
mov    (%rcx),%edx
cmp    %esi,%edx
je     11a6 <wcschr+0xa6>
add    $0x20,%rcx
test   %edx,%edx
jne    111a <wcschr+0x1a>
jmp    11a9 <wcschr+0xa9>
xor    %eax,%eax
ret
add    $0xffffffffffffffe4,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xffffffffffffffe8,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xffffffffffffffec,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xfffffffffffffff0,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xfffffffffffffff4,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xfffffffffffffff8,%rcx
jmp    11a6 <wcschr+0xa6>
add    $0xfffffffffffffffc,%rcx
mov    %rcx,%rax
ret

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

LLVM IR (-O2):
define i32* @wcschr(i32* %0, i32 %1) {
%3 = load i32, i32* %0
%4 = icmp eq i32 %3, %1
br i1 %4, label %59, label %5
5: ; preds = %2
%6 = icmp eq i32 %3, 0
br i1 %6, label %59, label %7
7: ; preds = %5
%8 = getelementptr inbounds i32, i32* %0, i64 1
br label %9
9: ; preds = %7, %56
%10 = phi i32* [ %48, %56 ], [ %0, %7 ]
%11 = phi i32* [ %57, %56 ], [ %8, %7 ]
%12 = getelementptr inbounds i32, i32* %10, i64 2
%13 = load i32, i32* %11
%14 = icmp eq i32 %13, %1
br i1 %14, label %59, label %15
15: ; preds = %9
%16 = icmp eq i32 %13, 0
br i1 %16, label %59, label %17
17: ; preds = %15
%18 = getelementptr inbounds i32, i32* %11, i64 2
%19 = load i32, i32* %12
%20 = icmp eq i32 %19, %1
br i1 %20, label %59, label %21
21: ; preds = %17
%22 = icmp eq i32 %19, 0
br i1 %22, label %59, label %23
23: ; preds = %21
%24 = getelementptr inbounds i32, i32* %10, i64 4
%25 = load i32, i32* %18
%26 = icmp eq i32 %25, %1
br i1 %26, label %59, label %27
27: ; preds = %23
%28 = icmp eq i32 %25, 0
br i1 %28, label %59, label %29
29: ; preds = %27
%30 = getelementptr inbounds i32, i32* %11, i64 4
%31 = load i32, i32* %24
%32 = icmp eq i32 %31, %1
br i1 %32, label %59, label %33
33: ; preds = %29
%34 = icmp eq i32 %31, 0
br i1 %34, label %59, label %35
35: ; preds = %33
%36 = getelementptr inbounds i32, i32* %10, i64 6
%37 = load i32, i32* %30
%38 = icmp eq i32 %37, %1
br i1 %38, label %59, label %39
39: ; preds = %35
%40 = icmp eq i32 %37, 0
br i1 %40, label %59, label %41
41: ; preds = %39
%42 = getelementptr inbounds i32, i32* %11, i64 6
%43 = load i32, i32* %36
%44 = icmp eq i32 %43, %1
br i1 %44, label %59, label %45
45: ; preds = %41
%46 = icmp eq i32 %43, 0
br i1 %46, label %59, label %47
47: ; preds = %45
%48 = getelementptr inbounds i32, i32* %10, i64 8
%49 = load i32, i32* %42
%50 = icmp eq i32 %49, %1
br i1 %50, label %59, label %51
51: ; preds = %47
%52 = icmp eq i32 %49, 0
br i1 %52, label %59, label %53
53: ; preds = %51
%54 = load i32, i32* %48
%55 = icmp eq i32 %54, %1
br i1 %55, label %59, label %56
56: ; preds = %53
%57 = getelementptr inbounds i32, i32* %11, i64 8
%58 = icmp eq i32 %54, 0
br i1 %58, label %59, label %9
59: ; preds = %56, %53, %51, %47, %45, %41, %39, %35, %33, %29, %27, %23, %21, %17, %15, %9, %5, %2
%60 = phi i32* [ %0, %2 ], [ null, %5 ], [ null, %56 ], [ %48, %53 ], [ null, %51 ], [ %42, %47 ], [ null, %45 ], [ %36, %41 ], [ null, %39 ], [ %30, %35 ], [ null, %33 ], [ %24, %29 ], [ null, %27 ], [ %18, %23 ], [ null, %21 ], [ %12, %17 ], [ null, %15 ], [ %11, %9 ]
ret i32* %60
}