void caesar_cipher(char *input_string, int key) {
  while (*input_string) {
    if ((*input_string + key) > 'Z' && *input_string <= 'Z') {
      *input_string = *input_string - 'Z' + 'A' + key - 1;
    } else if ((*input_string + key) > 'z' && *input_string <= 'z') {
      *input_string = *input_string - 'z' + 'a' + key - 1;
    } else if ((*input_string + key) < 'A' && *input_string >= 'A') {
      *input_string = *input_string - 'A' + 'Z' + key + 1;
    } else if ((*input_string + key) < 'a' && *input_string >= 'a') {
      *input_string = *input_string - 'a' + 'z' + key + 1;
    } else if ((*input_string >= 'A' && *input_string <= 'Z') ||
               (*input_string >= 'a' && *input_string <= 'z')) {
      *input_string = *input_string + key;
    }
    input_string++;
  }
}


x86 assembly (clang, -O0):
<caesar_cipher>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
cmpb   $0x0,(%rax)
je     129b <caesar_cipher+0x19b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
add    -0xc(%rbp),%eax
cmp    $0x5a,%eax
jle    115b <caesar_cipher+0x5b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5a,%eax
jg     115b <caesar_cipher+0x5b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x5a,%eax
add    $0x41,%eax
add    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    128a <caesar_cipher+0x18a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
add    -0xc(%rbp),%eax
cmp    $0x7a,%eax
jle    119e <caesar_cipher+0x9e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7a,%eax
jg     119e <caesar_cipher+0x9e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x7a,%eax
add    $0x61,%eax
add    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1285 <caesar_cipher+0x185>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
add    -0xc(%rbp),%eax
cmp    $0x41,%eax
jge    11e1 <caesar_cipher+0xe1>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     11e1 <caesar_cipher+0xe1>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x41,%eax
add    $0x5a,%eax
add    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    1280 <caesar_cipher+0x180>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
add    -0xc(%rbp),%eax
cmp    $0x61,%eax
jge    1224 <caesar_cipher+0x124>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1224 <caesar_cipher+0x124>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x61,%eax
add    $0x7a,%eax
add    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    127b <caesar_cipher+0x17b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     1244 <caesar_cipher+0x144>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5a,%eax
jle    1264 <caesar_cipher+0x164>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1276 <caesar_cipher+0x176>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7a,%eax
jg     1276 <caesar_cipher+0x176>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
add    -0xc(%rbp),%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    127b <caesar_cipher+0x17b>
jmp    1280 <caesar_cipher+0x180>
jmp    1285 <caesar_cipher+0x185>
jmp    128a <caesar_cipher+0x18a>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    110b <caesar_cipher+0xb>
pop    %rbp
ret

x86 assembly (clang, -O2):
<caesar_cipher>:
mov    (%rdi),%al
test   %al,%al
je     1172 <caesar_cipher+0x72>
add    $0x1,%rdi
nopw   0x0(%rax,%rax,1)
movsbl %al,%ecx
add    %esi,%ecx
cmp    $0x5b,%ecx
jl     111e <caesar_cipher+0x1e>
cmp    $0x5a,%al
jle    1127 <caesar_cipher+0x27>
cmp    $0x7b,%ecx
jl     1130 <caesar_cipher+0x30>
cmp    $0x7a,%al
jg     1130 <caesar_cipher+0x30>
add    %sil,%al
add    $0xe6,%al
jmp    1150 <caesar_cipher+0x50>
xchg   %ax,%ax
cmp    $0x40,%ecx
jg     1139 <caesar_cipher+0x39>
cmp    $0x41,%al
jge    1142 <caesar_cipher+0x42>
cmp    $0x60,%ecx
jg     1160 <caesar_cipher+0x60>
cmp    $0x61,%al
jl     1160 <caesar_cipher+0x60>
add    %sil,%al
add    $0x1a,%al
nopw   0x0(%rax,%rax,1)
mov    %al,-0x1(%rdi)
movzbl (%rdi),%eax
add    $0x1,%rdi
test   %al,%al
jne    1110 <caesar_cipher+0x10>
jmp    1172 <caesar_cipher+0x72>
mov    %eax,%ecx
and    $0xdf,%cl
add    $0xbf,%cl
cmp    $0x19,%cl
ja     1153 <caesar_cipher+0x53>
add    %sil,%al
jmp    1150 <caesar_cipher+0x50>
ret

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

LLVM IR (-O2):
define void @caesar_cipher(i8* nocapture %0, i32 %1) {
%3 = load i8, i8* %0
%4 = icmp eq i8 %3, 0
br i1 %4, label %51, label %5
5: ; preds = %2
%6 = trunc i32 %1 to i8
br label %7
7: ; preds = %5, %47
%8 = phi i8 [ %3, %5 ], [ %49, %47 ]
%9 = phi i8* [ %0, %5 ], [ %48, %47 ]
%10 = sext i8 %8 to i32
%11 = add nsw i32 %10, %1
%12 = icmp sgt i32 %11, 90
%13 = icmp slt i8 %8, 91
%14 = select i1 %12, i1 %13, i1 false
br i1 %14, label %15, label %18
15: ; preds = %7
%16 = add i8 %8, %6
%17 = add i8 %16, -26
br label %45
18: ; preds = %7
%19 = icmp sgt i32 %11, 122
%20 = icmp slt i8 %8, 123
%21 = select i1 %19, i1 %20, i1 false
br i1 %21, label %22, label %25
22: ; preds = %18
%23 = add i8 %8, %6
%24 = add i8 %23, -26
br label %45
25: ; preds = %18
%26 = icmp slt i32 %11, 65
%27 = icmp sgt i8 %8, 64
%28 = select i1 %26, i1 %27, i1 false
br i1 %28, label %29, label %32
29: ; preds = %25
%30 = add i8 %8, %6
%31 = add i8 %30, 26
br label %45
32: ; preds = %25
%33 = icmp slt i32 %11, 97
%34 = icmp sgt i8 %8, 96
%35 = select i1 %33, i1 %34, i1 false
br i1 %35, label %36, label %39
36: ; preds = %32
%37 = add i8 %8, %6
%38 = add i8 %37, 26
br label %45
39: ; preds = %32
%40 = and i8 %8, -33
%41 = add i8 %40, -65
%42 = icmp ult i8 %41, 26
br i1 %42, label %43, label %47
43: ; preds = %39
%44 = add i8 %8, %6
br label %45
45: ; preds = %15, %29, %43, %36, %22
%46 = phi i8 [ %24, %22 ], [ %38, %36 ], [ %44, %43 ], [ %31, %29 ], [ %17, %15 ]
store i8 %46, i8* %9
br label %47
47: ; preds = %45, %39
%48 = getelementptr inbounds i8, i8* %9, i64 1
%49 = load i8, i8* %48
%50 = icmp eq i8 %49, 0
br i1 %50, label %51, label %7
51: ; preds = %47, %2
ret void
}