#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 /*<<< orphan*/ bar(char *);
int foo1(unsigned short l) {
  char c[10000] = {};
  unsigned short nchar = 9999;
  while (nchar-- != l) {
    c[nchar] = 'A';
  }
  bar(c);
  return 0;
}


x86 assembly (clang, -O0):
<foo1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2730,%rsp
mov    %di,%ax
mov    %ax,-0x2(%rbp)
lea    -0x2720(%rbp),%rdi
xor    %esi,%esi
mov    $0x2710,%edx
call   1040 <memset@plt>
movw   $0x270f,-0x2722(%rbp)
0f 27
mov    -0x2722(%rbp),%ax
mov    %ax,%cx
add    $0xffff,%cx
mov    %cx,-0x2722(%rbp)
movzwl %ax,%eax
movzwl -0x2(%rbp),%ecx
cmp    %ecx,%eax
je     1186 <foo1+0x66>
movzwl -0x2722(%rbp),%eax
movb   $0x41,-0x2720(%rbp,%rax,1)
41
jmp    114e <foo1+0x2e>
lea    -0x2720(%rbp),%rdi
call   1030 <bar@plt>
xor    %eax,%eax
add    $0x2730,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo1>:
push   %rbp
push   %rbx
sub    $0x2718,%rsp
mov    %edi,%ebp
mov    %rsp,%rdi
mov    $0x2710,%edx
xor    %esi,%esi
call   1040 <memset@plt>
cmp    $0x270f,%ebp
je     131d <foo1+0x1fd>
mov    $0x270e,%edx
sub    %ebp,%edx
mov    $0x270e,%cx
cmp    $0x7,%dx
jb     12be <foo1+0x19e>
movzwl %bp,%eax
cmp    $0x270e,%eax
ja     12be <foo1+0x19e>
xor    %eax,%eax
cmp    $0x1f,%dx
jb     1259 <foo1+0x139>
movzwl %dx,%r8d
add    $0x1,%r8d
mov    %r8d,%eax
and    $0xffffffe0,%eax
lea    -0x20(%rax),%ecx
mov    %ecx,%edi
shr    $0x5,%edi
add    $0x1,%edi
mov    %edi,%edx
and    $0x3,%edx
xor    %esi,%esi
cmp    $0x60,%ecx
jb     1212 <foo1+0xf2>
and    $0xfffffffc,%edi
xor    %esi,%esi
movaps 0xe5a(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
lea    0x270e(%rsi),%ecx
and    $0xff8e,%ecx
movups %xmm0,-0xf(%rsp,%rcx,1)
movups %xmm0,-0x1f(%rsp,%rcx,1)
lea    0x26ee(%rsi),%ecx
and    $0xffee,%ecx
movups %xmm0,-0xf(%rsp,%rcx,1)
movups %xmm0,-0x1f(%rsp,%rcx,1)
lea    0x26ce(%rsi),%ecx
and    $0xffce,%ecx
movups %xmm0,-0xf(%rsp,%rcx,1)
movups %xmm0,-0x1f(%rsp,%rcx,1)
lea    0x26ae(%rsi),%ecx
and    $0xffae,%ecx
movups %xmm0,-0xf(%rsp,%rcx,1)
movups %xmm0,-0x1f(%rsp,%rcx,1)
add    $0xffffff80,%esi
add    $0xfffffffc,%edi
jne    11b0 <foo1+0x90>
neg    %esi
test   %edx,%edx
je     124a <foo1+0x12a>
mov    $0x270e,%edi
sub    %esi,%edi
movaps 0xddc(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %edi,%ecx
and    $0xffee,%ecx
movups %xmm0,-0xf(%rsp,%rcx,1)
movups %xmm0,-0x1f(%rsp,%rcx,1)
add    $0xffffffe0,%edi
add    $0xffffffff,%edx
jne    1230 <foo1+0x110>
cmp    %eax,%r8d
je     131d <foo1+0x1fd>
test   $0x18,%r8b
je     12b7 <foo1+0x197>
mov    $0x270e,%edx
mov    $0x270e,%ecx
sub    %ebp,%ecx
movzwl %cx,%r8d
add    $0x1,%r8d
mov    %r8d,%edi
and    $0xfffffff8,%edi
mov    $0x270e,%ecx
sub    %edi,%ecx
sub    %eax,%edx
movabs $0x4141414141414141,%rax
41 41 41
cs nopw 0x0(%rax,%rax,1)
mov    %edx,%esi
lea    (%rdi,%rdx,1),%ebx
add    $0xfffffff8,%ebx
and    $0xfffe,%edx
mov    %rax,-0x7(%rsp,%rdx,1)
add    $0xfffffff8,%esi
mov    %esi,%edx
cmp    $0x270e,%ebx
jne    1290 <foo1+0x170>
cmp    %edi,%r8d
jne    12be <foo1+0x19e>
jmp    131d <foo1+0x1fd>
mov    $0x270e,%ecx
sub    %eax,%ecx
mov    %ecx,%eax
sub    %ebp,%eax
lea    0x1(%rax),%edx
and    $0x3,%dx
je     12e0 <foo1+0x1c0>
nopl   0x0(%rax,%rax,1)
movzwl %cx,%esi
movb   $0x41,(%rsp,%rsi,1)
add    $0xffffffff,%ecx
add    $0xffff,%dx
jne    12d0 <foo1+0x1b0>
cmp    $0x3,%ax
jb     131d <foo1+0x1fd>
add    $0xffffffff,%ebp
nopl   0x0(%rax)
movzwl %cx,%eax
movb   $0x41,(%rsp,%rax,1)
lea    -0x1(%rcx),%eax
movzwl %ax,%eax
movb   $0x41,(%rsp,%rax,1)
lea    -0x2(%rcx),%eax
movzwl %ax,%eax
movb   $0x41,(%rsp,%rax,1)
lea    -0x3(%rcx),%eax
movzwl %ax,%eax
movb   $0x41,(%rsp,%rax,1)
add    $0xfffffffc,%ecx
cmp    %cx,%bp
jne    12f0 <foo1+0x1d0>
mov    %rsp,%rdi
call   1030 <bar@plt>
xor    %eax,%eax
add    $0x2718,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i32 @foo1(i16 zeroext %0) {
%2 = alloca i16
%3 = alloca [10000 x i8]
%4 = alloca i16
store i16 %0, i16* %2
%5 = bitcast [10000 x i8]* %3 to i8*
store i16 9999, i16* %4
br label %6
6: ; preds = %13, %1
%7 = load i16, i16* %4
%8 = add i16 %7, -1
store i16 %8, i16* %4
%9 = zext i16 %7 to i32
%10 = load i16, i16* %2
%11 = zext i16 %10 to i32
%12 = icmp ne i32 %9, %11
br i1 %12, label %13, label %17
13: ; preds = %6
%14 = load i16, i16* %4
%15 = zext i16 %14 to i64
%16 = getelementptr inbounds [10000 x i8], [10000 x i8]* %3, i64 0, i64 %15
store i8 65, i8* %16
br label %6
17: ; preds = %6
%18 = getelementptr inbounds [10000 x i8], [10000 x i8]* %3, i64 0, i64 0
%19 = call i32 @bar(i8* %18)
ret i32 0
}

LLVM IR (-O2):
define i32 @foo1(i16 zeroext %0) {
%2 = alloca [10000 x i8]
%3 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 0
%4 = icmp eq i16 %0, 9999
br i1 %4, label %138, label %5
5: ; preds = %1
%6 = sub i16 9998, %0
%7 = zext i16 %6 to i32
%8 = add nuw nsw i32 %7, 1
%9 = icmp ult i16 %6, 7
%10 = icmp ugt i16 %0, 9998
%11 = or i1 %9, %10
br i1 %11, label %105, label %12
12: ; preds = %5
%13 = icmp ult i16 %6, 31
br i1 %13, label %85, label %14
14: ; preds = %12
%15 = and i32 %8, 131040
%16 = add nsw i32 %15, -32
%17 = lshr exact i32 %16, 5
%18 = add nuw nsw i32 %17, 1
%19 = and i32 %18, 3
%20 = icmp ult i32 %16, 96
br i1 %20, label %61, label %21
21: ; preds = %14
%22 = and i32 %18, 268435452
br label %23
23: ; preds = %23, %21
%24 = phi i32 [ 0, %21 ], [ %58, %23 ]
%25 = phi i32 [ 0, %21 ], [ %59, %23 ]
%26 = sub i32 9998, %24
%27 = and i32 %26, 65422
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %28
%30 = getelementptr inbounds i8, i8* %29, i64 -15
%31 = bitcast i8* %30 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %31
%32 = getelementptr inbounds i8, i8* %29, i64 -31
%33 = bitcast i8* %32 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %33
%34 = sub i32 9966, %24
%35 = and i32 %34, 65518
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %36
%38 = getelementptr inbounds i8, i8* %37, i64 -15
%39 = bitcast i8* %38 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %39
%40 = getelementptr inbounds i8, i8* %37, i64 -31
%41 = bitcast i8* %40 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %41
%42 = sub i32 9934, %24
%43 = and i32 %42, 65486
%44 = zext i32 %43 to i64
%45 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %44
%46 = getelementptr inbounds i8, i8* %45, i64 -15
%47 = bitcast i8* %46 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %47
%48 = getelementptr inbounds i8, i8* %45, i64 -31
%49 = bitcast i8* %48 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %49
%50 = sub i32 9902, %24
%51 = and i32 %50, 65454
%52 = zext i32 %51 to i64
%53 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %52
%54 = getelementptr inbounds i8, i8* %53, i64 -15
%55 = bitcast i8* %54 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %55
%56 = getelementptr inbounds i8, i8* %53, i64 -31
%57 = bitcast i8* %56 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %57
%58 = add nuw i32 %24, 128
%59 = add i32 %25, 4
%60 = icmp eq i32 %59, %22
br i1 %60, label %61, label %23
61: ; preds = %23, %14
%62 = phi i32 [ 0, %14 ], [ %58, %23 ]
%63 = icmp eq i32 %19, 0
br i1 %63, label %78, label %64
64: ; preds = %61, %64
%65 = phi i32 [ %75, %64 ], [ %62, %61 ]
%66 = phi i32 [ %76, %64 ], [ 0, %61 ]
%67 = sub i32 9998, %65
%68 = and i32 %67, 65518
%69 = zext i32 %68 to i64
%70 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %69
%71 = getelementptr inbounds i8, i8* %70, i64 -15
%72 = bitcast i8* %71 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %72
%73 = getelementptr inbounds i8, i8* %70, i64 -31
%74 = bitcast i8* %73 to <16 x i8>*
store <16 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <16 x i8>* %74
%75 = add nuw i32 %65, 32
%76 = add i32 %66, 1
%77 = icmp eq i32 %76, %19
br i1 %77, label %78, label %64
78: ; preds = %64, %61
%79 = icmp eq i32 %8, %15
br i1 %79, label %138, label %80
80: ; preds = %78
%81 = trunc i32 %15 to i16
%82 = sub i16 9998, %81
%83 = and i32 %8, 24
%84 = icmp eq i32 %83, 0
br i1 %84, label %105, label %85
85: ; preds = %12, %80
%86 = phi i32 [ %15, %80 ], [ 0, %12 ]
%87 = sub i16 9998, %0
%88 = zext i16 %87 to i32
%89 = add nuw nsw i32 %88, 1
%90 = and i32 %89, 131064
%91 = trunc i32 %90 to i16
%92 = sub i16 9998, %91
br label %93
93: ; preds = %93, %85
%94 = phi i32 [ %86, %85 ], [ %101, %93 ]
%95 = sub i32 9998, %94
%96 = and i32 %95, 65534
%97 = zext i32 %96 to i64
%98 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %97
%99 = getelementptr inbounds i8, i8* %98, i64 -7
%100 = bitcast i8* %99 to <8 x i8>*
store <8 x i8> <i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65, i8 65>, <8 x i8>* %100
%101 = add nuw i32 %94, 8
%102 = icmp eq i32 %101, %90
br i1 %102, label %103, label %93
103: ; preds = %93
%104 = icmp eq i32 %89, %90
br i1 %104, label %138, label %105
105: ; preds = %5, %80, %103
%106 = phi i16 [ 9998, %5 ], [ %82, %80 ], [ %92, %103 ]
%107 = add i16 %106, 1
%108 = sub i16 %107, %0
%109 = sub i16 %106, %0
%110 = and i16 %108, 3
%111 = icmp eq i16 %110, 0
br i1 %111, label %120, label %112
112: ; preds = %105, %112
%113 = phi i16 [ %117, %112 ], [ %106, %105 ]
%114 = phi i16 [ %118, %112 ], [ 0, %105 ]
%115 = zext i16 %113 to i64
%116 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %115
store i8 65, i8* %116
%117 = add i16 %113, -1
%118 = add i16 %114, 1
%119 = icmp eq i16 %118, %110
br i1 %119, label %120, label %112
120: ; preds = %112, %105
%121 = phi i16 [ %106, %105 ], [ %117, %112 ]
%122 = icmp ult i16 %109, 3
br i1 %122, label %138, label %123
123: ; preds = %120, %123
%124 = phi i16 [ %136, %123 ], [ %121, %120 ]
%125 = zext i16 %124 to i64
%126 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %125
store i8 65, i8* %126
%127 = add i16 %124, -1
%128 = zext i16 %127 to i64
%129 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %128
store i8 65, i8* %129
%130 = add i16 %124, -2
%131 = zext i16 %130 to i64
%132 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %131
store i8 65, i8* %132
%133 = add i16 %124, -3
%134 = zext i16 %133 to i64
%135 = getelementptr inbounds [10000 x i8], [10000 x i8]* %2, i64 0, i64 %134
store i8 65, i8* %135
%136 = add i16 %124, -4
%137 = icmp eq i16 %133, %0
br i1 %137, label %138, label %123
138: ; preds = %120, %123, %78, %103, %1
%139 = call i32 @bar(i8* %3)
ret i32 0
}