@@ -443,8 +443,7 @@ namespace {
443
443
getSingleton ()->assignWithCopy (
444
444
IGF, dest, src, getSingletonType (IGF.IGM , T), isOutlined);
445
445
} else {
446
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
447
- typeToMetadataVec;
446
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
448
447
if (T.hasArchetype ()) {
449
448
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
450
449
}
@@ -464,8 +463,7 @@ namespace {
464
463
getSingleton ()->assignWithTake (
465
464
IGF, dest, src, getSingletonType (IGF.IGM , T), isOutlined);
466
465
} else {
467
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
468
- typeToMetadataVec;
466
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
469
467
if (T.hasArchetype ()) {
470
468
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
471
469
}
@@ -492,8 +490,7 @@ namespace {
492
490
getSingleton ()->initializeWithCopy (
493
491
IGF, dest, src, getSingletonType (IGF.IGM , T), isOutlined);
494
492
} else {
495
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
496
- typeToMetadataVec;
493
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
497
494
if (T.hasArchetype ()) {
498
495
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
499
496
}
@@ -513,8 +510,7 @@ namespace {
513
510
getSingleton ()->initializeWithTake (
514
511
IGF, dest, src, getSingletonType (IGF.IGM , T), isOutlined);
515
512
} else {
516
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
517
- typeToMetadataVec;
513
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
518
514
if (T.hasArchetype ()) {
519
515
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
520
516
}
@@ -527,8 +523,7 @@ namespace {
527
523
528
524
void collectArchetypeMetadata (
529
525
IRGenFunction &IGF,
530
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
531
- &typeToMetadataVec,
526
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
532
527
SILType T) const override {
533
528
if (!getSingleton ())
534
529
return ;
@@ -936,8 +931,7 @@ namespace {
936
931
937
932
void collectArchetypeMetadata (
938
933
IRGenFunction &IGF,
939
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
940
- &typeToMetadataVec,
934
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
941
935
SILType T) const override {
942
936
auto canType = T.getSwiftRValueType ();
943
937
assert (!canType->hasArchetype () &&
@@ -1374,8 +1368,7 @@ namespace {
1374
1368
1375
1369
void collectArchetypeMetadata (
1376
1370
IRGenFunction &IGF,
1377
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
1378
- &typeToMetadataVec,
1371
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
1379
1372
SILType T) const override {
1380
1373
assert (TIK >= Loadable);
1381
1374
}
@@ -2674,8 +2667,7 @@ namespace {
2674
2667
if (isOutlined || T.hasOpenedExistential ()) {
2675
2668
emitIndirectAssign (IGF, dest, src, T, IsNotTake, isOutlined);
2676
2669
} else {
2677
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
2678
- typeToMetadataVec;
2670
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
2679
2671
if (T.hasArchetype ()) {
2680
2672
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
2681
2673
}
@@ -2691,8 +2683,7 @@ namespace {
2691
2683
if (isOutlined || T.hasOpenedExistential ()) {
2692
2684
emitIndirectAssign (IGF, dest, src, T, IsTake, isOutlined);
2693
2685
} else {
2694
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
2695
- typeToMetadataVec;
2686
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
2696
2687
if (T.hasArchetype ()) {
2697
2688
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
2698
2689
}
@@ -2708,8 +2699,7 @@ namespace {
2708
2699
if (isOutlined || T.hasOpenedExistential ()) {
2709
2700
emitIndirectInitialize (IGF, dest, src, T, IsNotTake, isOutlined);
2710
2701
} else {
2711
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
2712
- typeToMetadataVec;
2702
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
2713
2703
if (T.hasArchetype ()) {
2714
2704
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
2715
2705
}
@@ -2725,8 +2715,7 @@ namespace {
2725
2715
if (isOutlined || T.hasOpenedExistential ()) {
2726
2716
emitIndirectInitialize (IGF, dest, src, T, IsTake, isOutlined);
2727
2717
} else {
2728
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
2729
- typeToMetadataVec;
2718
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
2730
2719
if (T.hasArchetype ()) {
2731
2720
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
2732
2721
}
@@ -2739,20 +2728,22 @@ namespace {
2739
2728
2740
2729
void collectArchetypeMetadata (
2741
2730
IRGenFunction &IGF,
2742
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
2743
- &typeToMetadataVec,
2731
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
2744
2732
SILType T) const override {
2745
2733
auto canType = T.getSwiftRValueType ();
2746
- if (shouldEmitMetadataRefForLayout (IGF.IGM , canType)) {
2747
- auto *metadata = IGF.emitTypeMetadataRefForLayout (T);
2748
- assert (metadata && " Expected Type Metadata Ref" );
2749
- typeToMetadataVec.push_back (std::make_pair (canType, metadata));
2750
- }
2734
+ // get the size before insertions
2735
+ auto SZ = typeToMetadataVec.size ();
2751
2736
if (CopyDestroyKind == Normal) {
2752
2737
auto payloadT = getPayloadType (IGF.IGM , T);
2753
2738
getPayloadTypeInfo ().collectArchetypeMetadata (IGF, typeToMetadataVec,
2754
2739
payloadT);
2755
2740
}
2741
+ if (typeToMetadataVec.find (canType) == typeToMetadataVec.end () &&
2742
+ SZ != typeToMetadataVec.size ()) {
2743
+ auto *metadata = IGF.emitTypeMetadataRefForLayout (T);
2744
+ assert (metadata && " Expected Type Metadata Ref" );
2745
+ typeToMetadataVec.insert (std::make_pair (canType, metadata));
2746
+ }
2756
2747
}
2757
2748
2758
2749
void storeTag (IRGenFunction &IGF,
@@ -4346,8 +4337,7 @@ namespace {
4346
4337
if (isOutlined || T.hasOpenedExistential ()) {
4347
4338
emitIndirectAssign (IGF, dest, src, T, IsNotTake, isOutlined);
4348
4339
} else {
4349
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4350
- typeToMetadataVec;
4340
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
4351
4341
if (T.hasArchetype ()) {
4352
4342
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
4353
4343
}
@@ -4363,8 +4353,7 @@ namespace {
4363
4353
if (isOutlined || T.hasOpenedExistential ()) {
4364
4354
emitIndirectAssign (IGF, dest, src, T, IsTake, isOutlined);
4365
4355
} else {
4366
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4367
- typeToMetadataVec;
4356
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
4368
4357
if (T.hasArchetype ()) {
4369
4358
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
4370
4359
}
@@ -4380,8 +4369,7 @@ namespace {
4380
4369
if (isOutlined || T.hasOpenedExistential ()) {
4381
4370
emitIndirectInitialize (IGF, dest, src, T, IsNotTake, isOutlined);
4382
4371
} else {
4383
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4384
- typeToMetadataVec;
4372
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
4385
4373
if (T.hasArchetype ()) {
4386
4374
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
4387
4375
}
@@ -4397,8 +4385,7 @@ namespace {
4397
4385
if (isOutlined || T.hasOpenedExistential ()) {
4398
4386
emitIndirectInitialize (IGF, dest, src, T, IsTake, isOutlined);
4399
4387
} else {
4400
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4401
- typeToMetadataVec;
4388
+ llvm::MapVector<CanType, llvm::Value *> typeToMetadataVec;
4402
4389
if (T.hasArchetype ()) {
4403
4390
collectArchetypeMetadata (IGF, typeToMetadataVec, T);
4404
4391
}
@@ -4411,15 +4398,11 @@ namespace {
4411
4398
4412
4399
void collectArchetypeMetadata (
4413
4400
IRGenFunction &IGF,
4414
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4415
- &typeToMetadataVec,
4401
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
4416
4402
SILType T) const override {
4417
4403
auto canType = T.getSwiftRValueType ();
4418
- if (shouldEmitMetadataRefForLayout (IGF.IGM , canType)) {
4419
- auto *metadata = IGF.emitTypeMetadataRefForLayout (T);
4420
- assert (metadata && " Expected Type Metadata Ref" );
4421
- typeToMetadataVec.push_back (std::make_pair (canType, metadata));
4422
- }
4404
+ // get the size before insertions
4405
+ auto SZ = typeToMetadataVec.size ();
4423
4406
if (CopyDestroyKind != Normal) {
4424
4407
return ;
4425
4408
}
@@ -4429,6 +4412,12 @@ namespace {
4429
4412
auto &payloadTI = *payloadCasePair.ti ;
4430
4413
payloadTI.collectArchetypeMetadata (IGF, typeToMetadataVec, PayloadT);
4431
4414
}
4415
+ if (typeToMetadataVec.find (canType) == typeToMetadataVec.end () &&
4416
+ typeToMetadataVec.size () != SZ) {
4417
+ auto *metadata = IGF.emitTypeMetadataRefForLayout (T);
4418
+ assert (metadata && " Expected Type Metadata Ref" );
4419
+ typeToMetadataVec.insert (std::make_pair (canType, metadata));
4420
+ }
4432
4421
}
4433
4422
4434
4423
void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
@@ -4952,16 +4941,15 @@ namespace {
4952
4941
4953
4942
void collectArchetypeMetadata (
4954
4943
IRGenFunction &IGF,
4955
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
4956
- &typeToMetadataVec,
4944
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
4957
4945
SILType T) const override {
4958
4946
auto canType = T.getSwiftRValueType ();
4959
- if (! shouldEmitMetadataRefForLayout (IGF. IGM , canType)) {
4947
+ if (typeToMetadataVec. find ( canType) != typeToMetadataVec. end ( )) {
4960
4948
return ;
4961
4949
}
4962
4950
auto *metadata = IGF.emitTypeMetadataRefForLayout (T);
4963
4951
assert (metadata && " Expected Type Metadata Ref" );
4964
- typeToMetadataVec.push_back (std::make_pair (canType, metadata));
4952
+ typeToMetadataVec.insert (std::make_pair (canType, metadata));
4965
4953
}
4966
4954
4967
4955
void destroy (IRGenFunction &IGF, Address addr, SILType T) const override {
@@ -5346,8 +5334,7 @@ namespace {
5346
5334
}
5347
5335
void collectArchetypeMetadata (
5348
5336
IRGenFunction &IGF,
5349
- llvm::SmallVector<std::pair<CanType, llvm::Value *>, 4 >
5350
- &typeToMetadataVec,
5337
+ llvm::MapVector<CanType, llvm::Value *> &typeToMetadataVec,
5351
5338
SILType T) const override {
5352
5339
return Strategy.collectArchetypeMetadata (IGF, typeToMetadataVec, T);
5353
5340
}
0 commit comments