[CodeGen] Widen non-power-of-2 vector HFA base types.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 19 Apr 2016 17:54:29 +0000 (17:54 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 19 Apr 2016 17:54:29 +0000 (17:54 +0000)
commit40a34c2e2af8eaabfac246c9801af09a4e478dc1
treedb13910628ad91717c9c90b31a4851c3075abf48
parent8862cae75ba0bb2dbfc7bc1d5ca0e0a45c408387
[CodeGen] Widen non-power-of-2 vector HFA base types.

Currently, for the ppc64--gnu and aarch64 ABIs, we recognize:
  typedef __attribute__((__ext_vector_type__(3))) float v3f32;
  typedef __attribute__((__ext_vector_type__(16))) char v16i8;
  struct HFA {
    v3f32 a;
    v16i8 b;
  };

as an HFA. Since the first type encountered is used as the base type,
we pass the HFA as:
    [2 x <3 x float>]
Which leads to incorrect IR (relying on padding values) when the
second field is used.

Instead, explicitly widen the vector (after size rounding) in
isHomogeneousAggregate.

Differential Revision: http://reviews.llvm.org/D18998

llvm-svn: 266784
clang/lib/CodeGen/TargetInfo.cpp
clang/test/CodeGen/aarch64-arguments-hfa-v3.c [new file with mode: 0644]
clang/test/CodeGen/arm64-arguments.c
clang/test/CodeGen/ppc64le-aggregates.c