#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*/ mult_cpx_vector_h(short *, short *, short *, unsigned int,
                                     unsigned short, int);
int mult_cpx_matrix_h(short *x1[2][2], short *x2[2][2], short *y[2][2],
                      unsigned int N, unsigned short output_shift,
                      short hermitian) {
  if (hermitian) {
    mult_cpx_vector_h(x2[0][0], x1[0][0], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][1], x1[0][1], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][0], x1[1][0], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][1], x1[1][1], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][0], x1[0][0], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][1], x1[0][1], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][0], x1[1][0], y[1][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][1], x1[1][1], y[1][1], N, output_shift, 1);
  } else {
    mult_cpx_vector_h(x1[0][0], x2[0][0], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][1], x2[0][1], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][0], x2[1][0], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][1], x2[1][1], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][0], x2[0][0], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][1], x2[0][1], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][0], x2[1][0], y[1][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][1], x2[1][1], y[1][1], N, output_shift, 1);
  }
}


x86 assembly (clang, -O0):
<mult_cpx_matrix_h>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %r8d,-0x40(%rbp)
mov    %ecx,%eax
mov    -0x40(%rbp),%ecx
mov    %eax,-0x3c(%rbp)
mov    %rdx,%rax
mov    -0x3c(%rbp),%edx
mov    %rax,-0x38(%rbp)
mov    %rsi,%rax
mov    -0x38(%rbp),%rsi
mov    %rax,-0x30(%rbp)
mov    %rdi,%r8
mov    -0x30(%rbp),%rdi
mov    %r9w,%ax
mov    %r8,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
mov    %cx,-0x26(%rbp)
mov    %ax,-0x28(%rbp)
cmpw   $0x0,-0x28(%rbp)
je     12bd <mult_cpx_matrix_h+0x1ad>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x10(%rbp),%rax
mov    (%rax),%rsi
mov    -0x20(%rbp),%rax
mov    (%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    (%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    (%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rdi
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
jmp    140f <mult_cpx_matrix_h+0x2ff>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    (%rax),%rsi
mov    -0x20(%rbp),%rax
mov    (%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    (%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    (%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rsi
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rdx
mov    -0x24(%rbp),%ecx
mov    $0x1,%r9d
movzwl -0x26(%rbp),%r8d
call   1030 <mult_cpx_vector_h@plt>
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mult_cpx_matrix_h>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %ecx,%r14d
mov    %rdx,%rbx
mov    %rsi,%r12
mov    %rdi,%rbp
movzwl %r8w,%r15d
test   %r9w,%r9w
je     1200 <mult_cpx_matrix_h+0xf0>
mov    (%r12),%rdi
mov    0x0(%rbp),%rsi
mov    (%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x8(%r12),%rdi
mov    0x8(%rbp),%rsi
mov    (%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    (%r12),%rdi
mov    0x10(%rbp),%rsi
mov    0x10(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x8(%r12),%rdi
lea    0x18(%rbp),%rax
mov    %rax,(%rsp)
mov    0x18(%rbp),%rsi
mov    0x10(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x10(%r12),%rdi
mov    0x0(%rbp),%rsi
mov    0x8(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
lea    0x18(%r12),%r13
mov    0x18(%r12),%rdi
mov    0x8(%rbp),%rsi
mov    0x8(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x10(%r12),%rdi
mov    0x10(%rbp),%rsi
jmp    12c6 <mult_cpx_matrix_h+0x1b6>
mov    0x0(%rbp),%rdi
mov    (%r12),%rsi
mov    (%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x8(%rbp),%rdi
mov    0x8(%r12),%rsi
mov    (%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x0(%rbp),%rdi
mov    0x10(%r12),%rsi
mov    0x8(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x8(%rbp),%rdi
lea    0x18(%r12),%rax
mov    %rax,(%rsp)
mov    0x18(%r12),%rsi
mov    0x8(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x10(%rbp),%rdi
mov    (%r12),%rsi
mov    0x10(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
lea    0x18(%rbp),%r13
mov    0x18(%rbp),%rdi
mov    0x8(%r12),%rsi
mov    0x10(%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x10(%rbp),%rdi
mov    0x10(%r12),%rsi
mov    0x18(%rbx),%rdx
add    $0x18,%rbx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
call   1030 <mult_cpx_vector_h@plt>
mov    0x0(%r13),%rdi
mov    (%rsp),%rax
mov    (%rax),%rsi
mov    (%rbx),%rdx
mov    %r14d,%ecx
mov    %r15d,%r8d
mov    $0x1,%r9d
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <mult_cpx_vector_h@plt>

LLVM IR (-O0):
define i32 @mult_cpx_matrix_h([2 x i16*]* %0, [2 x i16*]* %1, [2 x i16*]* %2, i32 %3, i16 zeroext %4, i16 signext %5) {
%7 = alloca i32
%8 = alloca [2 x i16*]*
%9 = alloca [2 x i16*]*
%10 = alloca [2 x i16*]*
%11 = alloca i32
%12 = alloca i16
%13 = alloca i16
store [2 x i16*]* %0, [2 x i16*]** %8
store [2 x i16*]* %1, [2 x i16*]** %9
store [2 x i16*]* %2, [2 x i16*]** %10
store i32 %3, i32* %11
store i16 %4, i16* %12
store i16 %5, i16* %13
%14 = load i16, i16* %13
%15 = icmp ne i16 %14, 0
br i1 %15, label %16, label %137
16: ; preds = %6
%17 = load [2 x i16*]*, [2 x i16*]** %9
%18 = getelementptr inbounds [2 x i16*], [2 x i16*]* %17, i64 0
%19 = getelementptr inbounds [2 x i16*], [2 x i16*]* %18, i64 0, i64 0
%20 = load i16*, i16** %19
%21 = load [2 x i16*]*, [2 x i16*]** %8
%22 = getelementptr inbounds [2 x i16*], [2 x i16*]* %21, i64 0
%23 = getelementptr inbounds [2 x i16*], [2 x i16*]* %22, i64 0, i64 0
%24 = load i16*, i16** %23
%25 = load [2 x i16*]*, [2 x i16*]** %10
%26 = getelementptr inbounds [2 x i16*], [2 x i16*]* %25, i64 0
%27 = getelementptr inbounds [2 x i16*], [2 x i16*]* %26, i64 0, i64 0
%28 = load i16*, i16** %27
%29 = load i32, i32* %11
%30 = load i16, i16* %12
%31 = call i32 @mult_cpx_vector_h(i16* %20, i16* %24, i16* %28, i32 %29, i16 zeroext %30, i32 1)
%32 = load [2 x i16*]*, [2 x i16*]** %9
%33 = getelementptr inbounds [2 x i16*], [2 x i16*]* %32, i64 0
%34 = getelementptr inbounds [2 x i16*], [2 x i16*]* %33, i64 0, i64 1
%35 = load i16*, i16** %34
%36 = load [2 x i16*]*, [2 x i16*]** %8
%37 = getelementptr inbounds [2 x i16*], [2 x i16*]* %36, i64 0
%38 = getelementptr inbounds [2 x i16*], [2 x i16*]* %37, i64 0, i64 1
%39 = load i16*, i16** %38
%40 = load [2 x i16*]*, [2 x i16*]** %10
%41 = getelementptr inbounds [2 x i16*], [2 x i16*]* %40, i64 0
%42 = getelementptr inbounds [2 x i16*], [2 x i16*]* %41, i64 0, i64 0
%43 = load i16*, i16** %42
%44 = load i32, i32* %11
%45 = load i16, i16* %12
%46 = call i32 @mult_cpx_vector_h(i16* %35, i16* %39, i16* %43, i32 %44, i16 zeroext %45, i32 1)
%47 = load [2 x i16*]*, [2 x i16*]** %9
%48 = getelementptr inbounds [2 x i16*], [2 x i16*]* %47, i64 0
%49 = getelementptr inbounds [2 x i16*], [2 x i16*]* %48, i64 0, i64 0
%50 = load i16*, i16** %49
%51 = load [2 x i16*]*, [2 x i16*]** %8
%52 = getelementptr inbounds [2 x i16*], [2 x i16*]* %51, i64 1
%53 = getelementptr inbounds [2 x i16*], [2 x i16*]* %52, i64 0, i64 0
%54 = load i16*, i16** %53
%55 = load [2 x i16*]*, [2 x i16*]** %10
%56 = getelementptr inbounds [2 x i16*], [2 x i16*]* %55, i64 1
%57 = getelementptr inbounds [2 x i16*], [2 x i16*]* %56, i64 0, i64 0
%58 = load i16*, i16** %57
%59 = load i32, i32* %11
%60 = load i16, i16* %12
%61 = call i32 @mult_cpx_vector_h(i16* %50, i16* %54, i16* %58, i32 %59, i16 zeroext %60, i32 1)
%62 = load [2 x i16*]*, [2 x i16*]** %9
%63 = getelementptr inbounds [2 x i16*], [2 x i16*]* %62, i64 0
%64 = getelementptr inbounds [2 x i16*], [2 x i16*]* %63, i64 0, i64 1
%65 = load i16*, i16** %64
%66 = load [2 x i16*]*, [2 x i16*]** %8
%67 = getelementptr inbounds [2 x i16*], [2 x i16*]* %66, i64 1
%68 = getelementptr inbounds [2 x i16*], [2 x i16*]* %67, i64 0, i64 1
%69 = load i16*, i16** %68
%70 = load [2 x i16*]*, [2 x i16*]** %10
%71 = getelementptr inbounds [2 x i16*], [2 x i16*]* %70, i64 1
%72 = getelementptr inbounds [2 x i16*], [2 x i16*]* %71, i64 0, i64 0
%73 = load i16*, i16** %72
%74 = load i32, i32* %11
%75 = load i16, i16* %12
%76 = call i32 @mult_cpx_vector_h(i16* %65, i16* %69, i16* %73, i32 %74, i16 zeroext %75, i32 1)
%77 = load [2 x i16*]*, [2 x i16*]** %9
%78 = getelementptr inbounds [2 x i16*], [2 x i16*]* %77, i64 1
%79 = getelementptr inbounds [2 x i16*], [2 x i16*]* %78, i64 0, i64 0
%80 = load i16*, i16** %79
%81 = load [2 x i16*]*, [2 x i16*]** %8
%82 = getelementptr inbounds [2 x i16*], [2 x i16*]* %81, i64 0
%83 = getelementptr inbounds [2 x i16*], [2 x i16*]* %82, i64 0, i64 0
%84 = load i16*, i16** %83
%85 = load [2 x i16*]*, [2 x i16*]** %10
%86 = getelementptr inbounds [2 x i16*], [2 x i16*]* %85, i64 0
%87 = getelementptr inbounds [2 x i16*], [2 x i16*]* %86, i64 0, i64 1
%88 = load i16*, i16** %87
%89 = load i32, i32* %11
%90 = load i16, i16* %12
%91 = call i32 @mult_cpx_vector_h(i16* %80, i16* %84, i16* %88, i32 %89, i16 zeroext %90, i32 1)
%92 = load [2 x i16*]*, [2 x i16*]** %9
%93 = getelementptr inbounds [2 x i16*], [2 x i16*]* %92, i64 1
%94 = getelementptr inbounds [2 x i16*], [2 x i16*]* %93, i64 0, i64 1
%95 = load i16*, i16** %94
%96 = load [2 x i16*]*, [2 x i16*]** %8
%97 = getelementptr inbounds [2 x i16*], [2 x i16*]* %96, i64 0
%98 = getelementptr inbounds [2 x i16*], [2 x i16*]* %97, i64 0, i64 1
%99 = load i16*, i16** %98
%100 = load [2 x i16*]*, [2 x i16*]** %10
%101 = getelementptr inbounds [2 x i16*], [2 x i16*]* %100, i64 0
%102 = getelementptr inbounds [2 x i16*], [2 x i16*]* %101, i64 0, i64 1
%103 = load i16*, i16** %102
%104 = load i32, i32* %11
%105 = load i16, i16* %12
%106 = call i32 @mult_cpx_vector_h(i16* %95, i16* %99, i16* %103, i32 %104, i16 zeroext %105, i32 1)
%107 = load [2 x i16*]*, [2 x i16*]** %9
%108 = getelementptr inbounds [2 x i16*], [2 x i16*]* %107, i64 1
%109 = getelementptr inbounds [2 x i16*], [2 x i16*]* %108, i64 0, i64 0
%110 = load i16*, i16** %109
%111 = load [2 x i16*]*, [2 x i16*]** %8
%112 = getelementptr inbounds [2 x i16*], [2 x i16*]* %111, i64 1
%113 = getelementptr inbounds [2 x i16*], [2 x i16*]* %112, i64 0, i64 0
%114 = load i16*, i16** %113
%115 = load [2 x i16*]*, [2 x i16*]** %10
%116 = getelementptr inbounds [2 x i16*], [2 x i16*]* %115, i64 1
%117 = getelementptr inbounds [2 x i16*], [2 x i16*]* %116, i64 0, i64 1
%118 = load i16*, i16** %117
%119 = load i32, i32* %11
%120 = load i16, i16* %12
%121 = call i32 @mult_cpx_vector_h(i16* %110, i16* %114, i16* %118, i32 %119, i16 zeroext %120, i32 1)
%122 = load [2 x i16*]*, [2 x i16*]** %9
%123 = getelementptr inbounds [2 x i16*], [2 x i16*]* %122, i64 1
%124 = getelementptr inbounds [2 x i16*], [2 x i16*]* %123, i64 0, i64 1
%125 = load i16*, i16** %124
%126 = load [2 x i16*]*, [2 x i16*]** %8
%127 = getelementptr inbounds [2 x i16*], [2 x i16*]* %126, i64 1
%128 = getelementptr inbounds [2 x i16*], [2 x i16*]* %127, i64 0, i64 1
%129 = load i16*, i16** %128
%130 = load [2 x i16*]*, [2 x i16*]** %10
%131 = getelementptr inbounds [2 x i16*], [2 x i16*]* %130, i64 1
%132 = getelementptr inbounds [2 x i16*], [2 x i16*]* %131, i64 0, i64 1
%133 = load i16*, i16** %132
%134 = load i32, i32* %11
%135 = load i16, i16* %12
%136 = call i32 @mult_cpx_vector_h(i16* %125, i16* %129, i16* %133, i32 %134, i16 zeroext %135, i32 1)
br label %258
137: ; preds = %6
%138 = load [2 x i16*]*, [2 x i16*]** %8
%139 = getelementptr inbounds [2 x i16*], [2 x i16*]* %138, i64 0
%140 = getelementptr inbounds [2 x i16*], [2 x i16*]* %139, i64 0, i64 0
%141 = load i16*, i16** %140
%142 = load [2 x i16*]*, [2 x i16*]** %9
%143 = getelementptr inbounds [2 x i16*], [2 x i16*]* %142, i64 0
%144 = getelementptr inbounds [2 x i16*], [2 x i16*]* %143, i64 0, i64 0
%145 = load i16*, i16** %144
%146 = load [2 x i16*]*, [2 x i16*]** %10
%147 = getelementptr inbounds [2 x i16*], [2 x i16*]* %146, i64 0
%148 = getelementptr inbounds [2 x i16*], [2 x i16*]* %147, i64 0, i64 0
%149 = load i16*, i16** %148
%150 = load i32, i32* %11
%151 = load i16, i16* %12
%152 = call i32 @mult_cpx_vector_h(i16* %141, i16* %145, i16* %149, i32 %150, i16 zeroext %151, i32 1)
%153 = load [2 x i16*]*, [2 x i16*]** %8
%154 = getelementptr inbounds [2 x i16*], [2 x i16*]* %153, i64 0
%155 = getelementptr inbounds [2 x i16*], [2 x i16*]* %154, i64 0, i64 1
%156 = load i16*, i16** %155
%157 = load [2 x i16*]*, [2 x i16*]** %9
%158 = getelementptr inbounds [2 x i16*], [2 x i16*]* %157, i64 0
%159 = getelementptr inbounds [2 x i16*], [2 x i16*]* %158, i64 0, i64 1
%160 = load i16*, i16** %159
%161 = load [2 x i16*]*, [2 x i16*]** %10
%162 = getelementptr inbounds [2 x i16*], [2 x i16*]* %161, i64 0
%163 = getelementptr inbounds [2 x i16*], [2 x i16*]* %162, i64 0, i64 0
%164 = load i16*, i16** %163
%165 = load i32, i32* %11
%166 = load i16, i16* %12
%167 = call i32 @mult_cpx_vector_h(i16* %156, i16* %160, i16* %164, i32 %165, i16 zeroext %166, i32 1)
%168 = load [2 x i16*]*, [2 x i16*]** %8
%169 = getelementptr inbounds [2 x i16*], [2 x i16*]* %168, i64 0
%170 = getelementptr inbounds [2 x i16*], [2 x i16*]* %169, i64 0, i64 0
%171 = load i16*, i16** %170
%172 = load [2 x i16*]*, [2 x i16*]** %9
%173 = getelementptr inbounds [2 x i16*], [2 x i16*]* %172, i64 1
%174 = getelementptr inbounds [2 x i16*], [2 x i16*]* %173, i64 0, i64 0
%175 = load i16*, i16** %174
%176 = load [2 x i16*]*, [2 x i16*]** %10
%177 = getelementptr inbounds [2 x i16*], [2 x i16*]* %176, i64 0
%178 = getelementptr inbounds [2 x i16*], [2 x i16*]* %177, i64 0, i64 1
%179 = load i16*, i16** %178
%180 = load i32, i32* %11
%181 = load i16, i16* %12
%182 = call i32 @mult_cpx_vector_h(i16* %171, i16* %175, i16* %179, i32 %180, i16 zeroext %181, i32 1)
%183 = load [2 x i16*]*, [2 x i16*]** %8
%184 = getelementptr inbounds [2 x i16*], [2 x i16*]* %183, i64 0
%185 = getelementptr inbounds [2 x i16*], [2 x i16*]* %184, i64 0, i64 1
%186 = load i16*, i16** %185
%187 = load [2 x i16*]*, [2 x i16*]** %9
%188 = getelementptr inbounds [2 x i16*], [2 x i16*]* %187, i64 1
%189 = getelementptr inbounds [2 x i16*], [2 x i16*]* %188, i64 0, i64 1
%190 = load i16*, i16** %189
%191 = load [2 x i16*]*, [2 x i16*]** %10
%192 = getelementptr inbounds [2 x i16*], [2 x i16*]* %191, i64 0
%193 = getelementptr inbounds [2 x i16*], [2 x i16*]* %192, i64 0, i64 1
%194 = load i16*, i16** %193
%195 = load i32, i32* %11
%196 = load i16, i16* %12
%197 = call i32 @mult_cpx_vector_h(i16* %186, i16* %190, i16* %194, i32 %195, i16 zeroext %196, i32 1)
%198 = load [2 x i16*]*, [2 x i16*]** %8
%199 = getelementptr inbounds [2 x i16*], [2 x i16*]* %198, i64 1
%200 = getelementptr inbounds [2 x i16*], [2 x i16*]* %199, i64 0, i64 0
%201 = load i16*, i16** %200
%202 = load [2 x i16*]*, [2 x i16*]** %9
%203 = getelementptr inbounds [2 x i16*], [2 x i16*]* %202, i64 0
%204 = getelementptr inbounds [2 x i16*], [2 x i16*]* %203, i64 0, i64 0
%205 = load i16*, i16** %204
%206 = load [2 x i16*]*, [2 x i16*]** %10
%207 = getelementptr inbounds [2 x i16*], [2 x i16*]* %206, i64 1
%208 = getelementptr inbounds [2 x i16*], [2 x i16*]* %207, i64 0, i64 0
%209 = load i16*, i16** %208
%210 = load i32, i32* %11
%211 = load i16, i16* %12
%212 = call i32 @mult_cpx_vector_h(i16* %201, i16* %205, i16* %209, i32 %210, i16 zeroext %211, i32 1)
%213 = load [2 x i16*]*, [2 x i16*]** %8
%214 = getelementptr inbounds [2 x i16*], [2 x i16*]* %213, i64 1
%215 = getelementptr inbounds [2 x i16*], [2 x i16*]* %214, i64 0, i64 1
%216 = load i16*, i16** %215
%217 = load [2 x i16*]*, [2 x i16*]** %9
%218 = getelementptr inbounds [2 x i16*], [2 x i16*]* %217, i64 0
%219 = getelementptr inbounds [2 x i16*], [2 x i16*]* %218, i64 0, i64 1
%220 = load i16*, i16** %219
%221 = load [2 x i16*]*, [2 x i16*]** %10
%222 = getelementptr inbounds [2 x i16*], [2 x i16*]* %221, i64 1
%223 = getelementptr inbounds [2 x i16*], [2 x i16*]* %222, i64 0, i64 0
%224 = load i16*, i16** %223
%225 = load i32, i32* %11
%226 = load i16, i16* %12
%227 = call i32 @mult_cpx_vector_h(i16* %216, i16* %220, i16* %224, i32 %225, i16 zeroext %226, i32 1)
%228 = load [2 x i16*]*, [2 x i16*]** %8
%229 = getelementptr inbounds [2 x i16*], [2 x i16*]* %228, i64 1
%230 = getelementptr inbounds [2 x i16*], [2 x i16*]* %229, i64 0, i64 0
%231 = load i16*, i16** %230
%232 = load [2 x i16*]*, [2 x i16*]** %9
%233 = getelementptr inbounds [2 x i16*], [2 x i16*]* %232, i64 1
%234 = getelementptr inbounds [2 x i16*], [2 x i16*]* %233, i64 0, i64 0
%235 = load i16*, i16** %234
%236 = load [2 x i16*]*, [2 x i16*]** %10
%237 = getelementptr inbounds [2 x i16*], [2 x i16*]* %236, i64 1
%238 = getelementptr inbounds [2 x i16*], [2 x i16*]* %237, i64 0, i64 1
%239 = load i16*, i16** %238
%240 = load i32, i32* %11
%241 = load i16, i16* %12
%242 = call i32 @mult_cpx_vector_h(i16* %231, i16* %235, i16* %239, i32 %240, i16 zeroext %241, i32 1)
%243 = load [2 x i16*]*, [2 x i16*]** %8
%244 = getelementptr inbounds [2 x i16*], [2 x i16*]* %243, i64 1
%245 = getelementptr inbounds [2 x i16*], [2 x i16*]* %244, i64 0, i64 1
%246 = load i16*, i16** %245
%247 = load [2 x i16*]*, [2 x i16*]** %9
%248 = getelementptr inbounds [2 x i16*], [2 x i16*]* %247, i64 1
%249 = getelementptr inbounds [2 x i16*], [2 x i16*]* %248, i64 0, i64 1
%250 = load i16*, i16** %249
%251 = load [2 x i16*]*, [2 x i16*]** %10
%252 = getelementptr inbounds [2 x i16*], [2 x i16*]* %251, i64 1
%253 = getelementptr inbounds [2 x i16*], [2 x i16*]* %252, i64 0, i64 1
%254 = load i16*, i16** %253
%255 = load i32, i32* %11
%256 = load i16, i16* %12
%257 = call i32 @mult_cpx_vector_h(i16* %246, i16* %250, i16* %254, i32 %255, i16 zeroext %256, i32 1)
br label %258
258: ; preds = %137, %16
%259 = load i32, i32* %7
ret i32 %259
}

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