#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*/ init(int *, int *, int);
int maybe_init_again(int *, int);
void vec_mult(int *p, int *v1, int *v2, int N) {
  int i;
  init(v1, v2, N);
#pragma omp target data map(to : v1[:N], v2[:N]) map(from : p [0:N])
  {
    int changed;
#pragma omp target
#pragma omp parallel for
    for (i = 0; i < N; i++)
      p[i] = v1[i] * v2[i];
    changed = maybe_init_again(v1, N);
#pragma omp target update if (changed) to(v1[:N])
    changed = maybe_init_again(v2, N);
#pragma omp target update if (changed) to(v2[:N])
#pragma omp target
#pragma omp parallel for
    for (i = 0; i < N; i++)
      p[i] = p[i] + (v1[i] * v2[i]);
  }
}


x86 assembly (clang, -O0):
<vec_mult>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
call   1030 <init@plt>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    118a <vec_mult+0x6a>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
imul   (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    114e <vec_mult+0x2e>
mov    -0x10(%rbp),%rdi
mov    -0x1c(%rbp),%esi
call   1040 <maybe_init_again@plt>
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x1c(%rbp),%esi
call   1040 <maybe_init_again@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11f8 <vec_mult+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x20(%rbp),%rsi
imul   (%rcx,%rsi,4),%eax
add    %eax,%edx
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11af <vec_mult+0x8f>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<vec_mult>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %ecx,%r12d
mov    %rdx,%r14
mov    %rsi,%r15
mov    %rdi,%rbx
mov    %rsi,%rdi
mov    %rdx,%rsi
mov    %ecx,%edx
call   1030 <init@plt>
test   %r12d,%r12d
jle    1156 <vec_mult+0x36>
mov    %r12d,%ebp
cmp    $0x8,%r12d
jae    1174 <vec_mult+0x54>
xor    %eax,%eax
jmp    132a <vec_mult+0x20a>
mov    %r15,%rdi
mov    %r12d,%esi
call   1040 <maybe_init_again@plt>
mov    %r14,%rdi
mov    %r12d,%esi
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <maybe_init_again@plt>
lea    (%rbx,%rbp,4),%rax
lea    (%r15,%rbp,4),%rcx
cmp    %rbx,%rcx
seta   %dil
lea    (%r14,%rbp,4),%rcx
cmp    %r15,%rax
seta   %dl
cmp    %rbx,%rcx
seta   %cl
cmp    %r14,%rax
seta   %sil
xor    %eax,%eax
test   %dl,%dil
jne    132a <vec_mult+0x20a>
and    %sil,%cl
jne    132a <vec_mult+0x20a>
mov    %ebp,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%rcx
mov    %rcx,%rdx
shr    $0x3,%rdx
add    $0x1,%rdx
test   %rcx,%rcx
je     1611 <vec_mult+0x4f1>
mov    %rdx,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%r15,%rcx,4),%xmm0
movdqu 0x10(%r15,%rcx,4),%xmm1
movdqu (%r14,%rcx,4),%xmm2
movdqu 0x10(%r14,%rcx,4),%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
pshufd $0xf5,%xmm3,%xmm0
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm3
movdqu %xmm2,(%rbx,%rcx,4)
movdqu %xmm3,0x10(%rbx,%rcx,4)
movdqu 0x20(%r15,%rcx,4),%xmm0
movdqu 0x30(%r15,%rcx,4),%xmm1
movdqu 0x20(%r14,%rcx,4),%xmm2
movdqu 0x30(%r14,%rcx,4),%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
pshufd $0xf5,%xmm3,%xmm0
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm3
movdqu %xmm2,0x20(%rbx,%rcx,4)
movdqu %xmm3,0x30(%rbx,%rcx,4)
add    $0x10,%rcx
add    $0xfffffffffffffffe,%rsi
jne    11e0 <vec_mult+0xc0>
test   $0x1,%dl
je     1325 <vec_mult+0x205>
movdqu (%r15,%rcx,4),%xmm0
movdqu 0x10(%r15,%rcx,4),%xmm1
movdqu (%r14,%rcx,4),%xmm2
movdqu 0x10(%r14,%rcx,4),%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
pshufd $0xf5,%xmm3,%xmm0
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm3
movdqu %xmm2,(%rbx,%rcx,4)
movdqu %xmm3,0x10(%rbx,%rcx,4)
cmp    %rbp,%rax
je     13a2 <vec_mult+0x282>
mov    %rax,%rcx
not    %rcx
add    %rbp,%rcx
mov    %rbp,%rdx
and    $0x3,%rdx
je     1356 <vec_mult+0x236>
nopl   0x0(%rax)
mov    (%r14,%rax,4),%esi
imul   (%r15,%rax,4),%esi
mov    %esi,(%rbx,%rax,4)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    1340 <vec_mult+0x220>
cmp    $0x3,%rcx
jb     13a2 <vec_mult+0x282>
nopl   0x0(%rax)
mov    (%r14,%rax,4),%ecx
imul   (%r15,%rax,4),%ecx
mov    %ecx,(%rbx,%rax,4)
mov    0x4(%r14,%rax,4),%ecx
imul   0x4(%r15,%rax,4),%ecx
mov    %ecx,0x4(%rbx,%rax,4)
mov    0x8(%r14,%rax,4),%ecx
imul   0x8(%r15,%rax,4),%ecx
mov    %ecx,0x8(%rbx,%rax,4)
mov    0xc(%r14,%rax,4),%ecx
imul   0xc(%r15,%rax,4),%ecx
mov    %ecx,0xc(%rbx,%rax,4)
add    $0x4,%rax
cmp    %rax,%rbp
jne    1360 <vec_mult+0x240>
mov    %r15,%rdi
mov    %r12d,%esi
call   1040 <maybe_init_again@plt>
mov    %r14,%rdi
mov    %r12d,%esi
call   1040 <maybe_init_again@plt>
test   %r12d,%r12d
jle    1608 <vec_mult+0x4e8>
cmp    $0x8,%r12d
jae    1419 <vec_mult+0x2f9>
xor    %eax,%eax
mov    %rax,%rcx
not    %rcx
test   $0x1,%bpl
je     13e5 <vec_mult+0x2c5>
mov    (%r14,%rax,4),%edx
imul   (%r15,%rax,4),%edx
add    %edx,(%rbx,%rax,4)
or     $0x1,%rax
add    %rbp,%rcx
je     1608 <vec_mult+0x4e8>
xchg   %ax,%ax
mov    (%r14,%rax,4),%ecx
imul   (%r15,%rax,4),%ecx
add    %ecx,(%rbx,%rax,4)
mov    0x4(%r14,%rax,4),%ecx
imul   0x4(%r15,%rax,4),%ecx
add    %ecx,0x4(%rbx,%rax,4)
add    $0x2,%rax
cmp    %rax,%rbp
jne    13f0 <vec_mult+0x2d0>
jmp    1608 <vec_mult+0x4e8>
lea    (%rbx,%rbp,4),%rax
lea    (%r15,%rbp,4),%rcx
cmp    %rbx,%rcx
seta   %dil
lea    (%r14,%rbp,4),%rcx
cmp    %r15,%rax
seta   %dl
cmp    %rbx,%rcx
seta   %cl
cmp    %r14,%rax
seta   %sil
xor    %eax,%eax
test   %dl,%dil
jne    13c9 <vec_mult+0x2a9>
and    %sil,%cl
jne    13c9 <vec_mult+0x2a9>
mov    %ebp,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%rcx
mov    %rcx,%rdx
shr    $0x3,%rdx
add    $0x1,%rdx
test   %rcx,%rcx
je     1621 <vec_mult+0x501>
mov    %rdx,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movdqu (%r15,%rcx,4),%xmm0
movdqu 0x10(%r15,%rcx,4),%xmm1
movdqu (%r14,%rcx,4),%xmm2
movdqu 0x10(%r14,%rcx,4),%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm4,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
pshufd $0xf5,%xmm3,%xmm0
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm3
movdqu (%rbx,%rcx,4),%xmm0
paddd  %xmm2,%xmm0
movdqu 0x10(%rbx,%rcx,4),%xmm1
paddd  %xmm3,%xmm1
movdqu 0x20(%rbx,%rcx,4),%xmm2
movdqu 0x30(%rbx,%rcx,4),%xmm3
movdqu %xmm0,(%rbx,%rcx,4)
movdqu %xmm1,0x10(%rbx,%rcx,4)
movdqu 0x20(%r15,%rcx,4),%xmm0
movdqu 0x30(%r15,%rcx,4),%xmm1
movdqu 0x20(%r14,%rcx,4),%xmm4
movdqu 0x30(%r14,%rcx,4),%xmm5
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm0,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm6,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm4
paddd  %xmm2,%xmm4
pshufd $0xf5,%xmm5,%xmm0
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm2
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm3,%xmm2
movdqu %xmm4,0x20(%rbx,%rcx,4)
movdqu %xmm2,0x30(%rbx,%rcx,4)
add    $0x10,%rcx
add    $0xfffffffffffffffe,%rsi
jne    1480 <vec_mult+0x360>
test   $0x1,%dl
je     15ff <vec_mult+0x4df>
movdqu (%rbx,%rcx,4),%xmm0
movdqu 0x10(%rbx,%rcx,4),%xmm1
movdqu (%r15,%rcx,4),%xmm2
movdqu 0x10(%r15,%rcx,4),%xmm3
movdqu (%r14,%rcx,4),%xmm4
movdqu 0x10(%r14,%rcx,4),%xmm5
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm2,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm6,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm4
paddd  %xmm0,%xmm4
pshufd $0xf5,%xmm5,%xmm0
pmuludq %xmm3,%xmm5
pshufd $0xe8,%xmm5,%xmm2
pshufd $0xf5,%xmm3,%xmm3
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm1,%xmm2
movdqu %xmm4,(%rbx,%rcx,4)
movdqu %xmm2,0x10(%rbx,%rcx,4)
cmp    %rbp,%rax
jne    13c9 <vec_mult+0x2a9>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ecx,%ecx
test   $0x1,%dl
jne    12c0 <vec_mult+0x1a0>
jmp    1325 <vec_mult+0x205>
xor    %ecx,%ecx
test   $0x1,%dl
jne    1587 <vec_mult+0x467>
jmp    15ff <vec_mult+0x4df>

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

LLVM IR (-O2):
define void @vec_mult(i32* nocapture %0, i32* %1, i32* %2, i32 %3) {
%5 = tail call i32 @init(i32* %1, i32* %2, i32 %3)
%6 = icmp sgt i32 %3, 0
br i1 %6, label %7, label %300
7: ; preds = %4
%8 = zext i32 %3 to i64
%9 = icmp ult i32 %3, 8
br i1 %9, label %97, label %10
10: ; preds = %7
%11 = getelementptr i32, i32* %0, i64 %8
%12 = getelementptr i32, i32* %1, i64 %8
%13 = getelementptr i32, i32* %2, i64 %8
%14 = icmp ugt i32* %12, %0
%15 = icmp ugt i32* %11, %1
%16 = and i1 %14, %15
%17 = icmp ugt i32* %13, %0
%18 = icmp ugt i32* %11, %2
%19 = and i1 %17, %18
%20 = or i1 %16, %19
br i1 %20, label %97, label %21
21: ; preds = %10
%22 = and i64 %8, 4294967288
%23 = add nsw i64 %22, -8
%24 = lshr exact i64 %23, 3
%25 = add nuw nsw i64 %24, 1
%26 = and i64 %25, 1
%27 = icmp eq i64 %23, 0
br i1 %27, label %73, label %28
28: ; preds = %21
%29 = and i64 %25, 4611686018427387902
br label %30
30: ; preds = %30, %28
%31 = phi i64 [ 0, %28 ], [ %70, %30 ]
%32 = phi i64 [ 0, %28 ], [ %71, %30 ]
%33 = getelementptr inbounds i32, i32* %1, i64 %31
%34 = bitcast i32* %33 to <4 x i32>*
%35 = load <4 x i32>, <4 x i32>* %34
%36 = getelementptr inbounds i32, i32* %33, i64 4
%37 = bitcast i32* %36 to <4 x i32>*
%38 = load <4 x i32>, <4 x i32>* %37
%39 = getelementptr inbounds i32, i32* %2, i64 %31
%40 = bitcast i32* %39 to <4 x i32>*
%41 = load <4 x i32>, <4 x i32>* %40
%42 = getelementptr inbounds i32, i32* %39, i64 4
%43 = bitcast i32* %42 to <4 x i32>*
%44 = load <4 x i32>, <4 x i32>* %43
%45 = mul nsw <4 x i32> %41, %35
%46 = mul nsw <4 x i32> %44, %38
%47 = getelementptr inbounds i32, i32* %0, i64 %31
%48 = bitcast i32* %47 to <4 x i32>*
store <4 x i32> %45, <4 x i32>* %48
%49 = getelementptr inbounds i32, i32* %47, i64 4
%50 = bitcast i32* %49 to <4 x i32>*
store <4 x i32> %46, <4 x i32>* %50
%51 = or i64 %31, 8
%52 = getelementptr inbounds i32, i32* %1, i64 %51
%53 = bitcast i32* %52 to <4 x i32>*
%54 = load <4 x i32>, <4 x i32>* %53
%55 = getelementptr inbounds i32, i32* %52, i64 4
%56 = bitcast i32* %55 to <4 x i32>*
%57 = load <4 x i32>, <4 x i32>* %56
%58 = getelementptr inbounds i32, i32* %2, i64 %51
%59 = bitcast i32* %58 to <4 x i32>*
%60 = load <4 x i32>, <4 x i32>* %59
%61 = getelementptr inbounds i32, i32* %58, i64 4
%62 = bitcast i32* %61 to <4 x i32>*
%63 = load <4 x i32>, <4 x i32>* %62
%64 = mul nsw <4 x i32> %60, %54
%65 = mul nsw <4 x i32> %63, %57
%66 = getelementptr inbounds i32, i32* %0, i64 %51
%67 = bitcast i32* %66 to <4 x i32>*
store <4 x i32> %64, <4 x i32>* %67
%68 = getelementptr inbounds i32, i32* %66, i64 4
%69 = bitcast i32* %68 to <4 x i32>*
store <4 x i32> %65, <4 x i32>* %69
%70 = add nuw i64 %31, 16
%71 = add i64 %32, 2
%72 = icmp eq i64 %71, %29
br i1 %72, label %73, label %30
73: ; preds = %30, %21
%74 = phi i64 [ 0, %21 ], [ %70, %30 ]
%75 = icmp eq i64 %26, 0
br i1 %75, label %95, label %76
76: ; preds = %73
%77 = getelementptr inbounds i32, i32* %1, i64 %74
%78 = bitcast i32* %77 to <4 x i32>*
%79 = load <4 x i32>, <4 x i32>* %78
%80 = getelementptr inbounds i32, i32* %77, i64 4
%81 = bitcast i32* %80 to <4 x i32>*
%82 = load <4 x i32>, <4 x i32>* %81
%83 = getelementptr inbounds i32, i32* %2, i64 %74
%84 = bitcast i32* %83 to <4 x i32>*
%85 = load <4 x i32>, <4 x i32>* %84
%86 = getelementptr inbounds i32, i32* %83, i64 4
%87 = bitcast i32* %86 to <4 x i32>*
%88 = load <4 x i32>, <4 x i32>* %87
%89 = mul nsw <4 x i32> %85, %79
%90 = mul nsw <4 x i32> %88, %82
%91 = getelementptr inbounds i32, i32* %0, i64 %74
%92 = bitcast i32* %91 to <4 x i32>*
store <4 x i32> %89, <4 x i32>* %92
%93 = getelementptr inbounds i32, i32* %91, i64 4
%94 = bitcast i32* %93 to <4 x i32>*
store <4 x i32> %90, <4 x i32>* %94
br label %95
95: ; preds = %73, %76
%96 = icmp eq i64 %22, %8
br i1 %96, label %149, label %97
97: ; preds = %10, %7, %95
%98 = phi i64 [ 0, %10 ], [ 0, %7 ], [ %22, %95 ]
%99 = xor i64 %98, -1
%100 = add nsw i64 %99, %8
%101 = and i64 %8, 3
%102 = icmp eq i64 %101, 0
br i1 %102, label %115, label %103
103: ; preds = %97, %103
%104 = phi i64 [ %112, %103 ], [ %98, %97 ]
%105 = phi i64 [ %113, %103 ], [ 0, %97 ]
%106 = getelementptr inbounds i32, i32* %1, i64 %104
%107 = load i32, i32* %106
%108 = getelementptr inbounds i32, i32* %2, i64 %104
%109 = load i32, i32* %108
%110 = mul nsw i32 %109, %107
%111 = getelementptr inbounds i32, i32* %0, i64 %104
store i32 %110, i32* %111
%112 = add nuw nsw i64 %104, 1
%113 = add i64 %105, 1
%114 = icmp eq i64 %113, %101
br i1 %114, label %115, label %103
115: ; preds = %103, %97
%116 = phi i64 [ %98, %97 ], [ %112, %103 ]
%117 = icmp ult i64 %100, 3
br i1 %117, label %149, label %118
118: ; preds = %115, %118
%119 = phi i64 [ %147, %118 ], [ %116, %115 ]
%120 = getelementptr inbounds i32, i32* %1, i64 %119
%121 = load i32, i32* %120
%122 = getelementptr inbounds i32, i32* %2, i64 %119
%123 = load i32, i32* %122
%124 = mul nsw i32 %123, %121
%125 = getelementptr inbounds i32, i32* %0, i64 %119
store i32 %124, i32* %125
%126 = add nuw nsw i64 %119, 1
%127 = getelementptr inbounds i32, i32* %1, i64 %126
%128 = load i32, i32* %127
%129 = getelementptr inbounds i32, i32* %2, i64 %126
%130 = load i32, i32* %129
%131 = mul nsw i32 %130, %128
%132 = getelementptr inbounds i32, i32* %0, i64 %126
store i32 %131, i32* %132
%133 = add nuw nsw i64 %119, 2
%134 = getelementptr inbounds i32, i32* %1, i64 %133
%135 = load i32, i32* %134
%136 = getelementptr inbounds i32, i32* %2, i64 %133
%137 = load i32, i32* %136
%138 = mul nsw i32 %137, %135
%139 = getelementptr inbounds i32, i32* %0, i64 %133
store i32 %138, i32* %139
%140 = add nuw nsw i64 %119, 3
%141 = getelementptr inbounds i32, i32* %1, i64 %140
%142 = load i32, i32* %141
%143 = getelementptr inbounds i32, i32* %2, i64 %140
%144 = load i32, i32* %143
%145 = mul nsw i32 %144, %142
%146 = getelementptr inbounds i32, i32* %0, i64 %140
store i32 %145, i32* %146
%147 = add nuw nsw i64 %119, 4
%148 = icmp eq i64 %147, %8
br i1 %148, label %149, label %118
149: ; preds = %115, %118, %95
%150 = tail call i32 @maybe_init_again(i32* %1, i32 %3)
%151 = tail call i32 @maybe_init_again(i32* %2, i32 %3)
br i1 %6, label %152, label %303
152: ; preds = %149
%153 = zext i32 %3 to i64
%154 = icmp ult i32 %3, 8
br i1 %154, label %260, label %155
155: ; preds = %152
%156 = getelementptr i32, i32* %0, i64 %8
%157 = getelementptr i32, i32* %1, i64 %8
%158 = getelementptr i32, i32* %2, i64 %8
%159 = icmp ugt i32* %157, %0
%160 = icmp ugt i32* %156, %1
%161 = and i1 %159, %160
%162 = icmp ugt i32* %158, %0
%163 = icmp ugt i32* %156, %2
%164 = and i1 %162, %163
%165 = or i1 %161, %164
br i1 %165, label %260, label %166
166: ; preds = %155
%167 = and i64 %8, 4294967288
%168 = add nsw i64 %167, -8
%169 = lshr exact i64 %168, 3
%170 = add nuw nsw i64 %169, 1
%171 = and i64 %170, 1
%172 = icmp eq i64 %168, 0
br i1 %172, label %230, label %173
173: ; preds = %166
%174 = and i64 %170, 4611686018427387902
br label %175
175: ; preds = %175, %173
%176 = phi i64 [ 0, %173 ], [ %227, %175 ]
%177 = phi i64 [ 0, %173 ], [ %228, %175 ]
%178 = getelementptr inbounds i32, i32* %0, i64 %176
%179 = bitcast i32* %178 to <4 x i32>*
%180 = load <4 x i32>, <4 x i32>* %179
%181 = getelementptr inbounds i32, i32* %178, i64 4
%182 = bitcast i32* %181 to <4 x i32>*
%183 = load <4 x i32>, <4 x i32>* %182
%184 = getelementptr inbounds i32, i32* %1, i64 %176
%185 = bitcast i32* %184 to <4 x i32>*
%186 = load <4 x i32>, <4 x i32>* %185
%187 = getelementptr inbounds i32, i32* %184, i64 4
%188 = bitcast i32* %187 to <4 x i32>*
%189 = load <4 x i32>, <4 x i32>* %188
%190 = getelementptr inbounds i32, i32* %2, i64 %176
%191 = bitcast i32* %190 to <4 x i32>*
%192 = load <4 x i32>, <4 x i32>* %191
%193 = getelementptr inbounds i32, i32* %190, i64 4
%194 = bitcast i32* %193 to <4 x i32>*
%195 = load <4 x i32>, <4 x i32>* %194
%196 = mul nsw <4 x i32> %192, %186
%197 = mul nsw <4 x i32> %195, %189
%198 = add nsw <4 x i32> %196, %180
%199 = add nsw <4 x i32> %197, %183
%200 = bitcast i32* %178 to <4 x i32>*
store <4 x i32> %198, <4 x i32>* %200
%201 = bitcast i32* %181 to <4 x i32>*
store <4 x i32> %199, <4 x i32>* %201
%202 = or i64 %176, 8
%203 = getelementptr inbounds i32, i32* %0, i64 %202
%204 = bitcast i32* %203 to <4 x i32>*
%205 = load <4 x i32>, <4 x i32>* %204
%206 = getelementptr inbounds i32, i32* %203, i64 4
%207 = bitcast i32* %206 to <4 x i32>*
%208 = load <4 x i32>, <4 x i32>* %207
%209 = getelementptr inbounds i32, i32* %1, i64 %202
%210 = bitcast i32* %209 to <4 x i32>*
%211 = load <4 x i32>, <4 x i32>* %210
%212 = getelementptr inbounds i32, i32* %209, i64 4
%213 = bitcast i32* %212 to <4 x i32>*
%214 = load <4 x i32>, <4 x i32>* %213
%215 = getelementptr inbounds i32, i32* %2, i64 %202
%216 = bitcast i32* %215 to <4 x i32>*
%217 = load <4 x i32>, <4 x i32>* %216
%218 = getelementptr inbounds i32, i32* %215, i64 4
%219 = bitcast i32* %218 to <4 x i32>*
%220 = load <4 x i32>, <4 x i32>* %219
%221 = mul nsw <4 x i32> %217, %211
%222 = mul nsw <4 x i32> %220, %214
%223 = add nsw <4 x i32> %221, %205
%224 = add nsw <4 x i32> %222, %208
%225 = bitcast i32* %203 to <4 x i32>*
store <4 x i32> %223, <4 x i32>* %225
%226 = bitcast i32* %206 to <4 x i32>*
store <4 x i32> %224, <4 x i32>* %226
%227 = add nuw i64 %176, 16
%228 = add i64 %177, 2
%229 = icmp eq i64 %228, %174
br i1 %229, label %230, label %175
230: ; preds = %175, %166
%231 = phi i64 [ 0, %166 ], [ %227, %175 ]
%232 = icmp eq i64 %171, 0
br i1 %232, label %258, label %233
233: ; preds = %230
%234 = getelementptr inbounds i32, i32* %0, i64 %231
%235 = bitcast i32* %234 to <4 x i32>*
%236 = load <4 x i32>, <4 x i32>* %235
%237 = getelementptr inbounds i32, i32* %234, i64 4
%238 = bitcast i32* %237 to <4 x i32>*
%239 = load <4 x i32>, <4 x i32>* %238
%240 = getelementptr inbounds i32, i32* %1, i64 %231
%241 = bitcast i32* %240 to <4 x i32>*
%242 = load <4 x i32>, <4 x i32>* %241
%243 = getelementptr inbounds i32, i32* %240, i64 4
%244 = bitcast i32* %243 to <4 x i32>*
%245 = load <4 x i32>, <4 x i32>* %244
%246 = getelementptr inbounds i32, i32* %2, i64 %231
%247 = bitcast i32* %246 to <4 x i32>*
%248 = load <4 x i32>, <4 x i32>* %247
%249 = getelementptr inbounds i32, i32* %246, i64 4
%250 = bitcast i32* %249 to <4 x i32>*
%251 = load <4 x i32>, <4 x i32>* %250
%252 = mul nsw <4 x i32> %248, %242
%253 = mul nsw <4 x i32> %251, %245
%254 = add nsw <4 x i32> %252, %236
%255 = add nsw <4 x i32> %253, %239
%256 = bitcast i32* %234 to <4 x i32>*
store <4 x i32> %254, <4 x i32>* %256
%257 = bitcast i32* %237 to <4 x i32>*
store <4 x i32> %255, <4 x i32>* %257
br label %258
258: ; preds = %230, %233
%259 = icmp eq i64 %167, %8
br i1 %259, label %303, label %260
260: ; preds = %155, %152, %258
%261 = phi i64 [ 0, %155 ], [ 0, %152 ], [ %167, %258 ]
%262 = xor i64 %261, -1
%263 = and i64 %8, 1
%264 = icmp eq i64 %263, 0
br i1 %264, label %275, label %265
265: ; preds = %260
%266 = getelementptr inbounds i32, i32* %0, i64 %261
%267 = load i32, i32* %266
%268 = getelementptr inbounds i32, i32* %1, i64 %261
%269 = load i32, i32* %268
%270 = getelementptr inbounds i32, i32* %2, i64 %261
%271 = load i32, i32* %270
%272 = mul nsw i32 %271, %269
%273 = add nsw i32 %272, %267
store i32 %273, i32* %266
%274 = or i64 %261, 1
br label %275
275: ; preds = %265, %260
%276 = phi i64 [ %261, %260 ], [ %274, %265 ]
%277 = sub nsw i64 0, %8
%278 = icmp eq i64 %262, %277
br i1 %278, label %303, label %279
279: ; preds = %275, %279
%280 = phi i64 [ %298, %279 ], [ %276, %275 ]
%281 = getelementptr inbounds i32, i32* %0, i64 %280
%282 = load i32, i32* %281
%283 = getelementptr inbounds i32, i32* %1, i64 %280
%284 = load i32, i32* %283
%285 = getelementptr inbounds i32, i32* %2, i64 %280
%286 = load i32, i32* %285
%287 = mul nsw i32 %286, %284
%288 = add nsw i32 %287, %282
store i32 %288, i32* %281
%289 = add nuw nsw i64 %280, 1
%290 = getelementptr inbounds i32, i32* %0, i64 %289
%291 = load i32, i32* %290
%292 = getelementptr inbounds i32, i32* %1, i64 %289
%293 = load i32, i32* %292
%294 = getelementptr inbounds i32, i32* %2, i64 %289
%295 = load i32, i32* %294
%296 = mul nsw i32 %295, %293
%297 = add nsw i32 %296, %291
store i32 %297, i32* %290
%298 = add nuw nsw i64 %280, 2
%299 = icmp eq i64 %298, %153
br i1 %299, label %303, label %279
300: ; preds = %4
%301 = tail call i32 @maybe_init_again(i32* %1, i32 %3)
%302 = tail call i32 @maybe_init_again(i32* %2, i32 %3)
br label %303
303: ; preds = %275, %279, %258, %300, %149
ret void
}