@@ -3906,8 +3906,8 @@ namespace {
3906
3906
} else if (allSingleRefcount
3907
3907
&& ElementsWithNoPayload.size () <= 1 ) {
3908
3908
CopyDestroyKind = TaggedRefcounted;
3909
- } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakable &&
3910
- Copyable == IsCopyable) {
3909
+ } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakableAndBorrowable
3910
+ && Copyable == IsCopyable) {
3911
3911
CopyDestroyKind = BitwiseTakable;
3912
3912
}
3913
3913
}
@@ -6365,7 +6365,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
6365
6365
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
6366
6366
auto copyable = !theEnum->canBeCopyable ()
6367
6367
? IsNotCopyable : IsCopyable;
6368
- auto bitwiseTakable = IsBitwiseTakable ; // FIXME: will there be check here?
6368
+ auto bitwiseTakable = IsBitwiseTakableAndBorrowable ; // FIXME: will there be check here?
6369
6369
bool allowFixedLayoutOptimizations = true ;
6370
6370
std::vector<Element> elementsWithPayload;
6371
6371
std::vector<Element> elementsWithNoPayload;
@@ -6377,7 +6377,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
6377
6377
payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
6378
6378
copyable = copyable & payloadTI.isCopyable (ResilienceExpansion::Maximal);
6379
6379
bitwiseTakable = bitwiseTakable &
6380
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
6380
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
6381
6381
};
6382
6382
6383
6383
if (TC.IGM .isResilient (theEnum, ResilienceExpansion::Minimal))
@@ -6825,7 +6825,8 @@ EnumImplStrategy::getFixedEnumTypeInfo(llvm::StructType *T, Size S,
6825
6825
AlwaysFixedSize);
6826
6826
break ;
6827
6827
case Loadable:
6828
- assert (isBT && " loadable enum not bitwise takable?!" );
6828
+ assert (isBT == IsBitwiseTakableAndBorrowable
6829
+ && " loadable enum not bitwise takable?!" );
6829
6830
mutableTI = new LoadableEnumTypeInfo (*this , T, S, std::move (SB), A,
6830
6831
isTriviallyDestroyable,
6831
6832
isCopyable,
@@ -7038,7 +7039,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeFixedLayout(
7038
7039
getFixedEnumTypeInfo (
7039
7040
enumTy, Size (sizeWithTag), spareBits.build (), alignment,
7040
7041
deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7041
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7042
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
7042
7043
copyable);
7043
7044
if (TIK >= Loadable && CopyDestroyKind == Normal) {
7044
7045
computePayloadTypesAndTagType (TC.IGM , *TI, PayloadTypesAndTagType);
@@ -7073,7 +7074,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeDynamicLayout(
7073
7074
return registerEnumTypeInfo (new NonFixedEnumTypeInfo (*this , enumTy,
7074
7075
alignment,
7075
7076
deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7076
- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7077
+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
7077
7078
copyable,
7078
7079
enumAccessible));
7079
7080
}
@@ -7108,16 +7109,15 @@ MultiPayloadEnumImplStrategy::completeFixedLayout(TypeConverter &TC,
7108
7109
? IsNotCopyable : IsCopyable;
7109
7110
auto isTriviallyDestroyable = theEnum->getValueTypeDestructor ()
7110
7111
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7111
- IsBitwiseTakable_t isBT = IsBitwiseTakable ;
7112
+ IsBitwiseTakable_t isBT = IsBitwiseTakableAndBorrowable ;
7112
7113
PayloadSize = 0 ;
7113
7114
for (auto &elt : ElementsWithPayload) {
7114
7115
auto &fixedPayloadTI = cast<FixedTypeInfo>(*elt.ti );
7115
7116
if (fixedPayloadTI.getFixedAlignment () > worstAlignment)
7116
7117
worstAlignment = fixedPayloadTI.getFixedAlignment ();
7117
7118
if (!fixedPayloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal))
7118
7119
isTriviallyDestroyable = IsNotTriviallyDestroyable;
7119
- if (!fixedPayloadTI.isBitwiseTakable (ResilienceExpansion::Maximal))
7120
- isBT = IsNotBitwiseTakable;
7120
+ isBT &= fixedPayloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
7121
7121
7122
7122
unsigned payloadBytes = fixedPayloadTI.getFixedSize ().getValue ();
7123
7123
unsigned payloadBits = fixedPayloadTI.getFixedSize ().getValueInBits ();
@@ -7274,12 +7274,12 @@ TypeInfo *MultiPayloadEnumImplStrategy::completeDynamicLayout(
7274
7274
Alignment alignment (1 );
7275
7275
auto td = theEnum->getValueTypeDestructor ()
7276
7276
? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7277
- auto bt = IsBitwiseTakable ;
7277
+ auto bt = IsBitwiseTakableAndBorrowable ;
7278
7278
for (auto &element : ElementsWithPayload) {
7279
7279
auto &payloadTI = *element.ti ;
7280
7280
alignment = std::max (alignment, payloadTI.getBestKnownAlignment ());
7281
7281
td &= payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
7282
- bt &= payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
7282
+ bt &= payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
7283
7283
}
7284
7284
7285
7285
applyLayoutAttributes (TC.IGM , theEnum, /* fixed*/ false , alignment);
0 commit comments