#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 */
int strlen(char *);
void upper_case_2(char *str) {
  int i, l = strlen(str);
  for (i = 0; i != l; i++) {
    if ((str[i] >= 'a') && (str[i] <= 'z'))
      str[i] -= 32;
    if (str[i] == '_')
      str[i] = ' ';
  };
}


x86 assembly (clang, -O0):
<upper_case_2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x10(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
je     11ab <upper_case_2+0x9b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1177 <upper_case_2+0x67>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     1177 <upper_case_2+0x67>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
sub    $0x20,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5f,%eax
jne    1198 <upper_case_2+0x88>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x20,(%rax,%rcx,1)
jmp    119d <upper_case_2+0x8d>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    112f <upper_case_2+0x1f>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<upper_case_2>:
push   %rbx
mov    %rdi,%rbx
call   1030 <strlen@plt>
test   %eax,%eax
je     1273 <upper_case_2+0x163>
mov    %eax,%edi
cmp    $0x8,%eax
jae    112f <upper_case_2+0x1f>
xor    %eax,%eax
jmp    1291 <upper_case_2+0x181>
mov    %edi,%eax
and    $0xfffffff8,%eax
xor    %edx,%edx
movdqa 0xec1(%rip),%xmm8
movdqa 0xec8(%rip),%xmm9
pcmpeqd %xmm2,%xmm2
movdqa 0xecc(%rip),%xmm3
movdqa 0xed4(%rip),%xmm4
movdqa 0xedc(%rip),%xmm5
jmp    117d <upper_case_2+0x6d>
cs nopw 0x0(%rax,%rax,1)
add    $0x8,%rdx
cmp    %rdx,%rax
je     126e <upper_case_2+0x15e>
movq   (%rbx,%rdx,1),%xmm6
movdqa %xmm6,%xmm1
paddb  %xmm8,%xmm1
movdqa %xmm1,%xmm0
pmaxub %xmm9,%xmm0
pcmpeqb %xmm1,%xmm0
movdqa %xmm6,%xmm1
pcmpeqb %xmm3,%xmm1
punpcklbw %xmm1,%xmm7
pand   %xmm0,%xmm1
pxor   %xmm2,%xmm0
punpcklbw %xmm0,%xmm0
por    %xmm0,%xmm7
paddb  %xmm4,%xmm6
movdqa %xmm1,%xmm0
pandn  %xmm6,%xmm0
pand   %xmm5,%xmm1
por    %xmm0,%xmm1
psraw  $0x8,%xmm7
movd   %xmm7,%esi
test   $0x1,%sil
je     11de <upper_case_2+0xce>
movd   %xmm1,%ecx
mov    %cl,(%rbx,%rdx,1)
shr    $0x10,%esi
test   $0x1,%sil
je     11ef <upper_case_2+0xdf>
movd   %xmm1,%ecx
mov    %ch,0x1(%rbx,%rdx,1)
pextrw $0x2,%xmm7,%ecx
test   $0x1,%cl
je     1204 <upper_case_2+0xf4>
movd   %xmm1,%ecx
shr    $0x10,%ecx
mov    %cl,0x2(%rbx,%rdx,1)
pextrw $0x3,%xmm7,%ecx
test   $0x1,%cl
je     1219 <upper_case_2+0x109>
movd   %xmm1,%ecx
shr    $0x18,%ecx
mov    %cl,0x3(%rbx,%rdx,1)
pextrw $0x4,%xmm7,%ecx
test   $0x1,%cl
je     122c <upper_case_2+0x11c>
pextrw $0x2,%xmm1,%ecx
mov    %cl,0x4(%rbx,%rdx,1)
pextrw $0x5,%xmm7,%ecx
test   $0x1,%cl
je     123f <upper_case_2+0x12f>
pextrw $0x2,%xmm1,%ecx
mov    %ch,0x5(%rbx,%rdx,1)
pextrw $0x6,%xmm7,%ecx
test   $0x1,%cl
je     1252 <upper_case_2+0x142>
pextrw $0x3,%xmm1,%ecx
mov    %cl,0x6(%rbx,%rdx,1)
pextrw $0x7,%xmm7,%ecx
test   $0x1,%cl
je     1170 <upper_case_2+0x60>
pextrw $0x3,%xmm1,%ecx
mov    %ch,0x7(%rbx,%rdx,1)
jmp    1170 <upper_case_2+0x60>
cmp    %rdi,%rax
jne    1291 <upper_case_2+0x181>
pop    %rbx
ret
cs nopw 0x0(%rax,%rax,1)
nop
add    $0xe0,%dl
mov    %edx,%ecx
mov    %cl,(%rbx,%rax,1)
add    $0x1,%rax
cmp    %rax,%rdi
je     1273 <upper_case_2+0x163>
movzbl (%rbx,%rax,1),%edx
lea    -0x61(%rdx),%ecx
cmp    $0x19,%cl
jbe    1280 <upper_case_2+0x170>
mov    $0x20,%cl
cmp    $0x5f,%dl
je     1285 <upper_case_2+0x175>
jmp    1288 <upper_case_2+0x178>

LLVM IR (-O0):
define void @upper_case_2(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i32
store i8* %0, i8** %2
%5 = load i8*, i8** %2
%6 = call i32 @strlen(i8* %5)
store i32 %6, i32* %4
store i32 0, i32* %3
br label %7
7: ; preds = %50, %1
%8 = load i32, i32* %3
%9 = load i32, i32* %4
%10 = icmp ne i32 %8, %9
br i1 %10, label %11, label %53
11: ; preds = %7
%12 = load i8*, i8** %2
%13 = load i32, i32* %3
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp sge i32 %17, 97
br i1 %18, label %19, label %36
19: ; preds = %11
%20 = load i8*, i8** %2
%21 = load i32, i32* %3
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp sle i32 %25, 122
br i1 %26, label %27, label %36
27: ; preds = %19
%28 = load i8*, i8** %2
%29 = load i32, i32* %3
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = sub nsw i32 %33, 32
%35 = trunc i32 %34 to i8
store i8 %35, i8* %31
br label %36
36: ; preds = %27, %19, %11
%37 = load i8*, i8** %2
%38 = load i32, i32* %3
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 95
br i1 %43, label %44, label %49
44: ; preds = %36
%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 32, i8* %48
br label %49
49: ; preds = %44, %36
br label %50
50: ; preds = %49
%51 = load i32, i32* %3
%52 = add nsw i32 %51, 1
store i32 %52, i32* %3
br label %7
53: ; preds = %7
ret void
}

LLVM IR (-O2):
define void @upper_case_2(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = icmp eq i32 %2, 0
br i1 %3, label %90, label %4
4: ; preds = %1
%5 = zext i32 %2 to i64
%6 = icmp ult i32 %2, 8
br i1 %6, label %73, label %7
7: ; preds = %4
%8 = and i64 %5, 4294967288
br label %9
9: ; preds = %68, %7
%10 = phi i64 [ 0, %7 ], [ %69, %68 ]
%11 = getelementptr inbounds i8, i8* %0, i64 %10
%12 = bitcast i8* %11 to <8 x i8>*
%13 = load <8 x i8>, <8 x i8>* %12
%14 = add <8 x i8> %13, <i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97>
%15 = icmp ult <8 x i8> %14, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%16 = icmp eq <8 x i8> %13, <i8 95, i8 95, i8 95, i8 95, i8 95, i8 95, i8 95, i8 95>
%17 = add nsw <8 x i8> %13, <i8 -32, i8 -32, i8 -32, i8 -32, i8 -32, i8 -32, i8 -32, i8 -32>
%18 = xor <8 x i1> %15, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%19 = select <8 x i1> %18, <8 x i1> %16, <8 x i1> zeroinitializer
%20 = select <8 x i1> %19, <8 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>, <8 x i8> %17
%21 = or <8 x i1> %19, %15
%22 = extractelement <8 x i1> %21, i64 0
br i1 %22, label %23, label %26
23: ; preds = %9
%24 = getelementptr inbounds i8, i8* %0, i64 %10
%25 = extractelement <8 x i8> %20, i64 0
store i8 %25, i8* %24
br label %26
26: ; preds = %23, %9
%27 = extractelement <8 x i1> %21, i64 1
br i1 %27, label %28, label %32
28: ; preds = %26
%29 = or i64 %10, 1
%30 = getelementptr inbounds i8, i8* %0, i64 %29
%31 = extractelement <8 x i8> %20, i64 1
store i8 %31, i8* %30
br label %32
32: ; preds = %28, %26
%33 = extractelement <8 x i1> %21, i64 2
br i1 %33, label %34, label %38
34: ; preds = %32
%35 = or i64 %10, 2
%36 = getelementptr inbounds i8, i8* %0, i64 %35
%37 = extractelement <8 x i8> %20, i64 2
store i8 %37, i8* %36
br label %38
38: ; preds = %34, %32
%39 = extractelement <8 x i1> %21, i64 3
br i1 %39, label %40, label %44
40: ; preds = %38
%41 = or i64 %10, 3
%42 = getelementptr inbounds i8, i8* %0, i64 %41
%43 = extractelement <8 x i8> %20, i64 3
store i8 %43, i8* %42
br label %44
44: ; preds = %40, %38
%45 = extractelement <8 x i1> %21, i64 4
br i1 %45, label %46, label %50
46: ; preds = %44
%47 = or i64 %10, 4
%48 = getelementptr inbounds i8, i8* %0, i64 %47
%49 = extractelement <8 x i8> %20, i64 4
store i8 %49, i8* %48
br label %50
50: ; preds = %46, %44
%51 = extractelement <8 x i1> %21, i64 5
br i1 %51, label %52, label %56
52: ; preds = %50
%53 = or i64 %10, 5
%54 = getelementptr inbounds i8, i8* %0, i64 %53
%55 = extractelement <8 x i8> %20, i64 5
store i8 %55, i8* %54
br label %56
56: ; preds = %52, %50
%57 = extractelement <8 x i1> %21, i64 6
br i1 %57, label %58, label %62
58: ; preds = %56
%59 = or i64 %10, 6
%60 = getelementptr inbounds i8, i8* %0, i64 %59
%61 = extractelement <8 x i8> %20, i64 6
store i8 %61, i8* %60
br label %62
62: ; preds = %58, %56
%63 = extractelement <8 x i1> %21, i64 7
br i1 %63, label %64, label %68
64: ; preds = %62
%65 = or i64 %10, 7
%66 = getelementptr inbounds i8, i8* %0, i64 %65
%67 = extractelement <8 x i8> %20, i64 7
store i8 %67, i8* %66
br label %68
68: ; preds = %64, %62
%69 = add nuw i64 %10, 8
%70 = icmp eq i64 %69, %8
br i1 %70, label %71, label %9
71: ; preds = %68
%72 = icmp eq i64 %8, %5
br i1 %72, label %90, label %73
73: ; preds = %4, %71
%74 = phi i64 [ 0, %4 ], [ %8, %71 ]
br label %75
75: ; preds = %73, %87
%76 = phi i64 [ %88, %87 ], [ %74, %73 ]
%77 = getelementptr inbounds i8, i8* %0, i64 %76
%78 = load i8, i8* %77
%79 = add i8 %78, -97
%80 = icmp ult i8 %79, 26
br i1 %80, label %81, label %83
81: ; preds = %75
%82 = add nsw i8 %78, -32
br label %85
83: ; preds = %75
%84 = icmp eq i8 %78, 95
br i1 %84, label %85, label %87
85: ; preds = %83, %81
%86 = phi i8 [ %82, %81 ], [ 32, %83 ]
store i8 %86, i8* %77
br label %87
87: ; preds = %85, %83
%88 = add nuw nsw i64 %76, 1
%89 = icmp eq i64 %88, %5
br i1 %89, label %90, label %75
90: ; preds = %87, %71, %1
ret void
}