#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*/ shape1d3(double, double *, double *);
void shape2d9(double x1, double x2, double *N, double (*dN)[2]) {
  double N1[3], N2[3];
  double dN1[3], dN2[3];
  shape1d3(x1, N1, dN1);
  shape1d3(x2, N2, dN2);
  N[0] = N1[0] * N2[0];
  dN[0][0] = dN1[0] * N2[0];
  dN[0][1] = N1[0] * dN2[0];
  N[1] = N1[2] * N2[0];
  dN[1][0] = dN1[2] * N2[0];
  dN[1][1] = N1[2] * dN2[0];
  N[2] = N1[2] * N2[2];
  dN[2][0] = dN1[2] * N2[2];
  dN[2][1] = N1[2] * dN2[2];
  N[3] = N1[0] * N2[2];
  dN[3][0] = dN1[0] * N2[2];
  dN[3][1] = N1[0] * dN2[2];
  N[4] = N1[1] * N2[0];
  dN[4][0] = dN1[1] * N2[0];
  dN[4][1] = N1[1] * dN2[0];
  N[5] = N1[2] * N2[1];
  dN[5][0] = dN1[2] * N2[1];
  dN[5][1] = N1[2] * dN2[1];
  N[6] = N1[1] * N2[2];
  dN[6][0] = dN1[1] * N2[2];
  dN[6][1] = N1[1] * dN2[2];
  N[7] = N1[0] * N2[1];
  dN[7][0] = dN1[0] * N2[1];
  dN[7][1] = N1[0] * dN2[1];
  N[8] = N1[1] * N2[1];
  dN[8][0] = dN1[1] * N2[1];
  dN[8][1] = N1[1] * dN2[1];
}


x86 assembly (clang, -O0):
<shape2d9>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movsd  -0x8(%rbp),%xmm0
lea    -0x40(%rbp),%rdi
lea    -0x80(%rbp),%rsi
call   1030 <shape1d3@plt>
movsd  -0x10(%rbp),%xmm0
lea    -0x60(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
call   1030 <shape1d3@plt>
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x80(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x78(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x78(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x38(%rax)
movsd  -0x80(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x78(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x80(%rax)
movsd  -0x38(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x88(%rax)
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<shape2d9>:
push   %r14
push   %rbx
sub    $0x88,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
movsd  %xmm1,0x8(%rsp)
lea    0x70(%rsp),%rdi
lea    0x30(%rsp),%rsi
call   1030 <shape1d3@plt>
lea    0x50(%rsp),%rdi
lea    0x10(%rsp),%rsi
movsd  0x8(%rsp),%xmm0
call   1030 <shape1d3@plt>
movsd  0x70(%rsp),%xmm8
movsd  0x50(%rsp),%xmm0
movapd %xmm8,%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rbx)
movapd 0x30(%rsp),%xmm1
movapd %xmm0,%xmm2
unpcklpd %xmm8,%xmm2
movsd  0x10(%rsp),%xmm3
movapd %xmm1,%xmm4
unpcklpd %xmm3,%xmm4
mulpd  %xmm2,%xmm4
movupd %xmm4,(%r14)
movsd  0x80(%rsp),%xmm6
movapd %xmm0,%xmm2
mulsd  %xmm6,%xmm2
movsd  %xmm2,0x8(%rbx)
movapd %xmm0,%xmm5
unpcklpd %xmm3,%xmm5
movsd  0x40(%rsp),%xmm2
unpcklpd %xmm6,%xmm2
movapd %xmm5,%xmm3
mulpd  %xmm2,%xmm3
movupd %xmm3,0x10(%r14)
movsd  0x60(%rsp),%xmm3
movapd %xmm6,%xmm4
mulsd  %xmm3,%xmm4
movsd  %xmm4,0x10(%rbx)
movapd %xmm3,%xmm4
movhpd 0x20(%rsp),%xmm4
movapd %xmm2,%xmm7
mulpd  %xmm4,%xmm7
movupd %xmm7,0x20(%r14)
movapd %xmm8,%xmm7
mulsd  %xmm3,%xmm7
movsd  %xmm7,0x18(%rbx)
unpcklpd %xmm8,%xmm1
movapd %xmm1,%xmm7
mulpd  %xmm4,%xmm7
movupd %xmm7,0x30(%r14)
movsd  0x78(%rsp),%xmm7
mulsd  %xmm7,%xmm0
movsd  %xmm0,0x20(%rbx)
movupd 0x38(%rsp),%xmm0
unpcklpd %xmm7,%xmm0
mulpd  %xmm0,%xmm5
movupd %xmm5,0x40(%r14)
movsd  0x58(%rsp),%xmm5
mulsd  %xmm5,%xmm6
movsd  %xmm6,0x28(%rbx)
mulsd  %xmm5,%xmm8
movapd %xmm5,%xmm6
movhpd 0x18(%rsp),%xmm6
mulsd  %xmm7,%xmm3
mulsd  %xmm5,%xmm7
mulpd  %xmm6,%xmm2
movupd %xmm2,0x50(%r14)
movsd  %xmm3,0x30(%rbx)
mulpd  %xmm0,%xmm4
movupd %xmm4,0x60(%r14)
movsd  %xmm8,0x38(%rbx)
mulpd  %xmm6,%xmm1
movupd %xmm1,0x70(%r14)
movsd  %xmm7,0x40(%rbx)
mulpd  %xmm0,%xmm6
movupd %xmm6,0x80(%r14)
add    $0x88,%rsp
pop    %rbx
pop    %r14
ret

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

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