#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 */
typedef int uint16_t;

/* Variables and functions */
int /*<<< orphan*/ consumer(int *);
void multi_loop_uint16_t(uint16_t *x) {
  for (int i = 0; i < 100; ++i)
    x[i] += 4 + i;
  consumer(x);
  for (int i = 0; i < 100; ++i)
    x[i] += 4 + i;
  consumer(x);
  for (int i = 0; i < 100; ++i)
    x[i] += 4 + i;
  consumer(x);
}


x86 assembly (clang, -O0):
<multi_loop_uint16_t>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x64,-0xc(%rbp)
jge    114f <multi_loop_uint16_t+0x3f>
mov    -0xc(%rbp),%edx
add    $0x4,%edx
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1123 <multi_loop_uint16_t+0x13>
mov    -0x8(%rbp),%rdi
call   1030 <consumer@plt>
movl   $0x0,-0x10(%rbp)
cmpl   $0x64,-0x10(%rbp)
jge    118b <multi_loop_uint16_t+0x7b>
mov    -0x10(%rbp),%edx
add    $0x4,%edx
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    115f <multi_loop_uint16_t+0x4f>
mov    -0x8(%rbp),%rdi
call   1030 <consumer@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    11c7 <multi_loop_uint16_t+0xb7>
mov    -0x14(%rbp),%edx
add    $0x4,%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    119b <multi_loop_uint16_t+0x8b>
mov    -0x8(%rbp),%rdi
call   1030 <consumer@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<multi_loop_uint16_t>:
push   %rbx
mov    %rdi,%rbx
movdqa 0xee4(%rip),%xmm0
mov    $0xc,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqu -0x30(%rbx,%rax,4),%xmm1
paddd  %xmm0,%xmm1
paddd  0xece(%rip),%xmm1
movdqu %xmm1,-0x30(%rbx,%rax,4)
cmp    $0x6c,%rax
je     119a <multi_loop_uint16_t+0x8a>
movdqu -0x20(%rbx,%rax,4),%xmm1
movdqu -0x10(%rbx,%rax,4),%xmm2
movdqu (%rbx,%rax,4),%xmm3
paddd  %xmm0,%xmm1
paddd  0xeb5(%rip),%xmm1
movdqu %xmm1,-0x20(%rbx,%rax,4)
paddd  %xmm0,%xmm2
paddd  0xeb3(%rip),%xmm2
movdqu %xmm2,-0x10(%rbx,%rax,4)
paddd  0xeb5(%rip),%xmm0
paddd  %xmm0,%xmm3
movdqu %xmm3,(%rbx,%rax,4)
add    $0x10,%rax
jmp    1130 <multi_loop_uint16_t+0x20>
mov    %rbx,%rdi
call   1030 <consumer@plt>
movdqa 0xe96(%rip),%xmm7
movdqa 0xe7e(%rip),%xmm6
movdqa 0xe66(%rip),%xmm5
movdqa 0xe4e(%rip),%xmm4
movdqa 0xe36(%rip),%xmm0
mov    $0xc,%eax
nop
movdqu -0x30(%rbx,%rax,4),%xmm1
paddd  %xmm0,%xmm1
paddd  %xmm4,%xmm1
movdqu %xmm1,-0x30(%rbx,%rax,4)
cmp    $0x6c,%rax
je     122a <multi_loop_uint16_t+0x11a>
movdqu -0x20(%rbx,%rax,4),%xmm1
movdqu -0x10(%rbx,%rax,4),%xmm2
movdqu (%rbx,%rax,4),%xmm3
paddd  %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqu %xmm1,-0x20(%rbx,%rax,4)
paddd  %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqu %xmm2,-0x10(%rbx,%rax,4)
paddd  %xmm7,%xmm0
paddd  %xmm0,%xmm3
movdqu %xmm3,(%rbx,%rax,4)
add    $0x10,%rax
jmp    11d0 <multi_loop_uint16_t+0xc0>
mov    %rbx,%rdi
call   1030 <consumer@plt>
movdqa 0xe06(%rip),%xmm7
movdqa 0xdee(%rip),%xmm6
movdqa 0xdd6(%rip),%xmm5
movdqa 0xdbe(%rip),%xmm4
movdqa 0xda6(%rip),%xmm0
mov    $0xc,%eax
nop
movdqu -0x30(%rbx,%rax,4),%xmm1
paddd  %xmm0,%xmm1
paddd  %xmm4,%xmm1
movdqu %xmm1,-0x30(%rbx,%rax,4)
cmp    $0x6c,%rax
je     12ba <multi_loop_uint16_t+0x1aa>
movdqu -0x20(%rbx,%rax,4),%xmm1
movdqu -0x10(%rbx,%rax,4),%xmm2
movdqu (%rbx,%rax,4),%xmm3
paddd  %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqu %xmm1,-0x20(%rbx,%rax,4)
paddd  %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqu %xmm2,-0x10(%rbx,%rax,4)
paddd  %xmm7,%xmm0
paddd  %xmm0,%xmm3
movdqu %xmm3,(%rbx,%rax,4)
add    $0x10,%rax
jmp    1260 <multi_loop_uint16_t+0x150>
mov    %rbx,%rdi
pop    %rbx
jmp    1030 <consumer@plt>

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

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