@@ -739,9 +739,10 @@ static llvm::Value *stackPromote(IRGenFunction &IGF,
739
739
return Alloca.getAddress ();
740
740
}
741
741
742
- llvm::Value *irgen::appendSizeForTailAllocatedArrays (IRGenFunction &IGF,
743
- llvm::Value *size,
744
- TailArraysRef TailArrays) {
742
+ std::pair<llvm::Value *, llvm::Value *>
743
+ irgen::appendSizeForTailAllocatedArrays (IRGenFunction &IGF,
744
+ llvm::Value *size, llvm::Value *alignMask,
745
+ TailArraysRef TailArrays) {
745
746
for (const auto &TailArray : TailArrays) {
746
747
SILType ElemTy = TailArray.first ;
747
748
llvm::Value *Count = TailArray.second ;
@@ -750,16 +751,17 @@ llvm::Value *irgen::appendSizeForTailAllocatedArrays(IRGenFunction &IGF,
750
751
751
752
// Align up to the tail-allocated array.
752
753
llvm::Value *ElemStride = ElemTI.getStride (IGF, ElemTy);
753
- llvm::Value *AlignMask = ElemTI.getAlignmentMask (IGF, ElemTy);
754
- size = IGF.Builder .CreateAdd (size, AlignMask );
755
- llvm::Value *InvertedMask = IGF.Builder .CreateNot (AlignMask );
754
+ llvm::Value *ElemAlignMask = ElemTI.getAlignmentMask (IGF, ElemTy);
755
+ size = IGF.Builder .CreateAdd (size, ElemAlignMask );
756
+ llvm::Value *InvertedMask = IGF.Builder .CreateNot (ElemAlignMask );
756
757
size = IGF.Builder .CreateAnd (size, InvertedMask);
757
758
758
759
// Add the size of the tail allocated array.
759
760
llvm::Value *AllocSize = IGF.Builder .CreateMul (ElemStride, Count);
760
761
size = IGF.Builder .CreateAdd (size, AllocSize);
762
+ alignMask = IGF.Builder .CreateOr (alignMask, ElemAlignMask);
761
763
}
762
- return size;
764
+ return { size, alignMask} ;
763
765
}
764
766
765
767
@@ -800,7 +802,8 @@ llvm::Value *irgen::emitClassAllocation(IRGenFunction &IGF, SILType selfType,
800
802
val = IGF.emitInitStackObjectCall (metadata, val, " reference.new" );
801
803
} else {
802
804
// Allocate the object on the heap.
803
- size = appendSizeForTailAllocatedArrays (IGF, size, TailArrays);
805
+ std::tie (size, alignMask)
806
+ = appendSizeForTailAllocatedArrays (IGF, size, alignMask, TailArrays);
804
807
val = IGF.emitAllocObjectCall (metadata, size, alignMask, " reference.new" );
805
808
StackAllocSize = -1 ;
806
809
}
@@ -823,7 +826,8 @@ llvm::Value *irgen::emitClassAllocationDynamic(IRGenFunction &IGF,
823
826
= emitClassResilientInstanceSizeAndAlignMask (IGF,
824
827
selfType.getClassOrBoundGenericClass (),
825
828
metadata);
826
- size = appendSizeForTailAllocatedArrays (IGF, size, TailArrays);
829
+ std::tie (size, alignMask)
830
+ = appendSizeForTailAllocatedArrays (IGF, size, alignMask, TailArrays);
827
831
828
832
llvm::Value *val = IGF.emitAllocObjectCall (metadata, size, alignMask,
829
833
" reference.new" );
0 commit comments