#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ malloc(int);
int *getDnaDictionary(int *dic) {
  int i;
  if (dic == NULL)
    dic = (int *)malloc((256 + 1) * sizeof(int));
  for (i = 0; i < 256; i++)
    dic[i] = 0;
  dic['a'] = 0;
  dic['c'] = 1;
  dic['g'] = 2;
  dic['t'] = 3;
  dic['A'] = 0;
  dic['C'] = 1;
  dic['G'] = 2;
  dic['T'] = 3;
  dic['r'] = dic['g'];
  dic['R'] = dic['g'];
  dic['y'] = dic['t'];
  dic['Y'] = dic['t'];
  dic['m'] = dic['a'];
  dic['M'] = dic['a'];
  dic['k'] = dic['g'];
  dic['K'] = dic['g'];
  dic['s'] = dic['g'];
  dic['S'] = dic['g'];
  dic['w'] = dic['a'];
  dic['W'] = dic['a'];
  dic['h'] = dic['a'];
  dic['H'] = dic['a'];
  dic['b'] = dic['g'];
  dic['B'] = dic['g'];
  dic['v'] = dic['g'];
  dic['V'] = dic['g'];
  dic['d'] = dic['g'];
  dic['D'] = dic['g'];
  dic['n'] = dic['g'];
  dic['N'] = dic['g'];
  dic['u'] = dic['t'];
  dic['U'] = dic['t'];
  return dic;
}


x86 assembly (clang, -O0):
<getDnaDictionary>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
cmpq   $0x0,-0x8(%rbp)
jne    1135 <getDnaDictionary+0x25>
mov    $0x404,%edi
call   1030 <malloc@plt>
mov    %rax,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x100,-0xc(%rbp)
jge    1166 <getDnaDictionary+0x56>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    113c <getDnaDictionary+0x2c>
mov    -0x8(%rbp),%rax
movl   $0x0,0x184(%rax)
mov    -0x8(%rbp),%rax
movl   $0x1,0x18c(%rax)
mov    -0x8(%rbp),%rax
movl   $0x2,0x19c(%rax)
mov    -0x8(%rbp),%rax
movl   $0x3,0x1d0(%rax)
mov    -0x8(%rbp),%rax
movl   $0x0,0x104(%rax)
mov    -0x8(%rbp),%rax
movl   $0x1,0x10c(%rax)
mov    -0x8(%rbp),%rax
movl   $0x2,0x11c(%rax)
mov    -0x8(%rbp),%rax
movl   $0x3,0x150(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1c8(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x148(%rax)
mov    -0x8(%rbp),%rax
mov    0x1d0(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1e4(%rax)
mov    -0x8(%rbp),%rax
mov    0x1d0(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x164(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1b4(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x134(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1ac(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x12c(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1cc(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x14c(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1dc(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x15c(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1a0(%rax)
mov    -0x8(%rbp),%rax
mov    0x184(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x120(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x188(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x108(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1d8(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x158(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x190(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x110(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1b8(%rax)
mov    -0x8(%rbp),%rax
mov    0x19c(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x138(%rax)
mov    -0x8(%rbp),%rax
mov    0x1d0(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x1d4(%rax)
mov    -0x8(%rbp),%rax
mov    0x1d0(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x154(%rax)
mov    -0x8(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getDnaDictionary>:
push   %rbx
mov    %rdi,%rbx
test   %rdi,%rdi
jne    1136 <getDnaDictionary+0x16>
mov    $0x404,%edi
call   1040 <malloc@plt>
mov    %rax,%rbx
mov    $0x400,%edx
mov    %rbx,%rdi
xor    %esi,%esi
call   1030 <memset@plt>
movl   $0x2,0x19c(%rbx)
movq   $0x2,0x11c(%rbx)
movl   $0x3,0x1e4(%rbx)
movl   $0x3,0x164(%rbx)
movabs $0x200000000,%rax
mov    %rax,0x134(%rbx)
movl   $0x2,0x1ac(%rbx)
movl   $0x2,0x12c(%rbx)
movabs $0x100000002,%rax
mov    %rax,0x188(%rbx)
mov    %rax,0x108(%rbx)
movl   $0x2,0x1d8(%rbx)
movq   $0x2,0x158(%rbx)
movl   $0x2,0x190(%rbx)
movl   $0x2,0x110(%rbx)
movl   $0x2,0x1b8(%rbx)
movaps 0xe1b(%rip),%xmm0
movups %xmm0,0x1c8(%rbx)
movups %xmm0,0x148(%rbx)
mov    %rbx,%rax
pop    %rbx
ret

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

LLVM IR (-O2):
define i32* @getDnaDictionary(i32* %0) {
%2 = icmp eq i32* %0, null
br i1 %2, label %3, label %6
3: ; preds = %1
%4 = tail call i64 @malloc(i32 1028)
%5 = inttoptr i64 %4 to i32*
br label %6
6: ; preds = %3, %1
%7 = phi i32* [ %5, %3 ], [ %0, %1 ]
%8 = getelementptr inbounds i32, i32* %7, i64 99
%9 = bitcast i32* %7 to i8*
store i32 1, i32* %8
%10 = getelementptr inbounds i32, i32* %7, i64 103
store i32 2, i32* %10
%11 = getelementptr inbounds i32, i32* %7, i64 67
store i32 1, i32* %11
%12 = getelementptr inbounds i32, i32* %7, i64 71
store i32 2, i32* %12
%13 = getelementptr inbounds i32, i32* %7, i64 114
%14 = getelementptr inbounds i32, i32* %7, i64 82
%15 = getelementptr inbounds i32, i32* %7, i64 121
store i32 3, i32* %15
%16 = getelementptr inbounds i32, i32* %7, i64 89
store i32 3, i32* %16
%17 = getelementptr inbounds i32, i32* %7, i64 77
store i32 0, i32* %17
%18 = getelementptr inbounds i32, i32* %7, i64 107
store i32 2, i32* %18
%19 = getelementptr inbounds i32, i32* %7, i64 75
store i32 2, i32* %19
%20 = getelementptr inbounds i32, i32* %7, i64 87
store i32 0, i32* %20
%21 = getelementptr inbounds i32, i32* %7, i64 72
store i32 0, i32* %21
%22 = getelementptr inbounds i32, i32* %7, i64 98
store i32 2, i32* %22
%23 = getelementptr inbounds i32, i32* %7, i64 66
store i32 2, i32* %23
%24 = getelementptr inbounds i32, i32* %7, i64 118
store i32 2, i32* %24
%25 = getelementptr inbounds i32, i32* %7, i64 86
store i32 2, i32* %25
%26 = getelementptr inbounds i32, i32* %7, i64 100
store i32 2, i32* %26
%27 = getelementptr inbounds i32, i32* %7, i64 68
store i32 2, i32* %27
%28 = getelementptr inbounds i32, i32* %7, i64 110
store i32 2, i32* %28
%29 = getelementptr inbounds i32, i32* %7, i64 78
store i32 2, i32* %29
%30 = bitcast i32* %13 to <4 x i32>*
store <4 x i32> <i32 2, i32 2, i32 3, i32 3>, <4 x i32>* %30
%31 = bitcast i32* %14 to <4 x i32>*
store <4 x i32> <i32 2, i32 2, i32 3, i32 3>, <4 x i32>* %31
ret i32* %7
}