void f(void) {
  __attribute__((vector_size(16))) float v128;
  __attribute__((vector_size(16))) int v128i;
  __attribute__((vector_size(16))) double v128d;
  g128(v128);
  g128i(v128i);
  g128d(v128d);
  __attribute__((vector_size(32))) float v256;
  __attribute__((vector_size(32))) int v256i;
  __attribute__((vector_size(32))) double v256d;
  g256(v256);
  g256i(v256i);
  g256d(v256d);
  __attribute__((vector_size(64))) float v512;
  __attribute__((vector_size(64))) int v512i;
  __attribute__((vector_size(64))) double v512d;
  g512(v512);
  g512i(v512i);
  g512d(v512d);
}


x86 assembly (clang, -O0):
<f>:
push   %rbp
mov    %rsp,%rbp
and    $0xffffffffffffffc0,%rsp
sub    $0x300,%rsp
movaps 0x2e0(%rsp),%xmm0
mov    $0x1,%al
mov    %al,0x7e(%rsp)
call   1080 <g128@plt>
mov    0x7e(%rsp),%al
movaps 0x2d0(%rsp),%xmm0
call   1040 <g128i@plt>
mov    0x7e(%rsp),%al
movapd 0x2c0(%rsp),%xmm0
call   1090 <g128d@plt>
movaps 0x2a0(%rsp),%xmm0
movaps 0x2b0(%rsp),%xmm1
movaps %xmm1,0x250(%rsp)
movaps %xmm0,0x240(%rsp)
movaps 0x240(%rsp),%xmm0
movaps 0x250(%rsp),%xmm1
mov    %rsp,%rax
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
xor    %eax,%eax
mov    %al,0x7f(%rsp)
call   1030 <g256@plt>
mov    0x7f(%rsp),%al
movaps 0x280(%rsp),%xmm0
movaps 0x290(%rsp),%xmm1
movaps %xmm1,0x230(%rsp)
movaps %xmm0,0x220(%rsp)
movaps 0x220(%rsp),%xmm0
movaps 0x230(%rsp),%xmm1
mov    %rsp,%rcx
movaps %xmm1,0x10(%rcx)
movaps %xmm0,(%rcx)
call   10b0 <g256i@plt>
mov    0x7f(%rsp),%al
movapd 0x260(%rsp),%xmm0
movapd 0x270(%rsp),%xmm1
movapd %xmm1,0x210(%rsp)
movapd %xmm0,0x200(%rsp)
movaps 0x200(%rsp),%xmm0
movaps 0x210(%rsp),%xmm1
mov    %rsp,%rcx
movaps %xmm1,0x10(%rcx)
movaps %xmm0,(%rcx)
call   1070 <g256d@plt>
mov    0x7f(%rsp),%al
movaps 0x1c0(%rsp),%xmm0
movaps 0x1d0(%rsp),%xmm1
movaps 0x1e0(%rsp),%xmm2
movaps 0x1f0(%rsp),%xmm3
movaps %xmm3,0x130(%rsp)
movaps %xmm2,0x120(%rsp)
movaps %xmm1,0x110(%rsp)
movaps %xmm0,0x100(%rsp)
movaps 0x100(%rsp),%xmm0
movaps 0x110(%rsp),%xmm1
movaps 0x120(%rsp),%xmm2
movaps 0x130(%rsp),%xmm3
mov    %rsp,%rcx
movaps %xmm3,0x30(%rcx)
movaps %xmm2,0x20(%rcx)
movaps %xmm1,0x10(%rcx)
movaps %xmm0,(%rcx)
call   1050 <g512@plt>
mov    0x7f(%rsp),%al
movaps 0x180(%rsp),%xmm0
movaps 0x190(%rsp),%xmm1
movaps 0x1a0(%rsp),%xmm2
movaps 0x1b0(%rsp),%xmm3
movaps %xmm3,0xf0(%rsp)
movaps %xmm2,0xe0(%rsp)
movaps %xmm1,0xd0(%rsp)
movaps %xmm0,0xc0(%rsp)
movaps 0xc0(%rsp),%xmm0
movaps 0xd0(%rsp),%xmm1
movaps 0xe0(%rsp),%xmm2
movaps 0xf0(%rsp),%xmm3
mov    %rsp,%rcx
movaps %xmm3,0x30(%rcx)
movaps %xmm2,0x20(%rcx)
movaps %xmm1,0x10(%rcx)
movaps %xmm0,(%rcx)
call   1060 <g512i@plt>
movapd 0x140(%rsp),%xmm0
movapd 0x150(%rsp),%xmm1
movapd 0x160(%rsp),%xmm2
movapd 0x170(%rsp),%xmm3
movapd %xmm3,0xb0(%rsp)
movapd %xmm2,0xa0(%rsp)
movapd %xmm1,0x90(%rsp)
movapd %xmm0,0x80(%rsp)
movaps 0x80(%rsp),%xmm0
movaps 0x90(%rsp),%xmm1
movaps 0xa0(%rsp),%xmm2
movaps 0xb0(%rsp),%xmm3
mov    %rsp,%rax
movaps %xmm3,0x30(%rax)
movaps %xmm2,0x20(%rax)
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
xor    %eax,%eax
call   10a0 <g512d@plt>
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f>:
push   %rbp
mov    %rsp,%rbp
and    $0xffffffffffffffc0,%rsp
sub    $0x180,%rsp
mov    $0x1,%al
call   1080 <g128@plt>
mov    $0x1,%al
call   1040 <g128i@plt>
mov    $0x1,%al
call   1090 <g128d@plt>
movaps 0x140(%rsp),%xmm0
movaps 0x150(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1030 <g256@plt>
movaps 0x120(%rsp),%xmm0
movaps 0x130(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   10b0 <g256i@plt>
movaps 0x100(%rsp),%xmm0
movaps 0x110(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1070 <g256d@plt>
movaps 0xc0(%rsp),%xmm0
movaps 0xd0(%rsp),%xmm1
movaps 0xe0(%rsp),%xmm2
movaps 0xf0(%rsp),%xmm3
movaps %xmm3,0x30(%rsp)
movaps %xmm2,0x20(%rsp)
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1050 <g512@plt>
movaps 0x80(%rsp),%xmm0
movaps 0x90(%rsp),%xmm1
movaps 0xa0(%rsp),%xmm2
movaps 0xb0(%rsp),%xmm3
movaps %xmm3,0x30(%rsp)
movaps %xmm2,0x20(%rsp)
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1060 <g512i@plt>
movaps 0x40(%rsp),%xmm0
movaps 0x50(%rsp),%xmm1
movaps 0x60(%rsp),%xmm2
movaps 0x70(%rsp),%xmm3
movaps %xmm3,0x30(%rsp)
movaps %xmm2,0x20(%rsp)
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   10a0 <g512d@plt>
mov    %rbp,%rsp
pop    %rbp
ret

LLVM IR (-O0):
define void @f() {
%1 = alloca <4 x float>
%2 = alloca <4 x i32>
%3 = alloca <2 x double>
%4 = alloca <8 x float>
%5 = alloca <8 x i32>
%6 = alloca <4 x double>
%7 = alloca <8 x float>
%8 = alloca <8 x i32>
%9 = alloca <4 x double>
%10 = alloca <16 x float>
%11 = alloca <16 x i32>
%12 = alloca <8 x double>
%13 = alloca <16 x float>
%14 = alloca <16 x i32>
%15 = alloca <8 x double>
%16 = load <4 x float>, <4 x float>* %1
%17 = call i32 (<4 x float>, ...) bitcast (i32 (...)* @g128 to i32 (<4 x float>, ...)*)(<4 x float> %16)
%18 = load <4 x i32>, <4 x i32>* %2
%19 = call i32 (<4 x i32>, ...) bitcast (i32 (...)* @g128i to i32 (<4 x i32>, ...)*)(<4 x i32> %18)
%20 = load <2 x double>, <2 x double>* %3
%21 = call i32 (<2 x double>, ...) bitcast (i32 (...)* @g128d to i32 (<2 x double>, ...)*)(<2 x double> %20)
%22 = load <8 x float>, <8 x float>* %4
store <8 x float> %22, <8 x float>* %7
%23 = call i32 (<8 x float>*, ...) bitcast (i32 (...)* @g256 to i32 (<8 x float>*, ...)*)(<8 x float>* byval(<8 x float>) align 32 %7)
%24 = load <8 x i32>, <8 x i32>* %5
store <8 x i32> %24, <8 x i32>* %8
%25 = call i32 (<8 x i32>*, ...) bitcast (i32 (...)* @g256i to i32 (<8 x i32>*, ...)*)(<8 x i32>* byval(<8 x i32>) align 32 %8)
%26 = load <4 x double>, <4 x double>* %6
store <4 x double> %26, <4 x double>* %9
%27 = call i32 (<4 x double>*, ...) bitcast (i32 (...)* @g256d to i32 (<4 x double>*, ...)*)(<4 x double>* byval(<4 x double>) align 32 %9)
%28 = load <16 x float>, <16 x float>* %10
store <16 x float> %28, <16 x float>* %13
%29 = call i32 (<16 x float>*, ...) bitcast (i32 (...)* @g512 to i32 (<16 x float>*, ...)*)(<16 x float>* byval(<16 x float>) align 64 %13)
%30 = load <16 x i32>, <16 x i32>* %11
store <16 x i32> %30, <16 x i32>* %14
%31 = call i32 (<16 x i32>*, ...) bitcast (i32 (...)* @g512i to i32 (<16 x i32>*, ...)*)(<16 x i32>* byval(<16 x i32>) align 64 %14)
%32 = load <8 x double>, <8 x double>* %12
store <8 x double> %32, <8 x double>* %15
%33 = call i32 (<8 x double>*, ...) bitcast (i32 (...)* @g512d to i32 (<8 x double>*, ...)*)(<8 x double>* byval(<8 x double>) align 64 %15)
ret void
}

LLVM IR (-O2):
define void @f() {
%1 = alloca <8 x float>
%2 = alloca <8 x i32>
%3 = alloca <4 x double>
%4 = alloca <16 x float>
%5 = alloca <16 x i32>
%6 = alloca <8 x double>
%7 = tail call i32 (<4 x float>, ...) bitcast (i32 (...)* @g128 to i32 (<4 x float>, ...)*)(<4 x float> undef)
%8 = tail call i32 (<4 x i32>, ...) bitcast (i32 (...)* @g128i to i32 (<4 x i32>, ...)*)(<4 x i32> undef)
%9 = tail call i32 (<2 x double>, ...) bitcast (i32 (...)* @g128d to i32 (<2 x double>, ...)*)(<2 x double> undef)
%10 = tail call i32 (<8 x float>*, ...) bitcast (i32 (...)* @g256 to i32 (<8 x float>*, ...)*)(<8 x float>* byval(<8 x float>) align 32 %1)
%11 = tail call i32 (<8 x i32>*, ...) bitcast (i32 (...)* @g256i to i32 (<8 x i32>*, ...)*)(<8 x i32>* byval(<8 x i32>) align 32 %2)
%12 = tail call i32 (<4 x double>*, ...) bitcast (i32 (...)* @g256d to i32 (<4 x double>*, ...)*)(<4 x double>* byval(<4 x double>) align 32 %3)
%13 = tail call i32 (<16 x float>*, ...) bitcast (i32 (...)* @g512 to i32 (<16 x float>*, ...)*)(<16 x float>* byval(<16 x float>) align 64 %4)
%14 = tail call i32 (<16 x i32>*, ...) bitcast (i32 (...)* @g512i to i32 (<16 x i32>*, ...)*)(<16 x i32>* byval(<16 x i32>) align 64 %5)
%15 = tail call i32 (<8 x double>*, ...) bitcast (i32 (...)* @g512d to i32 (<8 x double>*, ...)*)(<8 x double>* byval(<8 x double>) align 64 %6)
ret void
}