Index: clang/lib/CodeGen/TargetInfo.cpp =================================================================== --- clang/lib/CodeGen/TargetInfo.cpp +++ clang/lib/CodeGen/TargetInfo.cpp @@ -1860,6 +1860,25 @@ CharUnits FieldAlign = CharUnits::fromQuantity(4); assert(StackOffset.isMultipleOf(FieldAlign) && "unaligned inalloca struct"); + CharUnits FieldStart = StackOffset; + unsigned StackArgTypeAlignment = getContext().getTypeAlign(Type) / 8; + // if the type contains an SSE vector type, the alignment has to be 16. + StackArgTypeAlignment = (StackArgTypeAlignment >= 16 && + (isSSEVectorType(getContext(), Type) || + isRecordWithSSEVectorType(getContext(), Type))) + ? 16 + : MinABIStackAlignInBytes; + + CharUnits argAlign = CharUnits::fromQuantity(StackArgTypeAlignment); + + StackOffset = FieldStart.alignTo(argAlign); + if (StackOffset != FieldStart) { + CharUnits NumBytes = StackOffset - FieldStart; + llvm::Type *Ty = llvm::Type::getInt8Ty(getVMContext()); + Ty = llvm::ArrayType::get(Ty, NumBytes.getQuantity()); + FrameFields.push_back(Ty); + } + Info = ABIArgInfo::getInAlloca(FrameFields.size()); FrameFields.push_back(CGT.ConvertTypeForMem(Type)); StackOffset += getContext().getTypeSizeInChars(Type);