Skip to content

Commit

Permalink
[CodeGen, X86] Classify vectors <= 32 bits as INTEGER
Browse files Browse the repository at this point in the history
We shouldn't crash despite the AMD64 ABI not giving clear guidance as to
how to pass around vector types <= 32 bits.  Instead, classify such
vectors as INTEGER to be compatible with GCC.

This fixes PR24162.

llvm-svn: 242508
  • Loading branch information
majnemer committed Jul 17, 2015
1 parent 64fc072 commit f8d14db
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
14 changes: 8 additions & 6 deletions clang/lib/CodeGen/TargetInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1907,16 +1907,18 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,

if (const VectorType *VT = Ty->getAs<VectorType>()) {
uint64_t Size = getContext().getTypeSize(VT);
if (Size == 32) {
// gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x
// float> as integer.
if (Size == 1 || Size == 8 || Size == 16 || Size == 32) {
// gcc passes the following as integer:
// 4 bytes - <4 x char>, <2 x short>, <1 x int>, <1 x float>
// 2 bytes - <2 x char>, <1 x short>
// 1 byte - <1 x char>
Current = Integer;

// If this type crosses an eightbyte boundary, it should be
// split.
uint64_t EB_Real = (OffsetBase) / 64;
uint64_t EB_Imag = (OffsetBase + Size - 1) / 64;
if (EB_Real != EB_Imag)
uint64_t EB_Lo = (OffsetBase) / 64;
uint64_t EB_Hi = (OffsetBase + Size - 1) / 64;
if (EB_Lo != EB_Hi)
Hi = Lo;
} else if (Size == 64) {
// gcc passes <1 x double> in memory. :(
Expand Down
9 changes: 9 additions & 0 deletions clang/test/CodeGenCXX/x86_64-arguments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,3 +212,12 @@ int FuncForDerivedPacked(DerivedPacked d) {
return d.three;
}
}

namespace test11 {
union U {
float f1;
char __attribute__((__vector_size__(1))) f2;
};
int f(union U u) { return u.f2[1]; }
// CHECK-LABEL: define i32 @_ZN6test111fENS_1UE(i32
}

0 comments on commit f8d14db

Please sign in to comment.