@@ -445,15 +445,16 @@ static void emitPackExpansionMetadataPack(IRGenFunction &IGF, Address pack,
445445 });
446446}
447447
448- StackAddress
449- irgen::emitTypeMetadataPack (IRGenFunction &IGF,
450- CanPackType packType,
448+ std::pair<StackAddress, llvm::Value *>
449+ irgen::emitTypeMetadataPack (IRGenFunction &IGF, CanPackType packType,
451450 DynamicMetadataRequest request) {
452451 auto *shape = IGF.emitPackShapeExpression (packType);
453452
454453 if (auto *constantInt = dyn_cast<llvm::ConstantInt>(shape)) {
455454 assert (packType->getNumElements () == constantInt->getValue ());
456- return StackAddress (emitFixedSizeMetadataPackRef (IGF, packType, request));
455+ auto pack =
456+ StackAddress (emitFixedSizeMetadataPackRef (IGF, packType, request));
457+ return {pack, constantInt};
457458 }
458459
459460 assert (packType->containsPackExpansionType ());
@@ -488,7 +489,13 @@ irgen::emitTypeMetadataPack(IRGenFunction &IGF,
488489
489490 visitPackExplosion (IGF, packType, visitFn);
490491
491- return pack;
492+ return {pack, shape};
493+ }
494+
495+ static Optional<unsigned > countForShape (llvm::Value *shape) {
496+ if (auto *constant = dyn_cast<llvm::ConstantInt>(shape))
497+ return constant->getValue ().getZExtValue ();
498+ return llvm::None;
492499}
493500
494501MetadataResponse
@@ -497,7 +504,10 @@ irgen::emitTypeMetadataPackRef(IRGenFunction &IGF, CanPackType packType,
497504 if (auto result = tryGetLocalPackTypeMetadata (IGF, packType, request))
498505 return result;
499506
500- auto pack = emitTypeMetadataPack (IGF, packType, request);
507+ StackAddress pack;
508+ llvm::Value *shape;
509+ std::tie (pack, shape) = emitTypeMetadataPack (IGF, packType, request);
510+
501511 auto *metadata = pack.getAddress ().getAddress ();
502512 metadata = IGF.Builder .CreatePointerCast (
503513 metadata, IGF.IGM .TypeMetadataPtrTy ->getPointerTo ());
@@ -573,15 +583,16 @@ static void emitPackExpansionWitnessTablePack(
573583 });
574584}
575585
576- StackAddress irgen::emitWitnessTablePack (IRGenFunction &IGF,
577- CanPackType packType,
578- PackConformance *packConformance) {
586+ std::pair< StackAddress, llvm::Value *>
587+ irgen::emitWitnessTablePack (IRGenFunction &IGF, CanPackType packType,
588+ PackConformance *packConformance) {
579589 auto *shape = IGF.emitPackShapeExpression (packType);
580590
581591 if (auto *constantInt = dyn_cast<llvm::ConstantInt>(shape)) {
582592 assert (packType->getNumElements () == constantInt->getValue ());
583- return StackAddress (
593+ auto pack = StackAddress (
584594 emitFixedSizeWitnessTablePack (IGF, packType, packConformance));
595+ return {pack, constantInt};
585596 }
586597
587598 assert (packType->containsPackExpansionType ());
@@ -618,16 +629,16 @@ StackAddress irgen::emitWitnessTablePack(IRGenFunction &IGF,
618629
619630 visitPackExplosion (IGF, packType, visitFn);
620631
621- return pack;
632+ return { pack, shape} ;
622633}
623634
624635void irgen::cleanupWitnessTablePack (IRGenFunction &IGF, StackAddress pack,
625- Optional< unsigned > elementCount ) {
636+ llvm::Value *shape ) {
626637 if (pack.getExtraInfo ()) {
627638 IGF.emitDeallocateDynamicAlloca (pack);
628- } else {
639+ } else if ( auto count = countForShape (shape)) {
629640 IGF.Builder .CreateLifetimeEnd (pack.getAddress (),
630- IGF.IGM .getPointerSize () * (*elementCount ));
641+ IGF.IGM .getPointerSize () * (count. value () ));
631642 }
632643}
633644
@@ -650,7 +661,9 @@ llvm::Value *irgen::emitWitnessTablePackRef(IRGenFunction &IGF,
650661 if (auto *wtable = tryGetLocalPackTypeData (IGF, packType, localDataKind))
651662 return wtable;
652663
653- auto pack = emitWitnessTablePack (IGF, packType, conformance);
664+ StackAddress pack;
665+ llvm::Value *shape;
666+ std::tie (pack, shape) = emitWitnessTablePack (IGF, packType, conformance);
654667
655668 auto *result = pack.getAddress ().getAddress ();
656669 result = IGF.Builder .CreatePointerCast (
@@ -1018,14 +1031,13 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
10181031 }
10191032}
10201033
1021- void irgen::cleanupTypeMetadataPack (IRGenFunction &IGF,
1022- StackAddress pack,
1023- Optional<unsigned > elementCount) {
1034+ void irgen::cleanupTypeMetadataPack (IRGenFunction &IGF, StackAddress pack,
1035+ llvm::Value *shape) {
10241036 if (pack.getExtraInfo ()) {
10251037 IGF.emitDeallocateDynamicAlloca (pack);
1026- } else {
1038+ } else if ( auto count = countForShape (shape)) {
10271039 IGF.Builder .CreateLifetimeEnd (pack.getAddress (),
1028- IGF.IGM .getPointerSize () * (*elementCount ));
1040+ IGF.IGM .getPointerSize () * (*count ));
10291041 }
10301042}
10311043
0 commit comments