Author: johannes Date: Mon Feb 11 12:03:06 2008 New Revision: 46958 URL: http://llvm.org/viewvc/llvm-project?rev=46958&view=rev Log: Choose an SSE vector-containing type for the constructed type that represents a union, if the union contains such a type.
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=46958&r1=46957&r2=46958&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Mon Feb 11 12:03:06 2008 @@ -83,6 +83,15 @@ } \ } +/* Aggregates containing SSE vectors are aligned at 16 bytes as parameters; + while long double has GCC alignment of 16 bytes (correct for struct layout) + but is only 4 byte aligned as a parameter. So if a union type contains an + SSE vector, use that as the basis for the constructed LLVM struct. */ +#define TARGET_LLVM_COMPARE_UNION_FIELDS(curType, newType, curAlign, newAlign) \ + (newAlign==curAlign && TARGET_SSE && \ + TheTarget->getTargetLowering()->getByValTypeAlignment(newType) > \ + TheTarget->getTargetLowering()->getByValTypeAlignment(curType)) + #ifdef LLVM_ABI_H extern bool llvm_x86_should_pass_aggregate_in_memory(tree, const Type *); Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=46958&r1=46957&r2=46958&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Mon Feb 11 12:03:06 2008 @@ -33,6 +33,7 @@ #include "llvm/TypeSymbolTable.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetLowering.h" #include "llvm/Assembly/Writer.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringExtras.h" @@ -1137,7 +1138,7 @@ // 'sret' functions cannot be 'readnone' or 'readonly'. if (ABIConverter.isStructReturn()) RAttributes &= ~(ParamAttr::ReadNone|ParamAttr::ReadOnly); - + // Compute whether the result needs to be zext or sext'd. RAttributes |= HandleArgumentExtension(TREE_TYPE(type)); @@ -2124,6 +2125,8 @@ /// ConvertUNION - We know that 'type' is a UNION_TYPE or a QUAL_UNION_TYPE: /// convert it to an LLVM type. +/// This involves creating a struct with the right size and alignment. In +/// some cases this is target dependent. const Type *TypeConverter::ConvertUNION(tree type, tree orig_type) { if (const Type *Ty = GET_TYPE_LLVM(type)) { // If we already compiled this type, and if it was not a forward @@ -2170,17 +2173,25 @@ // Select TheTy as union type if it meets one of the following criteria // 1) UnionTy is 0 // 2) TheTy alignment is more then UnionTy - // 3) TheTy size is greater than UnionTy size and TheTy alignment is equal to UnionTy + // 3) TheTy size is greater than UnionTy size and TheTy alignment is equal + // to UnionTy // 4) TheTy size is greater then UnionTy size and TheTy is packed + // FIXME there is no check for packed? bool useTheTy = false; if (UnionTy == 0) useTheTy = true; else if (Align > MaxAlign) useTheTy = true; +#ifdef TARGET_LLVM_COMPARE_UNION_FIELDS + else + useTheTy = TARGET_LLVM_COMPARE_UNION_FIELDS(UnionTy, TheTy, + Align, MaxAlign); +#else else if (MaxAlign == Align && Size > MaxSize) useTheTy = true; - else if (Size > MaxSize) + else if (Size > MaxSize) // FIXME really? Seems wrong to lower alignment useTheTy = true; +#endif if (useTheTy) { UnionTy = TheTy; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits