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