diff options
Diffstat (limited to 'lib/Bitcode/Writer')
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 182 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.cpp | 4 | 
2 files changed, 150 insertions, 36 deletions
diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 87b47dc354b5..ba4f932e2e6d 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -112,6 +112,8 @@ enum {    // FUNCTION_BLOCK abbrev id's.    FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV, +  FUNCTION_INST_UNOP_ABBREV, +  FUNCTION_INST_UNOP_FLAGS_ABBREV,    FUNCTION_INST_BINOP_ABBREV,    FUNCTION_INST_BINOP_FLAGS_ABBREV,    FUNCTION_INST_CAST_ABBREV, @@ -513,6 +515,13 @@ static unsigned getEncodedCastOpcode(unsigned Opcode) {    }  } +static unsigned getEncodedUnaryOpcode(unsigned Opcode) { +  switch (Opcode) { +  default: llvm_unreachable("Unknown binary instruction!"); +  case Instruction::FNeg: return bitc::UNOP_NEG; +  } +} +  static unsigned getEncodedBinaryOpcode(unsigned Opcode) {    switch (Opcode) {    default: llvm_unreachable("Unknown binary instruction!"); @@ -690,6 +699,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {      return bitc::ATTR_KIND_SANITIZE_THREAD;    case Attribute::SanitizeMemory:      return bitc::ATTR_KIND_SANITIZE_MEMORY; +  case Attribute::SpeculativeLoadHardening: +    return bitc::ATTR_KIND_SPECULATIVE_LOAD_HARDENING;    case Attribute::SwiftError:      return bitc::ATTR_KIND_SWIFT_ERROR;    case Attribute::SwiftSelf: @@ -969,6 +980,7 @@ static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags) {    RawFlags |= (Flags.ReadOnly << 1);    RawFlags |= (Flags.NoRecurse << 2);    RawFlags |= (Flags.ReturnDoesNotAlias << 3); +  RawFlags |= (Flags.NoInline << 4);    return RawFlags;  } @@ -988,6 +1000,11 @@ static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {    return RawFlags;  } +static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags) { +  uint64_t RawFlags = Flags.ReadOnly; +  return RawFlags; +} +  static unsigned getEncodedVisibility(const GlobalValue &GV) {    switch (GV.getVisibility()) {    case GlobalValue::DefaultVisibility:   return 0; @@ -1264,7 +1281,7 @@ void ModuleBitcodeWriter::writeModuleInfo() {      // FUNCTION:  [strtab offset, strtab size, type, callingconv, isproto,      //             linkage, paramattrs, alignment, section, visibility, gc,      //             unnamed_addr, prologuedata, dllstorageclass, comdat, -    //             prefixdata, personalityfn, DSO_Local] +    //             prefixdata, personalityfn, DSO_Local, addrspace]      Vals.push_back(addToStrtab(F.getName()));      Vals.push_back(F.getName().size());      Vals.push_back(VE.getTypeID(F.getFunctionType())); @@ -1287,6 +1304,8 @@ void ModuleBitcodeWriter::writeModuleInfo() {          F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0);      Vals.push_back(F.isDSOLocal()); +    Vals.push_back(F.getAddressSpace()); +      unsigned AbbrevToUse = 0;      Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);      Vals.clear(); @@ -1399,6 +1418,7 @@ unsigned ModuleBitcodeWriter::createDILocationAbbrev() {    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));    return Stream.EmitAbbrev(std::move(Abbv));  } @@ -1413,6 +1433,7 @@ void ModuleBitcodeWriter::writeDILocation(const DILocation *N,    Record.push_back(N->getColumn());    Record.push_back(VE.getMetadataID(N->getScope()));    Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt())); +  Record.push_back(N->isImplicitCode());    Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev);    Record.clear(); @@ -1486,6 +1507,7 @@ void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N,    Record.push_back(N->getSizeInBits());    Record.push_back(N->getAlignInBits());    Record.push_back(N->getEncoding()); +  Record.push_back(N->getFlags());    Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);    Record.clear(); @@ -1602,7 +1624,7 @@ void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,    Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));    Record.push_back(N->getSplitDebugInlining());    Record.push_back(N->getDebugInfoForProfiling()); -  Record.push_back(N->getGnuPubnames()); +  Record.push_back((unsigned)N->getNameTableKind());    Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);    Record.clear(); @@ -1611,22 +1633,20 @@ void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,  void ModuleBitcodeWriter::writeDISubprogram(const DISubprogram *N,                                              SmallVectorImpl<uint64_t> &Record,                                              unsigned Abbrev) { -  uint64_t HasUnitFlag = 1 << 1; -  Record.push_back(N->isDistinct() | HasUnitFlag); +  const uint64_t HasUnitFlag = 1 << 1; +  const uint64_t HasSPFlagsFlag = 1 << 2; +  Record.push_back(uint64_t(N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);    Record.push_back(VE.getMetadataOrNullID(N->getScope()));    Record.push_back(VE.getMetadataOrNullID(N->getRawName()));    Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));    Record.push_back(VE.getMetadataOrNullID(N->getFile()));    Record.push_back(N->getLine());    Record.push_back(VE.getMetadataOrNullID(N->getType())); -  Record.push_back(N->isLocalToUnit()); -  Record.push_back(N->isDefinition());    Record.push_back(N->getScopeLine());    Record.push_back(VE.getMetadataOrNullID(N->getContainingType())); -  Record.push_back(N->getVirtuality()); +  Record.push_back(N->getSPFlags());    Record.push_back(N->getVirtualIndex());    Record.push_back(N->getFlags()); -  Record.push_back(N->isOptimized());    Record.push_back(VE.getMetadataOrNullID(N->getRawUnit()));    Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));    Record.push_back(VE.getMetadataOrNullID(N->getDeclaration())); @@ -1738,7 +1758,7 @@ void ModuleBitcodeWriter::writeDITemplateValueParameter(  void ModuleBitcodeWriter::writeDIGlobalVariable(      const DIGlobalVariable *N, SmallVectorImpl<uint64_t> &Record,      unsigned Abbrev) { -  const uint64_t Version = 1 << 1; +  const uint64_t Version = 2 << 1;    Record.push_back((uint64_t)N->isDistinct() | Version);    Record.push_back(VE.getMetadataOrNullID(N->getScope()));    Record.push_back(VE.getMetadataOrNullID(N->getRawName())); @@ -1748,8 +1768,8 @@ void ModuleBitcodeWriter::writeDIGlobalVariable(    Record.push_back(VE.getMetadataOrNullID(N->getType()));    Record.push_back(N->isLocalToUnit());    Record.push_back(N->isDefinition()); -  Record.push_back(/* expr */ 0);    Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration())); +  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams()));    Record.push_back(N->getAlignInBits());    Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev); @@ -2376,6 +2396,16 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,              Record.push_back(Flags);          }          break; +      case Instruction::FNeg: { +        assert(CE->getNumOperands() == 1 && "Unknown constant expr!"); +        Code = bitc::CST_CODE_CE_UNOP; +        Record.push_back(getEncodedUnaryOpcode(CE->getOpcode())); +        Record.push_back(VE.getValueID(C->getOperand(0))); +        uint64_t Flags = getOptimizationFlags(CE); +        if (Flags != 0) +          Record.push_back(Flags); +        break; +      }        case Instruction::GetElementPtr: {          Code = bitc::CST_CODE_CE_GEP;          const auto *GO = cast<GEPOperator>(C); @@ -2548,7 +2578,19 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,        }      }      break; - +  case Instruction::FNeg: { +    Code = bitc::FUNC_CODE_INST_UNOP; +    if (!pushValueAndType(I.getOperand(0), InstID, Vals)) +      AbbrevToUse = FUNCTION_INST_UNOP_ABBREV; +    Vals.push_back(getEncodedUnaryOpcode(I.getOpcode())); +    uint64_t Flags = getOptimizationFlags(&I); +    if (Flags != 0) { +      if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV) +        AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV; +      Vals.push_back(Flags); +    } +    break; +  }    case Instruction::GetElementPtr: {      Code = bitc::FUNC_CODE_INST_GEP;      AbbrevToUse = FUNCTION_INST_GEP_ABBREV; @@ -3088,6 +3130,7 @@ void ModuleBitcodeWriter::writeFunction(        Vals.push_back(DL->getColumn());        Vals.push_back(VE.getMetadataOrNullID(DL->getScope()));        Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt())); +      Vals.push_back(DL->isImplicitCode());        Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals);        Vals.clear(); @@ -3208,6 +3251,25 @@ void ModuleBitcodeWriter::writeBlockInfo() {          FUNCTION_INST_LOAD_ABBREV)        llvm_unreachable("Unexpected abbrev ordering!");    } +  { // INST_UNOP abbrev for FUNCTION_BLOCK. +    auto Abbv = std::make_shared<BitCodeAbbrev>(); +    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP)); +    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS +    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc +    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) != +        FUNCTION_INST_UNOP_ABBREV) +      llvm_unreachable("Unexpected abbrev ordering!"); +  } +  { // INST_UNOP_FLAGS abbrev for FUNCTION_BLOCK. +    auto Abbv = std::make_shared<BitCodeAbbrev>(); +    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP)); +    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS +    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc +    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags +    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) != +        FUNCTION_INST_UNOP_FLAGS_ABBREV) +      llvm_unreachable("Unexpected abbrev ordering!"); +  }    { // INST_BINOP abbrev for FUNCTION_BLOCK.      auto Abbv = std::make_shared<BitCodeAbbrev>();      Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP)); @@ -3353,14 +3415,10 @@ void IndexBitcodeWriter::writeModStrings() {  /// Write the function type metadata related records that need to appear before  /// a function summary entry (whether per-module or combined). -static void writeFunctionTypeMetadataRecords( -    BitstreamWriter &Stream, FunctionSummary *FS, -    std::set<GlobalValue::GUID> &ReferencedTypeIds) { -  if (!FS->type_tests().empty()) { +static void writeFunctionTypeMetadataRecords(BitstreamWriter &Stream, +                                             FunctionSummary *FS) { +  if (!FS->type_tests().empty())      Stream.EmitRecord(bitc::FS_TYPE_TESTS, FS->type_tests()); -    for (auto &TT : FS->type_tests()) -      ReferencedTypeIds.insert(TT); -  }    SmallVector<uint64_t, 64> Record; @@ -3372,7 +3430,6 @@ static void writeFunctionTypeMetadataRecords(      for (auto &VF : VFs) {        Record.push_back(VF.GUID);        Record.push_back(VF.Offset); -      ReferencedTypeIds.insert(VF.GUID);      }      Stream.EmitRecord(Ty, Record);    }; @@ -3387,7 +3444,6 @@ static void writeFunctionTypeMetadataRecords(      for (auto &VC : VCs) {        Record.clear();        Record.push_back(VC.VFunc.GUID); -      ReferencedTypeIds.insert(VC.VFunc.GUID);        Record.push_back(VC.VFunc.Offset);        Record.insert(Record.end(), VC.Args.begin(), VC.Args.end());        Stream.EmitRecord(Ty, Record); @@ -3400,6 +3456,33 @@ static void writeFunctionTypeMetadataRecords(                       FS->type_checked_load_const_vcalls());  } +/// Collect type IDs from type tests used by function. +static void +getReferencedTypeIds(FunctionSummary *FS, +                     std::set<GlobalValue::GUID> &ReferencedTypeIds) { +  if (!FS->type_tests().empty()) +    for (auto &TT : FS->type_tests()) +      ReferencedTypeIds.insert(TT); + +  auto GetReferencedTypesFromVFuncIdVec = +      [&](ArrayRef<FunctionSummary::VFuncId> VFs) { +        for (auto &VF : VFs) +          ReferencedTypeIds.insert(VF.GUID); +      }; + +  GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls()); +  GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls()); + +  auto GetReferencedTypesFromConstVCallVec = +      [&](ArrayRef<FunctionSummary::ConstVCall> VCs) { +        for (auto &VC : VCs) +          ReferencedTypeIds.insert(VC.VFunc.GUID); +      }; + +  GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls()); +  GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls()); +} +  static void writeWholeProgramDevirtResolutionByArg(      SmallVector<uint64_t, 64> &NameVals, const std::vector<uint64_t> &args,      const WholeProgramDevirtResolution::ByArg &ByArg) { @@ -3453,13 +3536,13 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(    NameVals.push_back(ValueID);    FunctionSummary *FS = cast<FunctionSummary>(Summary); -  std::set<GlobalValue::GUID> ReferencedTypeIds; -  writeFunctionTypeMetadataRecords(Stream, FS, ReferencedTypeIds); +  writeFunctionTypeMetadataRecords(Stream, FS);    NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));    NameVals.push_back(FS->instCount());    NameVals.push_back(getEncodedFFlags(FS->fflags()));    NameVals.push_back(FS->refs().size()); +  NameVals.push_back(FS->immutableRefCount());    for (auto &RI : FS->refs())      NameVals.push_back(VE.getValueID(RI.getValue())); @@ -3501,6 +3584,7 @@ void ModuleBitcodeWriterBase::writeModuleLevelReferences(    NameVals.push_back(VE.getValueID(&V));    GlobalVarSummary *VS = cast<GlobalVarSummary>(Summary);    NameVals.push_back(getEncodedGVSummaryFlags(VS->flags())); +  NameVals.push_back(getEncodedGVarFlags(VS->varflags()));    unsigned SizeBeforeRefs = NameVals.size();    for (auto &RI : VS->refs()) @@ -3517,7 +3601,7 @@ void ModuleBitcodeWriterBase::writeModuleLevelReferences(  // Current version for the summary.  // This is bumped whenever we introduce changes in the way some record are  // interpreted, like flags for instance. -static const uint64_t INDEX_VERSION = 4; +static const uint64_t INDEX_VERSION = 6;  /// Emit the per-module summary section alongside the rest of  /// the module's bitcode. @@ -3534,6 +3618,13 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {    Stream.EmitRecord(bitc::FS_VERSION, ArrayRef<uint64_t>{INDEX_VERSION}); +  // Write the index flags. +  uint64_t Flags = 0; +  // Bits 1-3 are set only in the combined index, skip them. +  if (Index->enableSplitLTOUnit()) +    Flags |= 0x8; +  Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Flags}); +    if (Index->begin() == Index->end()) {      Stream.ExitBlock();      return; @@ -3552,6 +3643,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // immutablerefcnt    // numrefs x valueid, n x (valueid, hotness)    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); @@ -3568,6 +3660,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // immutablerefcnt    // numrefs x valueid, n x (valueid [, rel_block_freq])    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); @@ -3646,6 +3739,12 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {      Flags |= 0x1;    if (Index.skipModuleByDistributedBackend())      Flags |= 0x2; +  if (Index.hasSyntheticEntryCounts()) +    Flags |= 0x4; +  if (Index.enableSplitLTOUnit()) +    Flags |= 0x8; +  if (Index.partiallySplitLTOUnits()) +    Flags |= 0x10;    Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Flags});    for (const auto &GVI : valueIds()) { @@ -3661,7 +3760,9 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // entrycount    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // immutablerefcnt    // numrefs x valueid, n x (valueid)    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); @@ -3676,6 +3777,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs +  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // immutablerefcnt    // numrefs x valueid, n x (valueid, hotness)    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); @@ -3748,6 +3850,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {        NameVals.push_back(*ValueId);        NameVals.push_back(Index.getModuleId(VS->modulePath()));        NameVals.push_back(getEncodedGVSummaryFlags(VS->flags())); +      NameVals.push_back(getEncodedGVarFlags(VS->varflags()));        for (auto &RI : VS->refs()) {          auto RefValueId = getValueId(RI.getGUID());          if (!RefValueId) @@ -3764,25 +3867,32 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {      }      auto *FS = cast<FunctionSummary>(S); -    writeFunctionTypeMetadataRecords(Stream, FS, ReferencedTypeIds); +    writeFunctionTypeMetadataRecords(Stream, FS); +    getReferencedTypeIds(FS, ReferencedTypeIds);      NameVals.push_back(*ValueId);      NameVals.push_back(Index.getModuleId(FS->modulePath()));      NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));      NameVals.push_back(FS->instCount());      NameVals.push_back(getEncodedFFlags(FS->fflags())); +    NameVals.push_back(FS->entryCount()); +      // Fill in below -    NameVals.push_back(0); +    NameVals.push_back(0); // numrefs +    NameVals.push_back(0); // immutablerefcnt -    unsigned Count = 0; +    unsigned Count = 0, ImmutableRefCnt = 0;      for (auto &RI : FS->refs()) {        auto RefValueId = getValueId(RI.getGUID());        if (!RefValueId)          continue;        NameVals.push_back(*RefValueId); +      if (RI.isReadOnly()) +        ImmutableRefCnt++;        Count++;      } -    NameVals[5] = Count; +    NameVals[6] = Count; +    NameVals[7] = ImmutableRefCnt;      bool HasProfileData = false;      for (auto &EI : FS->calls()) { @@ -3851,6 +3961,9 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {      Stream.EmitRecord(bitc::FS_COMBINED_ALIAS, NameVals, FSAliasAbbrev);      NameVals.clear();      MaybeEmitOriginalName(*AS); + +    if (auto *FS = dyn_cast<FunctionSummary>(&AS->getAliasee())) +      getReferencedTypeIds(FS, ReferencedTypeIds);    }    if (!Index.cfiFunctionDefs().empty()) { @@ -3871,12 +3984,13 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {      NameVals.clear();    } -  if (!Index.typeIds().empty()) { -    for (auto &S : Index.typeIds()) { -      // Skip if not referenced in any GV summary within this index file. -      if (!ReferencedTypeIds.count(GlobalValue::getGUID(S.first))) -        continue; -      writeTypeIdSummaryRecord(NameVals, StrtabBuilder, S.first, S.second); +  // Walk the GUIDs that were referenced, and write the +  // corresponding type id records. +  for (auto &T : ReferencedTypeIds) { +    auto TidIter = Index.typeIds().equal_range(T); +    for (auto It = TidIter.first; It != TidIter.second; ++It) { +      writeTypeIdSummaryRecord(NameVals, StrtabBuilder, It->second.first, +                               It->second.second);        Stream.EmitRecord(bitc::FS_TYPE_ID, NameVals);        NameVals.clear();      } @@ -3926,7 +4040,7 @@ void ModuleBitcodeWriter::writeModuleHash(size_t BlockStartPos) {      if (ModHash)        // Save the written hash value. -      std::copy(std::begin(Vals), std::end(Vals), std::begin(*ModHash)); +      llvm::copy(Vals, std::begin(*ModHash));    }  } diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index d473741e8ceb..deb04f1bb36c 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -184,7 +184,7 @@ static void predictValueUseListOrderImpl(const Value *V, const Function *F,      return;    bool IsGlobalValue = OM.isGlobalValue(ID); -  llvm::sort(List.begin(), List.end(), [&](const Entry &L, const Entry &R) { +  llvm::sort(List, [&](const Entry &L, const Entry &R) {      const Use *LU = L.first;      const Use *RU = R.first;      if (LU == RU) @@ -745,7 +745,7 @@ void ValueEnumerator::organizeMetadata() {    // and then sort by the original/current ID.  Since the IDs are guaranteed to    // be unique, the result of std::sort will be deterministic.  There's no need    // for std::stable_sort. -  llvm::sort(Order.begin(), Order.end(), [this](MDIndex LHS, MDIndex RHS) { +  llvm::sort(Order, [this](MDIndex LHS, MDIndex RHS) {      return std::make_tuple(LHS.F, getMetadataTypeOrder(LHS.get(MDs)), LHS.ID) <             std::make_tuple(RHS.F, getMetadataTypeOrder(RHS.get(MDs)), RHS.ID);    });  | 
