Perigos da legalização do vetor LLVM

Por motivos de desempenho, o LLVM pode mapear o tipo <3 x double> para um par de _ m128d (em x86 64), expandindo efetivamente a largura do tipo em um elemento. Isso quebra o programa se o bloco de memória for alocado como uma matriz de duplos sob a suposição de que cada vetor tem 3 elementos de largura e, em seguida, convertido para o tipo de vetor.

Por exemplo, o seguinte programa compilado com Clang:

#include <stdio.h>

typedef double double3 __attribute__((ext_vector_type(3)));

int main(void) {

double a[] = {1, 2, 3, 4, 5, 6, 7, 8};
double b[] = {0, 0, 0, 0, 0, 0, 0, 0};

((double3 *)b)[0] = ((double3 *)a)[0];
((double3 *)b)[1] = ((double3 *)a)[1];

printf
("%lf %lf %lf %lf %lf %lfn",
b
[0], b[1], b[2], b[3], b[4], b[5]);

return 0;
}

produz o seguinte:

1.000000 2.000000 3.000000 0.000000 5.000000 6.000000

O Elemento 4 mapeia para o espaço alargado e é ignorado.