@@ -3927,8 +3927,8 @@ namespace {
39273927 } else if (allSingleRefcount
39283928 && ElementsWithNoPayload.size () <= 1 ) {
39293929 CopyDestroyKind = TaggedRefcounted;
3930- } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakable &&
3931- Copyable == IsCopyable) {
3930+ } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakableAndBorrowable
3931+ && Copyable == IsCopyable) {
39323932 CopyDestroyKind = BitwiseTakable;
39333933 }
39343934 }
@@ -6396,7 +6396,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
63966396 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
63976397 auto copyable = !theEnum->canBeCopyable ()
63986398 ? IsNotCopyable : IsCopyable;
6399- auto bitwiseTakable = IsBitwiseTakable ; // FIXME: will there be check here?
6399+ auto bitwiseTakable = IsBitwiseTakableAndBorrowable ; // FIXME: will there be check here?
64006400 bool allowFixedLayoutOptimizations = true ;
64016401 std::vector<Element> elementsWithPayload;
64026402 std::vector<Element> elementsWithNoPayload;
@@ -6408,7 +6408,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
64086408 payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
64096409 copyable = copyable & payloadTI.isCopyable (ResilienceExpansion::Maximal);
64106410 bitwiseTakable = bitwiseTakable &
6411- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
6411+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
64126412 };
64136413
64146414 if (TC.IGM .isResilient (theEnum, ResilienceExpansion::Minimal))
@@ -6861,7 +6861,8 @@ EnumImplStrategy::getFixedEnumTypeInfo(llvm::StructType *T, Size S,
68616861 abiAccessible);
68626862 break ;
68636863 case Loadable:
6864- assert (isBT && " loadable enum not bitwise takable?!" );
6864+ assert (isBT == IsBitwiseTakableAndBorrowable
6865+ && " loadable enum not bitwise takable?!" );
68656866 mutableTI = new LoadableEnumTypeInfo (*this , T, S, std::move (SB), A,
68666867 isTriviallyDestroyable,
68676868 isCopyable,
@@ -7084,7 +7085,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeFixedLayout(
70847085 getFixedEnumTypeInfo (
70857086 enumTy, Size (sizeWithTag), spareBits.build (), alignment,
70867087 deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7087- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7088+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
70887089 copyable, isABIAccessible);
70897090
70907091 if (TIK >= Loadable && CopyDestroyKind == Normal) {
@@ -7120,7 +7121,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeDynamicLayout(
71207121 return registerEnumTypeInfo (new NonFixedEnumTypeInfo (*this , enumTy,
71217122 alignment,
71227123 deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7123- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7124+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
71247125 copyable,
71257126 enumAccessible));
71267127}
@@ -7155,16 +7156,15 @@ MultiPayloadEnumImplStrategy::completeFixedLayout(TypeConverter &TC,
71557156 ? IsNotCopyable : IsCopyable;
71567157 auto isTriviallyDestroyable = theEnum->getValueTypeDestructor ()
71577158 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7158- IsBitwiseTakable_t isBT = IsBitwiseTakable ;
7159+ IsBitwiseTakable_t isBT = IsBitwiseTakableAndBorrowable ;
71597160 PayloadSize = 0 ;
71607161 for (auto &elt : ElementsWithPayload) {
71617162 auto &fixedPayloadTI = cast<FixedTypeInfo>(*elt.ti );
71627163 if (fixedPayloadTI.getFixedAlignment () > worstAlignment)
71637164 worstAlignment = fixedPayloadTI.getFixedAlignment ();
71647165 if (!fixedPayloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal))
71657166 isTriviallyDestroyable = IsNotTriviallyDestroyable;
7166- if (!fixedPayloadTI.isBitwiseTakable (ResilienceExpansion::Maximal))
7167- isBT = IsNotBitwiseTakable;
7167+ isBT &= fixedPayloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
71687168
71697169 unsigned payloadBytes = fixedPayloadTI.getFixedSize ().getValue ();
71707170 unsigned payloadBits = fixedPayloadTI.getFixedSize ().getValueInBits ();
@@ -7324,12 +7324,12 @@ TypeInfo *MultiPayloadEnumImplStrategy::completeDynamicLayout(
73247324 Alignment alignment (1 );
73257325 auto td = theEnum->getValueTypeDestructor ()
73267326 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7327- auto bt = IsBitwiseTakable ;
7327+ auto bt = IsBitwiseTakableAndBorrowable ;
73287328 for (auto &element : ElementsWithPayload) {
73297329 auto &payloadTI = *element.ti ;
73307330 alignment = std::max (alignment, payloadTI.getBestKnownAlignment ());
73317331 td &= payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
7332- bt &= payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
7332+ bt &= payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
73337333 }
73347334
73357335 applyLayoutAttributes (TC.IGM , theEnum, /* fixed*/ false , alignment);
0 commit comments