#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 */
size_t strlen(char *);
void process03(char *linha) {
  size_t length = strlen(linha);
  int i;
  for (i = length / 2; i < length; i++) {
    linha[i] = linha[i] - 1;
  }
}


x86 assembly (clang, -O0):
<process03>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %eax,-0x14(%rbp)
movslq -0x14(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    116c <process03+0x5c>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x1,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1134 <process03+0x24>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<process03>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
call   1030 <strlen@plt>
mov    %rax,%rcx
shr    %rcx
movslq %ecx,%rcx
mov    %rax,%r9
sub    %rcx,%r9
jbe    125e <process03+0x14e>
cmp    $0x8,%r9
jb     1250 <process03+0x140>
cmp    $0x20,%r9
jae    1148 <process03+0x38>
xor    %esi,%esi
jmp    1202 <process03+0xf2>
mov    %r9,%rsi
and    $0xffffffffffffffe0,%rsi
lea    -0x20(%rsi),%rdx
mov    %rdx,%r8
shr    $0x5,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     123e <process03+0x12e>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
lea    (%rcx,%r14,1),%rbx
add    $0x30,%rbx
xor    %edi,%edi
pcmpeqd %xmm0,%xmm0
nopl   0x0(%rax)
movdqu -0x30(%rbx,%rdi,1),%xmm1
movdqu -0x20(%rbx,%rdi,1),%xmm2
movdqu -0x10(%rbx,%rdi,1),%xmm3
movdqu (%rbx,%rdi,1),%xmm4
paddb  %xmm0,%xmm1
paddb  %xmm0,%xmm2
movdqu %xmm1,-0x30(%rbx,%rdi,1)
movdqu %xmm2,-0x20(%rbx,%rdi,1)
paddb  %xmm0,%xmm3
paddb  %xmm0,%xmm4
movdqu %xmm3,-0x10(%rbx,%rdi,1)
movdqu %xmm4,(%rbx,%rdi,1)
add    $0x40,%rdi
add    $0xfffffffffffffffe,%rdx
jne    1180 <process03+0x70>
test   $0x1,%r8b
je     11f7 <process03+0xe7>
add    %rcx,%rdi
movdqu (%r14,%rdi,1),%xmm0
movdqu 0x10(%r14,%rdi,1),%xmm1
pcmpeqd %xmm2,%xmm2
paddb  %xmm2,%xmm0
paddb  %xmm2,%xmm1
movdqu %xmm0,(%r14,%rdi,1)
movdqu %xmm1,0x10(%r14,%rdi,1)
cmp    %rsi,%r9
je     125e <process03+0x14e>
test   $0x18,%r9b
je     1248 <process03+0x138>
mov    %r9,%rdx
and    $0xfffffffffffffff8,%rdx
lea    (%r14,%rcx,1),%rdi
add    %rdx,%rcx
pcmpeqd %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movq   (%rdi,%rsi,1),%xmm1
paddb  %xmm0,%xmm1
movq   %xmm1,(%rdi,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rdx
jne    1220 <process03+0x110>
cmp    %rdx,%r9
jne    1250 <process03+0x140>
jmp    125e <process03+0x14e>
xor    %edi,%edi
test   $0x1,%r8b
jne    11ce <process03+0xbe>
jmp    11f7 <process03+0xe7>
add    %rsi,%rcx
nopl   0x0(%rax,%rax,1)
addb   $0xff,(%r14,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%rax
ja     1250 <process03+0x140>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @process03(i8* %0) {
%2 = alloca i8*
%3 = alloca i64
%4 = alloca i32
store i8* %0, i8** %2
%5 = load i8*, i8** %2
%6 = call i64 @strlen(i8* %5)
store i64 %6, i64* %3
%7 = load i64, i64* %3
%8 = udiv i64 %7, 2
%9 = trunc i64 %8 to i32
store i32 %9, i32* %4
br label %10
10: ; preds = %28, %1
%11 = load i32, i32* %4
%12 = sext i32 %11 to i64
%13 = load i64, i64* %3
%14 = icmp ult i64 %12, %13
br i1 %14, label %15, label %31
15: ; preds = %10
%16 = load i8*, i8** %2
%17 = load i32, i32* %4
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %16, i64 %18
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
%22 = sub nsw i32 %21, 1
%23 = trunc i32 %22 to i8
%24 = load i8*, i8** %2
%25 = load i32, i32* %4
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %24, i64 %26
store i8 %23, i8* %27
br label %28
28: ; preds = %15
%29 = load i32, i32* %4
%30 = add nsw i32 %29, 1
store i32 %30, i32* %4
br label %10
31: ; preds = %10
ret void
}

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