Skip to content

Commit 6ddf14e

Browse files
committed
[GenPack] NFC: Stack de/alloc traffics in shapes.
When allocating, the shape is computed, and it (its constant value if any) is needed when deallocating, so return the shape along with the address. And when deallocating, accept the shape, which the client received during allocation, rather than requiring that the caller compute the fixed size.
1 parent 4ecb0a4 commit 6ddf14e

File tree

3 files changed

+45
-36
lines changed

3 files changed

+45
-36
lines changed

lib/IRGen/GenPack.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

494501
MetadataResponse
@@ -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

624635
void 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

lib/IRGen/GenPack.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,8 @@ emitPackArchetypeMetadataRef(IRGenFunction &IGF,
4343
CanPackArchetypeType type,
4444
DynamicMetadataRequest request);
4545

46-
StackAddress
47-
emitTypeMetadataPack(IRGenFunction &IGF,
48-
CanPackType packType,
46+
std::pair<StackAddress, llvm::Value *>
47+
emitTypeMetadataPack(IRGenFunction &IGF, CanPackType packType,
4948
DynamicMetadataRequest request);
5049

5150
MetadataResponse
@@ -68,18 +67,18 @@ emitTypeMetadataPackElementRef(IRGenFunction &IGF, CanPackType packType,
6867
DynamicMetadataRequest request,
6968
llvm::SmallVectorImpl<llvm::Value *> &wtables);
7069

71-
void cleanupTypeMetadataPack(IRGenFunction &IGF,
72-
StackAddress pack,
73-
Optional<unsigned> elementCount);
70+
void cleanupTypeMetadataPack(IRGenFunction &IGF, StackAddress pack,
71+
llvm::Value *shape);
7472

75-
StackAddress emitWitnessTablePack(IRGenFunction &IGF, CanPackType packType,
76-
PackConformance *conformance);
73+
std::pair<StackAddress, llvm::Value *>
74+
emitWitnessTablePack(IRGenFunction &IGF, CanPackType packType,
75+
PackConformance *conformance);
7776

7877
llvm::Value *emitWitnessTablePackRef(IRGenFunction &IGF, CanPackType packType,
7978
PackConformance *conformance);
8079

8180
void cleanupWitnessTablePack(IRGenFunction &IGF, StackAddress pack,
82-
Optional<unsigned> elementCount);
81+
llvm::Value *shape);
8382

8483
/// Emit the dynamic index of a particular structural component
8584
/// of the given pack type. If the component is a pack expansion, this

lib/IRGen/MetadataRequest.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,10 @@ static MetadataResponse emitDynamicTupleTypeMetadataRef(IRGenFunction &IGF,
12331233

12341234
// Otherwise, we know that either statically or dynamically, we have more than
12351235
// one element. Emit the pack.
1236-
auto addr = emitTypeMetadataPack(IGF, packType, MetadataState::Abstract);
1236+
llvm::Value *shape;
1237+
StackAddress addr;
1238+
std::tie(addr, shape) =
1239+
emitTypeMetadataPack(IGF, packType, MetadataState::Abstract);
12371240

12381241
auto *pointerToFirst = IGF.Builder.CreatePointerCast(
12391242
addr.getAddressPointer(), IGF.IGM.TypeMetadataPtrPtrTy);
@@ -1252,12 +1255,7 @@ static MetadataResponse emitDynamicTupleTypeMetadataRef(IRGenFunction &IGF,
12521255
call->setCallingConv(IGF.IGM.SwiftCC);
12531256
call->setDoesNotThrow();
12541257

1255-
// Clean up the pack.
1256-
Optional<unsigned> elementCount = 0;
1257-
if (auto *constant = dyn_cast<llvm::ConstantInt>(shapeExpression))
1258-
elementCount = constant->getValue().getZExtValue();
1259-
1260-
cleanupTypeMetadataPack(IGF, addr, elementCount);
1258+
cleanupTypeMetadataPack(IGF, addr, shape);
12611259
}
12621260

12631261
// Control flow join with the one-element case.

0 commit comments

Comments
 (0)