#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(short);
foo() {
  short a[100];
  short b[100];
  short c[100];
  int i;
  for (i = 0; i < 100; i++) {
    a[i] = b[i] + c[i];
  }
  bar(a[2]);
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
sub    $0x280,%rsp
movl   $0x0,-0x274(%rbp)
cmpl   $0x64,-0x274(%rbp)
jge    1178 <foo+0x68>
movslq -0x274(%rbp),%rax
movswl -0x1a0(%rbp,%rax,2),%eax
ff
movslq -0x274(%rbp),%rcx
movswl -0x270(%rbp,%rcx,2),%ecx
ff
add    %ecx,%eax
mov    %ax,%cx
movslq -0x274(%rbp),%rax
mov    %cx,-0xd0(%rbp,%rax,2)
ff
mov    -0x274(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x274(%rbp)
jmp    1125 <foo+0x15>
movswl -0xcc(%rbp),%edi
call   1030 <bar@plt>
mov    -0x4(%rbp),%eax
add    $0x280,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
sub    $0x1e8,%rsp
movdqa 0x50(%rsp),%xmm0
movdqa 0x60(%rsp),%xmm1
movdqa 0x70(%rsp),%xmm2
paddw  0x120(%rsp),%xmm0
movdqa 0x80(%rsp),%xmm3
movdqa %xmm0,-0x80(%rsp)
paddw  0x130(%rsp),%xmm1
movdqa %xmm1,-0x70(%rsp)
paddw  0x140(%rsp),%xmm2
movdqa %xmm2,-0x60(%rsp)
paddw  0x150(%rsp),%xmm3
movdqa %xmm3,-0x50(%rsp)
movdqa 0x90(%rsp),%xmm0
paddw  0x160(%rsp),%xmm0
movdqa %xmm0,-0x40(%rsp)
movdqa 0xa0(%rsp),%xmm0
paddw  0x170(%rsp),%xmm0
movdqa %xmm0,-0x30(%rsp)
movdqa 0xb0(%rsp),%xmm0
movdqa 0xc0(%rsp),%xmm1
movdqa 0xd0(%rsp),%xmm2
paddw  0x180(%rsp),%xmm0
movdqa 0xe0(%rsp),%xmm3
movdqa %xmm0,-0x20(%rsp)
paddw  0x190(%rsp),%xmm1
movdqa %xmm1,-0x10(%rsp)
paddw  0x1a0(%rsp),%xmm2
movdqa %xmm2,(%rsp)
paddw  0x1b0(%rsp),%xmm3
movdqa %xmm3,0x10(%rsp)
movdqa 0xf0(%rsp),%xmm0
paddw  0x1c0(%rsp),%xmm0
movdqa %xmm0,0x20(%rsp)
movdqa 0x100(%rsp),%xmm0
paddw  0x1d0(%rsp),%xmm0
movdqa %xmm0,0x30(%rsp)
movzwl 0x110(%rsp),%eax
add    0x1e0(%rsp),%ax
mov    %ax,0x40(%rsp)
movzwl 0x112(%rsp),%eax
add    0x1e2(%rsp),%ax
mov    %ax,0x42(%rsp)
movzwl 0x114(%rsp),%eax
add    0x1e4(%rsp),%ax
mov    %ax,0x44(%rsp)
movzwl 0x116(%rsp),%eax
add    0x1e6(%rsp),%ax
mov    %ax,0x46(%rsp)
movswl -0x7c(%rsp),%edi
add    $0x1e8,%rsp
jmp    1030 <bar@plt>

LLVM IR (-O0):
define i32 @foo() {
%1 = alloca i32
%2 = alloca [100 x i16]
%3 = alloca [100 x i16]
%4 = alloca [100 x i16]
%5 = alloca i32
store i32 0, i32* %5
br label %6
6: ; preds = %25, %0
%7 = load i32, i32* %5
%8 = icmp slt i32 %7, 100
br i1 %8, label %9, label %28
9: ; preds = %6
%10 = load i32, i32* %5
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds [100 x i16], [100 x i16]* %3, i64 0, i64 %11
%13 = load i16, i16* %12
%14 = sext i16 %13 to i32
%15 = load i32, i32* %5
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds [100 x i16], [100 x i16]* %4, i64 0, i64 %16
%18 = load i16, i16* %17
%19 = sext i16 %18 to i32
%20 = add nsw i32 %14, %19
%21 = trunc i32 %20 to i16
%22 = load i32, i32* %5
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [100 x i16], [100 x i16]* %2, i64 0, i64 %23
store i16 %21, i16* %24
br label %25
25: ; preds = %9
%26 = load i32, i32* %5
%27 = add nsw i32 %26, 1
store i32 %27, i32* %5
br label %6
28: ; preds = %6
%29 = getelementptr inbounds [100 x i16], [100 x i16]* %2, i64 0, i64 2
%30 = load i16, i16* %29
%31 = call i32 @bar(i16 signext %30)
%32 = load i32, i32* %1
ret i32 %32
}

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