#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 */
short string__Char__is_alpha(char);
short string__Char__is_numeric(char);
short int string__Char__is_alphanumeric(char self) {
  short int var;
  short int var1;
  short int var2;
  short int var_;
  short int var3;
  short int var4;
  short int var5;
  var2 = string__Char__is_numeric(self);
  var_ = var2;
  if (var2) {
    var1 = var_;
  } else {
    var3 = string__Char__is_alpha(self);
    var1 = var3;
  }
  if (var1) {
    var4 = 1;
    var = var4;
    goto RET_LABEL;
  } else {
  }
  var5 = 0;
  var = var5;
  goto RET_LABEL;
RET_LABEL:;
  return var;
}


x86 assembly (clang, -O0):
<string__Char__is_alphanumeric>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%edi
call   1030 <string__Char__is_numeric@plt>
mov    %ax,-0x8(%rbp)
mov    -0x8(%rbp),%ax
mov    %ax,-0xa(%rbp)
cmpw   $0x0,-0x8(%rbp)
je     115b <string__Char__is_alphanumeric+0x3b>
mov    -0xa(%rbp),%ax
mov    %ax,-0x6(%rbp)
jmp    1170 <string__Char__is_alphanumeric+0x50>
movsbl -0x1(%rbp),%edi
call   1040 <string__Char__is_alpha@plt>
mov    %ax,-0xc(%rbp)
mov    -0xc(%rbp),%ax
mov    %ax,-0x6(%rbp)
cmpw   $0x0,-0x6(%rbp)
je     118e <string__Char__is_alphanumeric+0x6e>
movw   $0x1,-0xe(%rbp)
mov    -0xe(%rbp),%ax
mov    %ax,-0x4(%rbp)
jmp    11a1 <string__Char__is_alphanumeric+0x81>
jmp    1193 <string__Char__is_alphanumeric+0x73>
movw   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%ax
mov    %ax,-0x4(%rbp)
movswl -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string__Char__is_alphanumeric>:
push   %rbx
mov    %edi,%ebx
call   1030 <string__Char__is_numeric@plt>
mov    %eax,%ecx
mov    $0x1,%ax
test   %cx,%cx
je     1135 <string__Char__is_alphanumeric+0x15>
pop    %rbx
ret
movsbl %bl,%edi
call   1040 <string__Char__is_alpha@plt>
mov    %eax,%ecx
xor    %eax,%eax
test   %cx,%cx
setne  %al
pop    %rbx
ret

LLVM IR (-O0):
define signext i16 @string__Char__is_alphanumeric(i8 signext %0) {
%2 = alloca i8
%3 = alloca i16
%4 = alloca i16
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
store i8 %0, i8* %2
%10 = load i8, i8* %2
%11 = call signext i16 @string__Char__is_numeric(i8 signext %10)
store i16 %11, i16* %5
%12 = load i16, i16* %5
store i16 %12, i16* %6
%13 = load i16, i16* %5
%14 = icmp ne i16 %13, 0
br i1 %14, label %15, label %17
15: ; preds = %1
%16 = load i16, i16* %6
store i16 %16, i16* %4
br label %21
17: ; preds = %1
%18 = load i8, i8* %2
%19 = call signext i16 @string__Char__is_alpha(i8 signext %18)
store i16 %19, i16* %7
%20 = load i16, i16* %7
store i16 %20, i16* %4
br label %21
21: ; preds = %17, %15
%22 = load i16, i16* %4
%23 = icmp ne i16 %22, 0
br i1 %23, label %24, label %26
24: ; preds = %21
store i16 1, i16* %8
%25 = load i16, i16* %8
store i16 %25, i16* %3
br label %29
26: ; preds = %21
br label %27
27: ; preds = %26
store i16 0, i16* %9
%28 = load i16, i16* %9
store i16 %28, i16* %3
br label %29
29: ; preds = %27, %24
%30 = load i16, i16* %3
ret i16 %30
}

LLVM IR (-O2):
define signext i16 @string__Char__is_alphanumeric(i8 signext %0) {
%2 = tail call signext i16 @string__Char__is_numeric(i8 signext %0)
%3 = icmp eq i16 %2, 0
br i1 %3, label %4, label %8
4: ; preds = %1
%5 = tail call signext i16 @string__Char__is_alpha(i8 signext %0)
%6 = icmp ne i16 %5, 0
%7 = zext i1 %6 to i16
br label %8
8: ; preds = %4, %1
%9 = phi i16 [ 1, %1 ], [ %7, %4 ]
ret i16 %9
}