void h(char *hex, int n) {
  for (int i = 0; i < n; i++) {
    switch (hex[i]) {
    case 'a':
      hex[i] = 10 + '0';
      break;
    case 'b':
      hex[i] = 11 + '0';
      break;
    case 'c':
      hex[i] = 12 + '0';
      break;
    case 'd':
      hex[i] = 13 + '0';
      break;
    case 'e':
      hex[i] = 14 + '0';
      break;
    case 'f':
      hex[i] = 15 + '0';
      break;
    case 1:
      hex[i] = '1';
      break;
    case 2:
      hex[i] = '2';
      break;
    case 3:
      hex[i] = '3';
      break;
    case 4:
      hex[i] = '4';
      break;
    case 5:
      hex[i] = '5';
      break;
    case 6:
      hex[i] = '6';
      break;
    case 7:
      hex[i] = '7';
      break;
    case 8:
      hex[i] = '8';
      break;
    case 9:
      hex[i] = '9';
      break;
    case 10:
      hex[i] = 'a';
      break;
    case 11:
      hex[i] = 'b';
      break;
    case 12:
      hex[i] = 'c';
      break;
    case 13:
      hex[i] = 'd';
      break;
    case 14:
      hex[i] = 'e';
      break;
    case 15:
      hex[i] = 'f';
      break;
    }
  }
}


x86 assembly (clang, -O0):
<h>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12c3 <h+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x65,%eax
ja     12b0 <h+0x1b0>
mov    -0x18(%rbp),%rax
lea    0xeb9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3a,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3b,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3c,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3d,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3e,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x3f,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x31,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x32,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x33,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x34,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x35,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x36,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x37,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x38,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x39,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x61,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x62,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x63,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x64,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x65,(%rax,%rcx,1)
jmp    12b0 <h+0x1b0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movb   $0x66,(%rax,%rcx,1)
jmp    12b5 <h+0x1b5>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1112 <h+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<h>:
test   %esi,%esi
jle    119c <h+0x9c>
mov    %esi,%eax
xor    %ecx,%ecx
lea    0xeed(%rip),%r8
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl (%rdi,%rcx,1),%esi
add    $0xffffffff,%esi
cmp    $0x65,%esi
ja     1193 <h+0x93>
mov    $0x3a,%dl
movslq (%r8,%rsi,4),%rsi
add    %r8,%rsi
jmp    *%rsi
mov    $0x31,%dl
jmp    1190 <h+0x90>
mov    $0x32,%dl
jmp    1190 <h+0x90>
mov    $0x33,%dl
jmp    1190 <h+0x90>
mov    $0x34,%dl
jmp    1190 <h+0x90>
mov    $0x35,%dl
jmp    1190 <h+0x90>
mov    $0x36,%dl
jmp    1190 <h+0x90>
mov    $0x37,%dl
jmp    1190 <h+0x90>
mov    $0x38,%dl
jmp    1190 <h+0x90>
mov    $0x39,%dl
jmp    1190 <h+0x90>
mov    $0x61,%dl
jmp    1190 <h+0x90>
mov    $0x62,%dl
jmp    1190 <h+0x90>
mov    $0x63,%dl
jmp    1190 <h+0x90>
mov    $0x64,%dl
jmp    1190 <h+0x90>
mov    $0x65,%dl
jmp    1190 <h+0x90>
mov    $0x66,%dl
jmp    1190 <h+0x90>
mov    $0x3b,%dl
jmp    1190 <h+0x90>
mov    $0x3c,%dl
jmp    1190 <h+0x90>
mov    $0x3d,%dl
jmp    1190 <h+0x90>
mov    $0x3e,%dl
jmp    1190 <h+0x90>
mov    $0x3f,%dl
cs nopw 0x0(%rax,%rax,1)
nop
mov    %dl,(%rdi,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1120 <h+0x20>
ret

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

LLVM IR (-O2):
define void @h(i8* %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %6
4: ; preds = %2
%5 = zext i32 %1 to i64
br label %7
6: ; preds = %34, %2
ret void
7: ; preds = %4, %34
%8 = phi i64 [ 0, %4 ], [ %35, %34 ]
%9 = getelementptr inbounds i8, i8* %0, i64 %8
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
switch i32 %11, label %34 [
i32 97, label %32
i32 98, label %12
i32 99, label %13
i32 100, label %14
i32 101, label %15
i32 102, label %16
i32 1, label %17
i32 2, label %18
i32 3, label %19
i32 4, label %20
i32 5, label %21
i32 6, label %22
i32 7, label %23
i32 8, label %24
i32 9, label %25
i32 10, label %26
i32 11, label %27
i32 12, label %28
i32 13, label %29
i32 14, label %30
i32 15, label %31
]
12: ; preds = %7
br label %32
13: ; preds = %7
br label %32
14: ; preds = %7
br label %32
15: ; preds = %7
br label %32
16: ; preds = %7
br label %32
17: ; preds = %7
br label %32
18: ; preds = %7
br label %32
19: ; preds = %7
br label %32
20: ; preds = %7
br label %32
21: ; preds = %7
br label %32
22: ; preds = %7
br label %32
23: ; preds = %7
br label %32
24: ; preds = %7
br label %32
25: ; preds = %7
br label %32
26: ; preds = %7
br label %32
27: ; preds = %7
br label %32
28: ; preds = %7
br label %32
29: ; preds = %7
br label %32
30: ; preds = %7
br label %32
31: ; preds = %7
br label %32
32: ; preds = %7, %31, %30, %29, %28, %27, %26, %25, %24, %23, %22, %21, %20, %19, %18, %17, %16, %15, %14, %13, %12
%33 = phi i8 [ 59, %12 ], [ 60, %13 ], [ 61, %14 ], [ 62, %15 ], [ 63, %16 ], [ 49, %17 ], [ 50, %18 ], [ 51, %19 ], [ 52, %20 ], [ 53, %21 ], [ 54, %22 ], [ 55, %23 ], [ 56, %24 ], [ 57, %25 ], [ 97, %26 ], [ 98, %27 ], [ 99, %28 ], [ 100, %29 ], [ 101, %30 ], [ 102, %31 ], [ 58, %7 ]
store i8 %33, i8* %9
br label %34
34: ; preds = %32, %7
%35 = add nuw nsw i64 %8, 1
%36 = icmp eq i64 %35, %5
br i1 %36, label %6, label %7
}