@@ -3927,8 +3927,8 @@ namespace {
3927
3927
} else if (allSingleRefcount
3928
3928
&& ElementsWithNoPayload.size() <= 1) {
3929
3929
CopyDestroyKind = TaggedRefcounted;
3930
- } else if (this->EnumImplStrategy::BitwiseTakable == IsBitwiseTakable &&
3931
- Copyable == IsCopyable) {
3930
+ } else if (this->EnumImplStrategy::BitwiseTakable == IsBitwiseTakableAndBorrowable
3931
+ && Copyable == IsCopyable) {
3932
3932
CopyDestroyKind = BitwiseTakable;
3933
3933
}
3934
3934
}
@@ -6396,7 +6396,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
6396
6396
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
6397
6397
auto copyable = !theEnum->canBeCopyable()
6398
6398
? IsNotCopyable : IsCopyable;
6399
- auto bitwiseTakable = IsBitwiseTakable ; // FIXME: will there be check here?
6399
+ auto bitwiseTakable = IsBitwiseTakableAndBorrowable ; // FIXME: will there be check here?
6400
6400
bool allowFixedLayoutOptimizations = true;
6401
6401
std::vector<Element> elementsWithPayload;
6402
6402
std::vector<Element> elementsWithNoPayload;
@@ -6408,7 +6408,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
6408
6408
payloadTI.isTriviallyDestroyable(ResilienceExpansion::Maximal);
6409
6409
copyable = copyable & payloadTI.isCopyable(ResilienceExpansion::Maximal);
6410
6410
bitwiseTakable = bitwiseTakable &
6411
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
6411
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
6412
6412
};
6413
6413
6414
6414
if (TC.IGM.isResilient(theEnum, ResilienceExpansion::Minimal))
@@ -6861,7 +6861,8 @@ EnumImplStrategy::getFixedEnumTypeInfo(llvm::StructType *T, Size S,
6861
6861
abiAccessible);
6862
6862
break;
6863
6863
case Loadable:
6864
- assert(isBT && "loadable enum not bitwise takable?!");
6864
+ assert(isBT == IsBitwiseTakableAndBorrowable
6865
+ && "loadable enum not bitwise takable?!");
6865
6866
mutableTI = new LoadableEnumTypeInfo(*this, T, S, std::move(SB), A,
6866
6867
isTriviallyDestroyable,
6867
6868
isCopyable,
@@ -7084,7 +7085,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeFixedLayout(
7084
7085
getFixedEnumTypeInfo(
7085
7086
enumTy, Size(sizeWithTag), spareBits.build(), alignment,
7086
7087
deinit & payloadTI.isTriviallyDestroyable(ResilienceExpansion::Maximal),
7087
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7088
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
7088
7089
copyable, isABIAccessible);
7089
7090
7090
7091
if (TIK >= Loadable && CopyDestroyKind == Normal) {
@@ -7120,7 +7121,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeDynamicLayout(
7120
7121
return registerEnumTypeInfo(new NonFixedEnumTypeInfo(*this, enumTy,
7121
7122
alignment,
7122
7123
deinit & payloadTI.isTriviallyDestroyable(ResilienceExpansion::Maximal),
7123
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7124
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
7124
7125
copyable,
7125
7126
enumAccessible));
7126
7127
}
@@ -7155,16 +7156,15 @@ MultiPayloadEnumImplStrategy::completeFixedLayout(TypeConverter &TC,
7155
7156
? IsNotCopyable : IsCopyable;
7156
7157
auto isTriviallyDestroyable = theEnum->getValueTypeDestructor()
7157
7158
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7158
- IsBitwiseTakable_t isBT = IsBitwiseTakable ;
7159
+ IsBitwiseTakable_t isBT = IsBitwiseTakableAndBorrowable ;
7159
7160
PayloadSize = 0;
7160
7161
for (auto &elt : ElementsWithPayload) {
7161
7162
auto &fixedPayloadTI = cast<FixedTypeInfo>(*elt.ti);
7162
7163
if (fixedPayloadTI.getFixedAlignment() > worstAlignment)
7163
7164
worstAlignment = fixedPayloadTI.getFixedAlignment();
7164
7165
if (!fixedPayloadTI.isTriviallyDestroyable(ResilienceExpansion::Maximal))
7165
7166
isTriviallyDestroyable = IsNotTriviallyDestroyable;
7166
- if (!fixedPayloadTI.isBitwiseTakable(ResilienceExpansion::Maximal))
7167
- isBT = IsNotBitwiseTakable;
7167
+ isBT &= fixedPayloadTI.getBitwiseTakable(ResilienceExpansion::Maximal);
7168
7168
7169
7169
unsigned payloadBytes = fixedPayloadTI.getFixedSize().getValue();
7170
7170
unsigned payloadBits = fixedPayloadTI.getFixedSize().getValueInBits();
@@ -7324,12 +7324,12 @@ TypeInfo *MultiPayloadEnumImplStrategy::completeDynamicLayout(
7324
7324
Alignment alignment(1);
7325
7325
auto td = theEnum->getValueTypeDestructor()
7326
7326
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7327
- auto bt = IsBitwiseTakable ;
7327
+ auto bt = IsBitwiseTakableAndBorrowable ;
7328
7328
for (auto &element : ElementsWithPayload) {
7329
7329
auto &payloadTI = *element.ti;
7330
7330
alignment = std::max(alignment, payloadTI.getBestKnownAlignment());
7331
7331
td &= payloadTI.isTriviallyDestroyable(ResilienceExpansion::Maximal);
7332
- bt &= payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
7332
+ bt &= payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
7333
7333
}
7334
7334
7335
7335
applyLayoutAttributes(TC.IGM, theEnum, /*fixed*/false, alignment);
0 commit comments