void main() {
  char str1[80] = {"Ac mDz \n \t 12 3 c"};
  char str2[80] = {'A',  'c', ' ', 'm', 'D', 'z', ' ',
                   '\n', '2', ' ', '3', ' ', 'c'};
  int count1[5] = {0}, count2[5] = {0}, max = 80;
  int i;
  for (i = 0; str1[i] != '\0'; i++) {
    if (str1[i] <= 90 && str1[i] >= 65)
      count1[0]++;
    else if (str1[i] <= 'z' && str1[i] >= 'a')
      count1[1]++;
    else if (str1[i] <= '9' && str1[i] >= '1')
      count1[2]++;
    else if (str1[i] == ' ')
      count1[3]++;
    else
      count1[4]++;
  }
  for (i = 0; i < 5; i++) {
    printf("%3d", count1[i]);
  }
  printf("\n%3d %3d %3d %3d %3d", '1', 1, '\0', '0', 0);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
lea    -0x50(%rbp),%rdi
lea    0xeba(%rip),%rsi
mov    $0x50,%edx
call   1050 <memcpy@plt>
lea    -0xa0(%rbp),%rdi
lea    0xef2(%rip),%rsi
mov    $0x50,%edx
call   1050 <memcpy@plt>
lea    -0xc0(%rbp),%rdi
xor    %esi,%esi
mov    $0x14,%edx
call   1040 <memset@plt>
lea    -0xe0(%rbp),%rdi
xor    %esi,%esi
mov    $0x14,%edx
call   1040 <memset@plt>
movl   $0x50,-0xe4(%rbp)
movl   $0x0,-0xe8(%rbp)
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x0,%eax
je     12d1 <main+0x1a1>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x5a,%eax
jg     11f5 <main+0xc5>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x41,%eax
jl     11f5 <main+0xc5>
mov    -0xc0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc0(%rbp)
jmp    12b8 <main+0x188>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x7a,%eax
jg     1233 <main+0x103>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x61,%eax
jl     1233 <main+0x103>
mov    -0xbc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xbc(%rbp)
jmp    12b3 <main+0x183>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x39,%eax
jg     1271 <main+0x141>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x31,%eax
jl     1271 <main+0x141>
mov    -0xb8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb8(%rbp)
jmp    12ae <main+0x17e>
movslq -0xe8(%rbp),%rax
movsbl -0x50(%rbp,%rax,1),%eax
cmp    $0x20,%eax
jne    129a <main+0x16a>
mov    -0xb4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb4(%rbp)
jmp    12a9 <main+0x179>
mov    -0xb0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb0(%rbp)
jmp    12ae <main+0x17e>
jmp    12b3 <main+0x183>
jmp    12b8 <main+0x188>
jmp    12bd <main+0x18d>
mov    -0xe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xe8(%rbp)
jmp    11a2 <main+0x72>
movl   $0x0,-0xe8(%rbp)
cmpl   $0x5,-0xe8(%rbp)
jge    1318 <main+0x1e8>
movslq -0xe8(%rbp),%rax
mov    -0xc0(%rbp,%rax,4),%esi
lea    0xdb4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    -0xe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xe8(%rbp)
jmp    12db <main+0x1ab>
lea    0xd81(%rip),%rdi
mov    $0x31,%esi
mov    $0x1,%edx
xor    %r9d,%r9d
mov    $0x30,%r8d
mov    %r9d,%ecx
mov    $0x0,%al
call   1030 <printf@plt>
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    $0x41,%dl
xor    %esi,%esi
mov    $0x1,%eax
lea    0xed8(%rip),%rcx
xor    %ebp,%ebp
xor    %ebx,%ebx
xor    %r15d,%r15d
xor    %r14d,%r14d
jmp    1151 <main+0x41>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%esi
movzbl (%rax,%rcx,1),%edx
add    $0x1,%rax
cmp    $0x12,%rax
je     118f <main+0x7f>
lea    -0x41(%rdx),%edi
cmp    $0x19,%dil
jbe    1140 <main+0x30>
cmp    $0x61,%dl
jl     1170 <main+0x60>
add    $0x1,%ebp
jmp    1143 <main+0x33>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x31(%rdx),%edi
cmp    $0x8,%dil
ja     117e <main+0x6e>
add    $0x1,%ebx
jmp    1143 <main+0x33>
cmp    $0x20,%dl
jne    1189 <main+0x79>
add    $0x1,%r15d
jmp    1143 <main+0x33>
add    $0x1,%r14d
jmp    1143 <main+0x33>
lea    0xecb(%rip),%r12
mov    %r12,%rdi
xor    %eax,%eax
call   1030 <printf@plt>
mov    %r12,%rdi
mov    %ebp,%esi
xor    %eax,%eax
call   1030 <printf@plt>
mov    %r12,%rdi
mov    %ebx,%esi
xor    %eax,%eax
call   1030 <printf@plt>
mov    %r12,%rdi
mov    %r15d,%esi
xor    %eax,%eax
call   1030 <printf@plt>
mov    %r12,%rdi
mov    %r14d,%esi
xor    %eax,%eax
call   1030 <printf@plt>
lea    0xe77(%rip),%rdi
mov    $0x31,%esi
mov    $0x1,%edx
xor    %ecx,%ecx
mov    $0x30,%r8d
xor    %r9d,%r9d
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <printf@plt>

LLVM IR (-O0):
@__const.main.str1 = [80 x i8] c"Ac mDz \0A \09 12 3 c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"
@__const.main.str2 = <{ [13 x i8], [67 x i8] }> <{ [13 x i8] c"Ac mDz \0A2 3 c", [67 x i8] zeroinitializer }>
@.str = [4 x i8] c"%3d\00"
@.str.1 = [21 x i8] c"\0A%3d %3d %3d %3d %3d\00"
define void @main() {
%1 = alloca [80 x i8]
%2 = alloca [80 x i8]
%3 = alloca [5 x i32]
%4 = alloca [5 x i32]
%5 = alloca i32
%6 = alloca i32
%7 = bitcast [80 x i8]* %1 to i8*
%8 = bitcast [80 x i8]* %2 to i8*
%9 = bitcast [5 x i32]* %3 to i8*
%10 = bitcast [5 x i32]* %4 to i8*
store i32 80, i32* %5
store i32 0, i32* %6
br label %11
11: ; preds = %91, %0
%12 = load i32, i32* %6
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %13
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
%17 = icmp ne i32 %16, 0
br i1 %17, label %18, label %94
18: ; preds = %11
%19 = load i32, i32* %6
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %20
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = icmp sle i32 %23, 90
br i1 %24, label %25, label %36
25: ; preds = %18
%26 = load i32, i32* %6
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %27
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp sge i32 %30, 65
br i1 %31, label %32, label %36
32: ; preds = %25
%33 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 0
%34 = load i32, i32* %33
%35 = add nsw i32 %34, 1
store i32 %35, i32* %33
br label %90
36: ; preds = %25, %18
%37 = load i32, i32* %6
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %38
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = icmp sle i32 %41, 122
br i1 %42, label %43, label %54
43: ; preds = %36
%44 = load i32, i32* %6
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %45
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = icmp sge i32 %48, 97
br i1 %49, label %50, label %54
50: ; preds = %43
%51 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 1
%52 = load i32, i32* %51
%53 = add nsw i32 %52, 1
store i32 %53, i32* %51
br label %89
54: ; preds = %43, %36
%55 = load i32, i32* %6
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %56
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp sle i32 %59, 57
br i1 %60, label %61, label %72
61: ; preds = %54
%62 = load i32, i32* %6
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %63
%65 = load i8, i8* %64
%66 = sext i8 %65 to i32
%67 = icmp sge i32 %66, 49
br i1 %67, label %68, label %72
68: ; preds = %61
%69 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 2
%70 = load i32, i32* %69
%71 = add nsw i32 %70, 1
store i32 %71, i32* %69
br label %88
72: ; preds = %61, %54
%73 = load i32, i32* %6
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds [80 x i8], [80 x i8]* %1, i64 0, i64 %74
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 32
br i1 %78, label %79, label %83
79: ; preds = %72
%80 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 3
%81 = load i32, i32* %80
%82 = add nsw i32 %81, 1
store i32 %82, i32* %80
br label %87
83: ; preds = %72
%84 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 4
%85 = load i32, i32* %84
%86 = add nsw i32 %85, 1
store i32 %86, i32* %84
br label %87
87: ; preds = %83, %79
br label %88
88: ; preds = %87, %68
br label %89
89: ; preds = %88, %50
br label %90
90: ; preds = %89, %32
br label %91
91: ; preds = %90
%92 = load i32, i32* %6
%93 = add nsw i32 %92, 1
store i32 %93, i32* %6
br label %11
94: ; preds = %11
store i32 0, i32* %6
br label %95
95: ; preds = %104, %94
%96 = load i32, i32* %6
%97 = icmp slt i32 %96, 5
br i1 %97, label %98, label %107
98: ; preds = %95
%99 = load i32, i32* %6
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds [5 x i32], [5 x i32]* %3, i64 0, i64 %100
%102 = load i32, i32* %101
%103 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %102)
br label %104
104: ; preds = %98
%105 = load i32, i32* %6
%106 = add nsw i32 %105, 1
store i32 %106, i32* %6
br label %95
107: ; preds = %95
%108 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.1, i64 0, i64 0), i32 49, i32 1, i32 0, i32 48, i32 0)
ret void
}

LLVM IR (-O2):
@__const.main.str1 = [80 x i8] c"Ac mDz \0A \09 12 3 c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"
@.str = [4 x i8] c"%3d\00"
@.str.1 = [21 x i8] c"\0A%3d %3d %3d %3d %3d\00"
define void @main() {
br label %8
1: ; preds = %35
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %36)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %37)
%4 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %38)
%5 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %39)
%6 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %40)
%7 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.1, i64 0, i64 0), i32 49, i32 1, i32 0, i32 48, i32 0)
ret void
8: ; preds = %0, %35
%9 = phi i64 [ 0, %0 ], [ %41, %35 ]
%10 = phi i32 [ 0, %0 ], [ %36, %35 ]
%11 = phi i32 [ 0, %0 ], [ %37, %35 ]
%12 = phi i32 [ 0, %0 ], [ %38, %35 ]
%13 = phi i32 [ 0, %0 ], [ %39, %35 ]
%14 = phi i32 [ 0, %0 ], [ %40, %35 ]
%15 = phi i8 [ 65, %0 ], [ %43, %35 ]
%16 = add i8 %15, -65
%17 = icmp ult i8 %16, 26
br i1 %17, label %18, label %20
18: ; preds = %8
%19 = add nsw i32 %10, 1
br label %35
20: ; preds = %8
%21 = icmp sgt i8 %15, 96
br i1 %21, label %22, label %24
22: ; preds = %20
%23 = add nsw i32 %11, 1
br label %35
24: ; preds = %20
%25 = add i8 %15, -49
%26 = icmp ult i8 %25, 9
br i1 %26, label %27, label %29
27: ; preds = %24
%28 = add nsw i32 %12, 1
br label %35
29: ; preds = %24
%30 = icmp eq i8 %15, 32
br i1 %30, label %31, label %33
31: ; preds = %29
%32 = add nsw i32 %13, 1
br label %35
33: ; preds = %29
%34 = add nsw i32 %14, 1
br label %35
35: ; preds = %18, %27, %33, %31, %22
%36 = phi i32 [ %19, %18 ], [ %10, %27 ], [ %10, %33 ], [ %10, %31 ], [ %10, %22 ]
%37 = phi i32 [ %11, %18 ], [ %11, %27 ], [ %11, %33 ], [ %11, %31 ], [ %23, %22 ]
%38 = phi i32 [ %12, %18 ], [ %28, %27 ], [ %12, %33 ], [ %12, %31 ], [ %12, %22 ]
%39 = phi i32 [ %13, %18 ], [ %13, %27 ], [ %13, %33 ], [ %32, %31 ], [ %13, %22 ]
%40 = phi i32 [ %14, %18 ], [ %14, %27 ], [ %34, %33 ], [ %14, %31 ], [ %14, %22 ]
%41 = add nuw nsw i64 %9, 1
%42 = getelementptr inbounds [80 x i8], [80 x i8]* @__const.main.str1, i64 0, i64 %41
%43 = load i8, i8* %42
%44 = icmp eq i64 %41, 17
br i1 %44, label %1, label %8
}