@@ -2326,6 +2326,29 @@ namespace {
2326
2326
llvm_unreachable (" ABI-inaccessible type cannot be loadable" );
2327
2327
2328
2328
case Normal: {
2329
+ if (loweredType.hasOpenedExistential ()) {
2330
+ EnumPayload payload;
2331
+ llvm::Value *extraTag;
2332
+ std::tie (payload, extraTag) =
2333
+ getPayloadAndExtraTagFromExplosion (IGF, src);
2334
+ llvm::BasicBlock *endBB =
2335
+ testFixedEnumContainsPayload (IGF, payload, extraTag);
2336
+
2337
+ if (PayloadBitCount > 0 ) {
2338
+ ConditionalDominanceScope condition (IGF);
2339
+ Explosion payloadValue;
2340
+ Explosion payloadCopy;
2341
+ auto &loadableTI = getLoadablePayloadTypeInfo ();
2342
+ loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2343
+ loadableTI.copy (IGF, payloadValue, payloadCopy,
2344
+ IGF.getDefaultAtomicity ());
2345
+ (void )payloadCopy.claimAll ();
2346
+ }
2347
+ IGF.Builder .CreateBr (endBB);
2348
+ IGF.Builder .emitBlock (endBB);
2349
+ return ;
2350
+ }
2351
+
2329
2352
if (!copyEnumFunction)
2330
2353
copyEnumFunction = emitCopyEnumFunction (IGF.IGM , loweredType);
2331
2354
Explosion tmp;
@@ -2363,6 +2386,27 @@ namespace {
2363
2386
llvm_unreachable (" ABI-inaccessible type cannot be loadable" );
2364
2387
2365
2388
case Normal: {
2389
+ if (loweredType.hasOpenedExistential ()) {
2390
+ EnumPayload payload;
2391
+ llvm::Value *extraTag;
2392
+ std::tie (payload, extraTag) =
2393
+ getPayloadAndExtraTagFromExplosion (IGF, src);
2394
+ llvm::BasicBlock *endBB =
2395
+ testFixedEnumContainsPayload (IGF, payload, extraTag);
2396
+
2397
+ // If we did, consume it.
2398
+ if (PayloadBitCount > 0 ) {
2399
+ ConditionalDominanceScope condition (IGF);
2400
+ Explosion payloadValue;
2401
+ auto &loadableTI = getLoadablePayloadTypeInfo ();
2402
+ loadableTI.unpackFromEnumPayload (IGF, payload, payloadValue, 0 );
2403
+ loadableTI.consume (IGF, payloadValue, IGF.getDefaultAtomicity ());
2404
+ }
2405
+
2406
+ IGF.Builder .CreateBr (endBB);
2407
+ IGF.Builder .emitBlock (endBB);
2408
+ return ;
2409
+ }
2366
2410
if (!consumeEnumFunction)
2367
2411
consumeEnumFunction = emitConsumeEnumFunction (IGF.IGM , loweredType);
2368
2412
Explosion tmp;
@@ -4068,6 +4112,22 @@ namespace {
4068
4112
4069
4113
case BitwiseTakable:
4070
4114
case Normal: {
4115
+ if (loweredType.hasOpenedExistential ()) {
4116
+ auto parts = destructureAndTagLoadableEnum (IGF, src);
4117
+
4118
+ forNontrivialPayloads (
4119
+ IGF, parts.tag ,
4120
+ [&](unsigned tagIndex, EnumImplStrategy::Element elt) {
4121
+ auto <i = cast<LoadableTypeInfo>(*elt.ti );
4122
+ Explosion value;
4123
+ projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
4124
+
4125
+ Explosion tmp;
4126
+ lti.copy (IGF, value, tmp, IGF.getDefaultAtomicity ());
4127
+ (void )tmp.claimAll (); // FIXME: repack if not bit-identical
4128
+ });
4129
+ return ;
4130
+ }
4071
4131
if (!copyEnumFunction)
4072
4132
copyEnumFunction = emitCopyEnumFunction (IGF.IGM , loweredType);
4073
4133
Explosion tmp;
@@ -4113,6 +4173,20 @@ namespace {
4113
4173
4114
4174
case BitwiseTakable:
4115
4175
case Normal: {
4176
+ if (loweredType.hasOpenedExistential ()) {
4177
+ auto parts = destructureAndTagLoadableEnum (IGF, src);
4178
+
4179
+ forNontrivialPayloads (
4180
+ IGF, parts.tag ,
4181
+ [&](unsigned tagIndex, EnumImplStrategy::Element elt) {
4182
+ auto <i = cast<LoadableTypeInfo>(*elt.ti );
4183
+ Explosion value;
4184
+ projectPayloadValue (IGF, parts.payload , tagIndex, lti, value);
4185
+
4186
+ lti.consume (IGF, value, IGF.getDefaultAtomicity ());
4187
+ });
4188
+ return ;
4189
+ }
4116
4190
if (!consumeEnumFunction)
4117
4191
consumeEnumFunction = emitConsumeEnumFunction (IGF.IGM , loweredType);
4118
4192
Explosion tmp;
0 commit comments