int whatIs(char c, int n) {
  if (c >= 97 && c <= 122) {
    if ((c + n) > 122)
      c = 97 + (n - (123 - c));
    else
      c += n;
  } else if (c >= 65 && c <= 90) {
    if ((c + n) > 90)
      c = 65 + (n - (91 - 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     1163 <whatIs+0x63>
movsbl -0x1(%rbp),%eax
cmp    $0x7a,%eax
jg     1163 <whatIs+0x63>
movsbl -0x1(%rbp),%eax
add    -0x8(%rbp),%eax
cmp    $0x7a,%eax
jle    1152 <whatIs+0x52>
mov    -0x8(%rbp),%eax
movsbl -0x1(%rbp),%edx
mov    $0x7b,%ecx
sub    %edx,%ecx
sub    %ecx,%eax
add    $0x61,%eax
mov    %al,-0x1(%rbp)
jmp    115e <whatIs+0x5e>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    11be <whatIs+0xbe>
movsbl -0x1(%rbp),%eax
cmp    $0x41,%eax
jl     11b9 <whatIs+0xb9>
movsbl -0x1(%rbp),%eax
cmp    $0x5a,%eax
jg     11b9 <whatIs+0xb9>
movsbl -0x1(%rbp),%eax
add    -0x8(%rbp),%eax
cmp    $0x5a,%eax
jle    11a8 <whatIs+0xa8>
mov    -0x8(%rbp),%eax
movsbl -0x1(%rbp),%edx
mov    $0x5b,%ecx
sub    %edx,%ecx
sub    %ecx,%eax
add    $0x41,%eax
mov    %al,-0x1(%rbp)
jmp    11b4 <whatIs+0xb4>
mov    -0x8(%rbp),%ecx
movsbl -0x1(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x1(%rbp)
jmp    11b9 <whatIs+0xb9>
jmp    11be <whatIs+0xbe>
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<whatIs>:
mov    %edi,%eax
lea    -0x61(%rax),%ecx
cmp    $0x19,%cl
ja     111e <whatIs+0x1e>
add    %esi,%edi
cmp    $0x7b,%edi
jl     112d <whatIs+0x2d>
add    %al,%sil
add    $0xe6,%sil
mov    %esi,%eax
movsbl %al,%eax
ret
lea    -0x41(%rax),%ecx
cmp    $0x19,%cl
ja     112f <whatIs+0x2f>
add    %esi,%edi
cmp    $0x5b,%edi
jge    1111 <whatIs+0x11>
mov    %edi,%eax
movsbl %al,%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 = add nsw i32 %14, %15
%17 = icmp sgt i32 %16, 122
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 123, %21
%23 = sub nsw i32 %19, %22
%24 = add nsw i32 97, %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 = add 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 = add nsw i32 %43, %44
%46 = icmp sgt i32 %45, 90
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 91, %50
%52 = sub nsw i32 %48, %51
%53 = add nsw i32 65, %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 = add 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 %15
6: ; preds = %2
%7 = add nsw i32 %3, %1
%8 = icmp sgt i32 %7, 122
br i1 %8, label %9, label %13
9: ; preds = %6
%10 = trunc i32 %1 to i8
%11 = add i8 %10, %0
%12 = add i8 %11, -26
br label %27
13: ; preds = %6
%14 = trunc i32 %7 to i8
br label %27
15: ; preds = %2
%16 = add i8 %0, -65
%17 = icmp ult i8 %16, 26
br i1 %17, label %18, label %27
18: ; preds = %15
%19 = add nsw i32 %3, %1
%20 = icmp sgt i32 %19, 90
br i1 %20, label %21, label %25
21: ; preds = %18
%22 = trunc i32 %1 to i8
%23 = add i8 %22, %0
%24 = add i8 %23, -26
br label %27
25: ; preds = %18
%26 = trunc i32 %19 to i8
br label %27
27: ; preds = %15, %25, %21, %9, %13
%28 = phi i8 [ %12, %9 ], [ %14, %13 ], [ %24, %21 ], [ %26, %25 ], [ %0, %15 ]
%29 = sext i8 %28 to i32
ret i32 %29
}