char *cmdLowerCase(char *s) {
  int i = 0;
  while (s[i] != '\0') {
    switch (s[i]) {
    case 'A':
      s[i] = 'a';
      break;
    case 'B':
      s[i] = 'b';
      break;
    case 'C':
      s[i] = 'c';
      break;
    case 'D':
      s[i] = 'd';
      break;
    case 'E':
      s[i] = 'e';
      break;
    case 'F':
      s[i] = 'f';
      break;
    case 'G':
      s[i] = 'g';
      break;
    case 'H':
      s[i] = 'h';
      break;
    case 'I':
      s[i] = 'i';
      break;
    case 'J':
      s[i] = 'j';
      break;
    case 'K':
      s[i] = 'k';
      break;
    case 'L':
      s[i] = 'l';
      break;
    case 'M':
      s[i] = 'm';
      break;
    case 'N':
      s[i] = 'n';
      break;
    case 'O':
      s[i] = 'o';
      break;
    case 'P':
      s[i] = 'p';
      break;
    case 'Q':
      s[i] = 'q';
      break;
    case 'R':
      s[i] = 'r';
      break;
    case 'S':
      s[i] = 's';
      break;
    case 'T':
      s[i] = 't';
      break;
    case 'U':
      s[i] = 'u';
      break;
    case 'V':
      s[i] = 'v';
      break;
    case 'W':
      s[i] = 'w';
      break;
    case 'X':
      s[i] = 'x';
      break;
    case 'Y':
      s[i] = 'y';
      break;
    case 'Z':
      s[i] = 'z';
      break;
    default:
      break;
    }
    ++i;
  }
  return s;
}


x86 assembly (clang, -O0):
<cmdLowerCase>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1323 <cmdLowerCase+0x223>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffbf,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x19,%eax
ja     1310 <cmdLowerCase+0x210>
mov    -0x18(%rbp),%rax
lea    0xeb3(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x61,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x62,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x63,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x64,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x65,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x66,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x67,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x68,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x69,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6a,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6b,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6c,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6d,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6e,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x6f,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x70,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x71,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x72,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x73,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x74,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x75,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x76,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x77,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x78,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x79,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x7a,(%rax,%rcx,1)
jmp    1315 <cmdLowerCase+0x215>
jmp    1315 <cmdLowerCase+0x215>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    110f <cmdLowerCase+0xf>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cmdLowerCase>:
mov    %rdi,%rax
mov    (%rdi),%dl
test   %dl,%dl
je     112e <cmdLowerCase+0x2e>
lea    0x1(%rax),%rcx
jmp    111b <cmdLowerCase+0x1b>
nop
movzbl (%rcx),%edx
add    $0x1,%rcx
test   %dl,%dl
je     112e <cmdLowerCase+0x2e>
movsbl %dl,%edx
add    $0xffffffbf,%edx
cmp    $0x19,%edx
ja     1110 <cmdLowerCase+0x10>
add    $0x61,%dl
mov    %dl,-0x1(%rcx)
jmp    1110 <cmdLowerCase+0x10>
ret

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

LLVM IR (-O2):
define i8* @cmdLowerCase(i8* returned %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %19, label %4
4: ; preds = %1, %14
%5 = phi i64 [ %15, %14 ], [ 0, %1 ]
%6 = phi i8 [ %17, %14 ], [ %2, %1 ]
%7 = phi i8* [ %16, %14 ], [ %0, %1 ]
%8 = sext i8 %6 to i32
%9 = add nsw i32 %8, -65
%10 = icmp ult i32 %9, 26
br i1 %10, label %11, label %14
11: ; preds = %4
%12 = trunc i32 %9 to i8
%13 = add i8 %12, 97
store i8 %13, i8* %7
br label %14
14: ; preds = %4, %11
%15 = add nuw i64 %5, 1
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = load i8, i8* %16
%18 = icmp eq i8 %17, 0
br i1 %18, label %19, label %4
19: ; preds = %14, %1
ret i8* %0
}