#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 ltrim(char *text) {
  int __i = 0, __j = 0;
  int __len = strlen(text);
  while (text[__i++] == ' ' && __i < __len)
    ;
  for (__j = 0; __j < __len; __j = __j + 1) {
    text[__j] = text[__j + __i - 1];
  }
  text[__j + __i - 1] = 0;
}


x86 assembly (clang, -O0):
<ltrim>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x15(%rbp)
jne    1166 <ltrim+0x56>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
setl   %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    1176 <ltrim+0x66>
jmp    117b <ltrim+0x6b>
jmp    1136 <ltrim+0x26>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11ba <ltrim+0xaa>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1182 <ltrim+0x72>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ltrim>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
movabs $0x100000000,%rbx
call   1030 <strlen@plt>
mov    %eax,%r8d
movslq %eax,%rcx
movabs $0xffffffff00000000,%rsi
ff ff ff
movabs $0x1f00000000,%rdi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    %rbx,%rsi
add    %rbx,%rdi
cmpb   $0x20,(%r14,%rdx,1)
lea    0x1(%rdx),%rdx
jne    1166 <ltrim+0x56>
cmp    %rcx,%rdx
jl     1150 <ltrim+0x40>
test   %eax,%eax
jle    11f2 <ltrim+0xe2>
cmp    $0x8,%eax
jae    120b <ltrim+0xfb>
xor    %eax,%eax
mov    %rax,%rcx
not    %rcx
test   $0x1,%r8b
je     119a <ltrim+0x8a>
lea    (%rax,%rdx,1),%esi
add    $0xffffffff,%esi
movslq %esi,%rsi
mov    (%r14,%rsi,1),%bl
mov    %bl,(%r14,%rax,1)
or     $0x1,%rax
add    %r8,%rcx
je     11f5 <ltrim+0xe5>
movabs $0x200000000,%r9
mov    %rdx,%rsi
add    %rax,%rsi
lea    -0x1(%rsi),%ebx
shl    $0x20,%rbx
shl    $0x20,%rsi
nopw   0x0(%rax,%rax,1)
mov    %rbx,%rdi
sar    $0x20,%rdi
movzbl (%r14,%rdi,1),%ecx
mov    %cl,(%r14,%rax,1)
mov    %rsi,%rcx
sar    $0x20,%rcx
movzbl (%r14,%rcx,1),%ecx
mov    %cl,0x1(%r14,%rax,1)
add    $0x2,%rax
add    %r9,%rbx
add    %r9,%rsi
cmp    %rax,%r8
jne    11c0 <ltrim+0xb0>
jmp    11f5 <ltrim+0xe5>
xor    %r8d,%r8d
lea    (%r8,%rdx,1),%eax
add    $0xffffffff,%eax
cltq
movb   $0x0,(%r14,%rax,1)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
lea    -0x1(%rdx),%ecx
lea    (%r8,%rdx,1),%ebx
add    $0xfffffffe,%ebx
xor    %eax,%eax
cmp    %ecx,%ebx
jl     1179 <ltrim+0x69>
lea    -0x1(%r8),%rbx
mov    %rbx,%rcx
shr    $0x20,%rcx
jne    1179 <ltrim+0x69>
add    %r14,%rbx
add    %rdx,%rbx
cmp    %r14,%rbx
jbe    1250 <ltrim+0x140>
lea    (%r14,%r8,1),%rax
lea    (%r14,%rdx,1),%rcx
add    $0xffffffffffffffff,%rcx
cmp    %rax,%rcx
jb     1177 <ltrim+0x67>
cmp    $0x20,%r8d
jae    125d <ltrim+0x14d>
xor    %eax,%eax
jmp    1317 <ltrim+0x207>
mov    %r8d,%eax
and    $0xffffffe0,%eax
lea    -0x20(%rax),%rcx
mov    %rcx,%r9
shr    $0x5,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     12dd <ltrim+0x1cd>
movabs $0x4000000000,%r10
mov    %r9,%r11
and    $0xfffffffffffffffe,%r11
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %rsi,%rbx
sar    $0x20,%rbx
movups (%r14,%rbx,1),%xmm0
movups 0x10(%r14,%rbx,1),%xmm1
movups %xmm0,(%r14,%rcx,1)
movups %xmm1,0x10(%r14,%rcx,1)
mov    %rdi,%rbx
sar    $0x20,%rbx
movups (%r14,%rbx,1),%xmm0
movups 0x10(%r14,%rbx,1),%xmm1
movups %xmm0,0x20(%r14,%rcx,1)
movups %xmm1,0x30(%r14,%rcx,1)
add    $0x40,%rcx
add    %r10,%rdi
add    %r10,%rsi
add    $0xfffffffffffffffe,%r11
jne    1290 <ltrim+0x180>
jmp    12df <ltrim+0x1cf>
xor    %ecx,%ecx
test   $0x1,%r9b
je     1304 <ltrim+0x1f4>
lea    (%rcx,%rdx,1),%esi
add    $0xffffffff,%esi
movslq %esi,%rsi
movups (%r14,%rsi,1),%xmm0
movups 0x10(%r14,%rsi,1),%xmm1
movups %xmm0,(%r14,%rcx,1)
movups %xmm1,0x10(%r14,%rcx,1)
cmp    %r8,%rax
je     11f5 <ltrim+0xe5>
test   $0x18,%r8b
je     1179 <ltrim+0x69>
mov    %rax,%rcx
mov    %r8d,%eax
and    $0xfffffff8,%eax
lea    (%rcx,%rdx,1),%ebx
add    $0xffffffff,%ebx
shl    $0x20,%rbx
movabs $0x800000000,%rdi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rbx,%rsi
sar    $0x20,%rsi
mov    (%r14,%rsi,1),%rsi
mov    %rsi,(%r14,%rcx,1)
add    $0x8,%rcx
add    %rdi,%rbx
cmp    %rcx,%rax
jne    1340 <ltrim+0x230>
cmp    %r8,%rax
jne    1179 <ltrim+0x69>
jmp    11f5 <ltrim+0xe5>

LLVM IR (-O0):
define void @ltrim(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i8* %0, i8** %2
store i32 0, i32* %3
store i32 0, i32* %4
%6 = load i8*, i8** %2
%7 = call i32 @strlen(i8* %6)
store i32 %7, i32* %5
br label %8
8: ; preds = %23, %1
%9 = load i8*, i8** %2
%10 = load i32, i32* %3
%11 = add nsw i32 %10, 1
store i32 %11, i32* %3
%12 = sext i32 %10 to i64
%13 = getelementptr inbounds i8, i8* %9, i64 %12
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = icmp eq i32 %15, 32
br i1 %16, label %17, label %21
17: ; preds = %8
%18 = load i32, i32* %3
%19 = load i32, i32* %5
%20 = icmp slt i32 %18, %19
br label %21
21: ; preds = %17, %8
%22 = phi i1 [ false, %8 ], [ %20, %17 ]
br i1 %22, label %23, label %24
23: ; preds = %21
br label %8
24: ; preds = %21
store i32 0, i32* %4
br label %25
25: ; preds = %42, %24
%26 = load i32, i32* %4
%27 = load i32, i32* %5
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %45
29: ; preds = %25
%30 = load i8*, i8** %2
%31 = load i32, i32* %4
%32 = load i32, i32* %3
%33 = add nsw i32 %31, %32
%34 = sub nsw i32 %33, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %30, i64 %35
%37 = load i8, i8* %36
%38 = load i8*, i8** %2
%39 = load i32, i32* %4
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i8, i8* %38, i64 %40
store i8 %37, i8* %41
br label %42
42: ; preds = %29
%43 = load i32, i32* %4
%44 = add nsw i32 %43, 1
store i32 %44, i32* %4
br label %25
45: ; preds = %25
%46 = load i8*, i8** %2
%47 = load i32, i32* %4
%48 = load i32, i32* %3
%49 = add nsw i32 %47, %48
%50 = sub nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %46, i64 %51
store i8 0, i8* %52
ret void
}

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