int whatIs(char c, int n) {
  if (c >= 97 && c <= 122) {
    if ((c - n) < 97)
      c = 122 - (n + (96 - c));
    else
      c -= n;
  } else if (c >= 65 && c <= 90) {
    if ((c - n) < 65)
      c = 90 - (n + (64 - c));
    else
      c -= n;
  }
  return (c);
}


x86 assembly (clang, -O0):
<whatIs>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
mov    %esi,-0x8(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
jl     1167 <whatIs+0x67>
movsbl -0x1(%rbp),%eax
cmp    $0x7a,%eax
jg     1167 <whatIs+0x67>
movsbl -0x1(%rbp),%eax
sub    -0x8(%rbp),%eax
cmp    $0x61,%eax
jge    1156 <whatIs+0x56>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%edx
mov    $0x60,%eax
sub    %edx,%eax
add    %eax,%ecx
mov    $0x7a,%eax
sub    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    1162 <whatIs+0x62>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%eax
sub    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    11c6 <whatIs+0xc6>
movsbl -0x1(%rbp),%eax
cmp    $0x41,%eax
jl     11c1 <whatIs+0xc1>
movsbl -0x1(%rbp),%eax
cmp    $0x5a,%eax
jg     11c1 <whatIs+0xc1>
movsbl -0x1(%rbp),%eax
sub    -0x8(%rbp),%eax
cmp    $0x41,%eax
jge    11b0 <whatIs+0xb0>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%edx
mov    $0x40,%eax
sub    %edx,%eax
add    %eax,%ecx
mov    $0x5a,%eax
sub    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    11bc <whatIs+0xbc>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%eax
sub    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    11c1 <whatIs+0xc1>
jmp    11c6 <whatIs+0xc6>
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<whatIs>:
lea    -0x61(%rdi),%eax
cmp    $0x19,%al
ja     111d <whatIs+0x1d>
mov    %edi,%eax
sub    %esi,%eax
cmp    $0x60,%eax
jg     112d <whatIs+0x2d>
sub    %edi,%esi
mov    $0x1a,%dil
sub    %sil,%dil
movsbl %dil,%eax
ret
lea    -0x41(%rdi),%eax
cmp    $0x19,%al
ja     112f <whatIs+0x2f>
mov    %edi,%eax
sub    %esi,%eax
cmp    $0x40,%eax
jle    1110 <whatIs+0x10>
mov    %eax,%edi
movsbl %dil,%eax
ret

LLVM IR (-O0):
define i32 @whatIs(i8 signext %0, i32 %1) {
%3 = alloca i8
%4 = alloca i32
store i8 %0, i8* %3
store i32 %1, i32* %4
%5 = load i8, i8* %3
%6 = sext i8 %5 to i32
%7 = icmp sge i32 %6, 97
br i1 %7, label %8, label %33
8: ; preds = %2
%9 = load i8, i8* %3
%10 = sext i8 %9 to i32
%11 = icmp sle i32 %10, 122
br i1 %11, label %12, label %33
12: ; preds = %8
%13 = load i8, i8* %3
%14 = sext i8 %13 to i32
%15 = load i32, i32* %4
%16 = sub nsw i32 %14, %15
%17 = icmp slt i32 %16, 97
br i1 %17, label %18, label %26
18: ; preds = %12
%19 = load i32, i32* %4
%20 = load i8, i8* %3
%21 = sext i8 %20 to i32
%22 = sub nsw i32 96, %21
%23 = add nsw i32 %19, %22
%24 = sub nsw i32 122, %23
%25 = trunc i32 %24 to i8
store i8 %25, i8* %3
br label %32
26: ; preds = %12
%27 = load i32, i32* %4
%28 = load i8, i8* %3
%29 = sext i8 %28 to i32
%30 = sub nsw i32 %29, %27
%31 = trunc i32 %30 to i8
store i8 %31, i8* %3
br label %32
32: ; preds = %26, %18
br label %63
33: ; preds = %8, %2
%34 = load i8, i8* %3
%35 = sext i8 %34 to i32
%36 = icmp sge i32 %35, 65
br i1 %36, label %37, label %62
37: ; preds = %33
%38 = load i8, i8* %3
%39 = sext i8 %38 to i32
%40 = icmp sle i32 %39, 90
br i1 %40, label %41, label %62
41: ; preds = %37
%42 = load i8, i8* %3
%43 = sext i8 %42 to i32
%44 = load i32, i32* %4
%45 = sub nsw i32 %43, %44
%46 = icmp slt i32 %45, 65
br i1 %46, label %47, label %55
47: ; preds = %41
%48 = load i32, i32* %4
%49 = load i8, i8* %3
%50 = sext i8 %49 to i32
%51 = sub nsw i32 64, %50
%52 = add nsw i32 %48, %51
%53 = sub nsw i32 90, %52
%54 = trunc i32 %53 to i8
store i8 %54, i8* %3
br label %61
55: ; preds = %41
%56 = load i32, i32* %4
%57 = load i8, i8* %3
%58 = sext i8 %57 to i32
%59 = sub nsw i32 %58, %56
%60 = trunc i32 %59 to i8
store i8 %60, i8* %3
br label %61
61: ; preds = %55, %47
br label %62
62: ; preds = %61, %37, %33
br label %63
63: ; preds = %62, %32
%64 = load i8, i8* %3
%65 = sext i8 %64 to i32
ret i32 %65
}

LLVM IR (-O2):
define i32 @whatIs(i8 signext %0, i32 %1) {
%3 = sext i8 %0 to i32
%4 = add i8 %0, -97
%5 = icmp ult i8 %4, 26
br i1 %5, label %6, label %16
6: ; preds = %2
%7 = sub nsw i32 %3, %1
%8 = icmp slt i32 %7, 97
br i1 %8, label %9, label %14
9: ; preds = %6
%10 = sub nsw i32 96, %3
%11 = add nsw i32 %10, %1
%12 = trunc i32 %11 to i8
%13 = sub i8 122, %12
br label %29
14: ; preds = %6
%15 = trunc i32 %7 to i8
br label %29
16: ; preds = %2
%17 = add i8 %0, -65
%18 = icmp ult i8 %17, 26
br i1 %18, label %19, label %29
19: ; preds = %16
%20 = sub nsw i32 %3, %1
%21 = icmp slt i32 %20, 65
br i1 %21, label %22, label %27
22: ; preds = %19
%23 = sub nsw i32 64, %3
%24 = add nsw i32 %23, %1
%25 = trunc i32 %24 to i8
%26 = sub i8 90, %25
br label %29
27: ; preds = %19
%28 = trunc i32 %20 to i8
br label %29
29: ; preds = %16, %27, %22, %9, %14
%30 = phi i8 [ %13, %9 ], [ %15, %14 ], [ %26, %22 ], [ %28, %27 ], [ %0, %16 ]
%31 = sext i8 %30 to i32
ret i32 %31
}