@@ -933,6 +933,21 @@ static bool isRuntimeInstatiatedLayoutString(IRGenModule &IGM,
933
933
return false ;
934
934
}
935
935
936
+ static bool
937
+ useMultiPayloadEnumFNSpecialization (IRGenModule &IGM,
938
+ const TypeLayoutEntry *typeLayoutEntry,
939
+ GenericSignature genericSig) {
940
+ // if (!typeLayoutEntry->layoutString(IGM, genericSig)) {
941
+ // return false;
942
+ // }
943
+ // auto *enumTLE = typeLayoutEntry->getAsEnum();
944
+ // return enumTLE && enumTLE->isFixedSize(IGM) &&
945
+ // enumTLE->isMultiPayloadEnum();
946
+
947
+ // Disabled for now
948
+ return false ;
949
+ }
950
+
936
951
static llvm::Constant *getEnumTagFunction (IRGenModule &IGM,
937
952
const EnumTypeLayoutEntry *typeLayoutEntry,
938
953
GenericSignature genericSig) {
@@ -953,19 +968,7 @@ static llvm::Constant *getEnumTagFunction(IRGenModule &IGM,
953
968
} else if (typeLayoutEntry->isMultiPayloadEnum ()) {
954
969
return IGM.getEnumFnGetEnumTagFn ();
955
970
} else {
956
- auto &payloadTI = **(typeLayoutEntry->cases [0 ]->getFixedTypeInfo ());
957
- auto mask = payloadTI.getFixedExtraInhabitantMask (IGM);
958
- auto tzCount = mask.countTrailingZeros ();
959
- auto shiftedMask = mask.lshr (tzCount);
960
- // auto toCount = shiftedMask.countTrailingOnes();
961
- // if (payloadTI.mayHaveExtraInhabitants(IGM) &&
962
- // (mask.popcount() > 64 ||
963
- // toCount != mask.popcount() ||
964
- // (tzCount % toCount != 0))) {
965
- return IGM.getEnumFnGetEnumTagFn ();
966
- // } else {
967
- // return IGM.getEnumSimpleGetEnumTagFn();
968
- // }
971
+ return IGM.getEnumFnGetEnumTagFn ();
969
972
}
970
973
}
971
974
@@ -990,18 +993,7 @@ getDestructiveInjectEnumTagFunction(IRGenModule &IGM,
990
993
} else if (typeLayoutEntry->isMultiPayloadEnum ()) {
991
994
return nullptr ;
992
995
} else {
993
- auto &payloadTI = **(typeLayoutEntry->cases [0 ]->getFixedTypeInfo ());
994
- auto mask = payloadTI.getFixedExtraInhabitantMask (IGM);
995
- auto tzCount = mask.countTrailingZeros ();
996
- auto shiftedMask = mask.lshr (tzCount);
997
- // auto toCount = shiftedMask.countTrailingOnes();
998
- // if (payloadTI.mayHaveExtraInhabitants(IGM) &&
999
- // (mask.popcount() > 64 || toCount != mask.popcount() ||
1000
- // (tzCount % toCount != 0))) {
1001
- return nullptr ;
1002
- // } else {
1003
- // return IGM.getEnumSimpleDestructiveInjectEnumTagFn();
1004
- // }
996
+ return nullptr ;
1005
997
}
1006
998
}
1007
999
@@ -1072,7 +1064,12 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1072
1064
->getGenericSignature ();
1073
1065
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1074
1066
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1075
- return addFunction (IGM.getGenericDestroyFn ());
1067
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1068
+ genericSig)) {
1069
+ return addFunction (IGM.getGenericDestroyMultiPayloadEnumFNFn ());
1070
+ } else {
1071
+ return addFunction (IGM.getGenericDestroyFn ());
1072
+ }
1076
1073
}
1077
1074
}
1078
1075
}
@@ -1101,8 +1098,14 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1101
1098
->getGenericSignature ();
1102
1099
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1103
1100
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1104
- return addFunction (
1105
- IGM.getGenericInitializeBufferWithCopyOfBufferFn ());
1101
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1102
+ genericSig)) {
1103
+ return addFunction (
1104
+ IGM.getGenericInitializeBufferWithCopyOfBufferMultiPayloadEnumFNFn ());
1105
+ } else {
1106
+ return addFunction (
1107
+ IGM.getGenericInitializeBufferWithCopyOfBufferFn ());
1108
+ }
1106
1109
}
1107
1110
}
1108
1111
}
@@ -1121,7 +1124,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1121
1124
->getGenericSignature ();
1122
1125
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1123
1126
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1124
- return addFunction (IGM.getGenericInitWithTakeFn ());
1127
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1128
+ genericSig)) {
1129
+ return addFunction (
1130
+ IGM.getGenericInitWithTakeMultiPayloadEnumFNFn ());
1131
+ } else {
1132
+ return addFunction (IGM.getGenericInitWithTakeFn ());
1133
+ }
1125
1134
}
1126
1135
}
1127
1136
}
@@ -1142,7 +1151,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1142
1151
->getGenericSignature ();
1143
1152
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1144
1153
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1145
- return addFunction (IGM.getGenericAssignWithCopyFn ());
1154
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1155
+ genericSig)) {
1156
+ return addFunction (
1157
+ IGM.getGenericAssignWithCopyMultiPayloadEnumFNFn ());
1158
+ } else {
1159
+ return addFunction (IGM.getGenericAssignWithCopyFn ());
1160
+ }
1146
1161
}
1147
1162
}
1148
1163
}
@@ -1163,7 +1178,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1163
1178
->getGenericSignature ();
1164
1179
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1165
1180
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1166
- return addFunction (IGM.getGenericAssignWithTakeFn ());
1181
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1182
+ genericSig)) {
1183
+ return addFunction (
1184
+ IGM.getGenericAssignWithTakeMultiPayloadEnumFNFn ());
1185
+ } else {
1186
+ return addFunction (IGM.getGenericAssignWithTakeFn ());
1187
+ }
1167
1188
}
1168
1189
}
1169
1190
}
@@ -1184,7 +1205,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
1184
1205
->getGenericSignature ();
1185
1206
if (typeLayoutEntry->layoutString (IGM, genericSig) ||
1186
1207
isRuntimeInstatiatedLayoutString (IGM, typeLayoutEntry)) {
1187
- return addFunction (IGM.getGenericInitWithCopyFn ());
1208
+ if (useMultiPayloadEnumFNSpecialization (IGM, typeLayoutEntry,
1209
+ genericSig)) {
1210
+ return addFunction (
1211
+ IGM.getGenericInitWithCopyMultiPayloadEnumFNFn ());
1212
+ } else {
1213
+ return addFunction (IGM.getGenericInitWithCopyFn ());
1214
+ }
1188
1215
}
1189
1216
}
1190
1217
}
0 commit comments