@@ -1157,6 +1157,24 @@ static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags) {
1157
1157
return RawFlags;
1158
1158
}
1159
1159
1160
+ static uint64_t getEncodedHotnessCallEdgeInfo (const CalleeInfo &CI) {
1161
+ uint64_t RawFlags = 0 ;
1162
+
1163
+ RawFlags |= CI.Hotness ; // 3 bits
1164
+ RawFlags |= (CI.HasTailCall << 3 ); // 1 bit
1165
+
1166
+ return RawFlags;
1167
+ }
1168
+
1169
+ static uint64_t getEncodedRelBFCallEdgeInfo (const CalleeInfo &CI) {
1170
+ uint64_t RawFlags = 0 ;
1171
+
1172
+ RawFlags |= CI.RelBlockFreq ; // CalleeInfo::RelBlockFreqBits bits
1173
+ RawFlags |= (CI.HasTailCall << CalleeInfo::RelBlockFreqBits); // 1 bit
1174
+
1175
+ return RawFlags;
1176
+ }
1177
+
1160
1178
static unsigned getEncodedVisibility (const GlobalValue &GV) {
1161
1179
switch (GV.getVisibility ()) {
1162
1180
case GlobalValue::DefaultVisibility: return 0 ;
@@ -4009,8 +4027,9 @@ static void writeFunctionHeapProfileRecords(
4009
4027
// Helper to emit a single function summary record.
4010
4028
void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord (
4011
4029
SmallVector<uint64_t , 64 > &NameVals, GlobalValueSummary *Summary,
4012
- unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev,
4013
- unsigned CallsiteAbbrev, unsigned AllocAbbrev, const Function &F) {
4030
+ unsigned ValueID, unsigned FSCallsRelBFAbbrev,
4031
+ unsigned FSCallsProfileAbbrev, unsigned CallsiteAbbrev,
4032
+ unsigned AllocAbbrev, const Function &F) {
4014
4033
NameVals.push_back (ValueID);
4015
4034
4016
4035
FunctionSummary *FS = cast<FunctionSummary>(Summary);
@@ -4037,21 +4056,21 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4037
4056
for (auto &RI : FS->refs ())
4038
4057
NameVals.push_back (VE.getValueID (RI.getValue ()));
4039
4058
4040
- bool HasProfileData =
4041
- F.hasProfileData () || ForceSummaryEdgesCold != FunctionSummary::FSHT_None;
4059
+ const bool UseRelBFRecord =
4060
+ WriteRelBFToSummary && !F.hasProfileData () &&
4061
+ ForceSummaryEdgesCold == FunctionSummary::FSHT_None;
4042
4062
for (auto &ECI : FS->calls ()) {
4043
4063
NameVals.push_back (getValueId (ECI.first ));
4044
- if (HasProfileData )
4045
- NameVals.push_back (static_cast < uint8_t > (ECI.second . Hotness ));
4046
- else if (WriteRelBFToSummary)
4047
- NameVals.push_back (ECI.second . RelBlockFreq );
4064
+ if (UseRelBFRecord )
4065
+ NameVals.push_back (getEncodedRelBFCallEdgeInfo (ECI.second ));
4066
+ else
4067
+ NameVals.push_back (getEncodedHotnessCallEdgeInfo ( ECI.second ) );
4048
4068
}
4049
4069
4050
- unsigned FSAbbrev = (HasProfileData ? FSCallsProfileAbbrev : FSCallsAbbrev);
4070
+ unsigned FSAbbrev =
4071
+ (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);
4051
4072
unsigned Code =
4052
- (HasProfileData ? bitc::FS_PERMODULE_PROFILE
4053
- : (WriteRelBFToSummary ? bitc::FS_PERMODULE_RELBF
4054
- : bitc::FS_PERMODULE));
4073
+ (UseRelBFRecord ? bitc::FS_PERMODULE_RELBF : bitc::FS_PERMODULE_PROFILE);
4055
4074
4056
4075
// Emit the finished record.
4057
4076
Stream.EmitRecord (Code, NameVals, FSAbbrev);
@@ -4160,28 +4179,25 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4160
4179
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // numrefs
4161
4180
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // rorefcnt
4162
4181
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // worefcnt
4163
- // numrefs x valueid, n x (valueid, hotness)
4182
+ // numrefs x valueid, n x (valueid, hotness+tailcall flags )
4164
4183
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Array));
4165
4184
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 ));
4166
4185
unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev (std::move (Abbv));
4167
4186
4168
- // Abbrev for FS_PERMODULE or FS_PERMODULE_RELBF.
4187
+ // Abbrev for FS_PERMODULE_RELBF.
4169
4188
Abbv = std::make_shared<BitCodeAbbrev>();
4170
- if (WriteRelBFToSummary)
4171
- Abbv->Add (BitCodeAbbrevOp (bitc::FS_PERMODULE_RELBF));
4172
- else
4173
- Abbv->Add (BitCodeAbbrevOp (bitc::FS_PERMODULE));
4189
+ Abbv->Add (BitCodeAbbrevOp (bitc::FS_PERMODULE_RELBF));
4174
4190
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // valueid
4175
4191
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 6 )); // flags
4176
4192
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // instcount
4177
4193
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // fflags
4178
4194
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // numrefs
4179
4195
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // rorefcnt
4180
4196
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // worefcnt
4181
- // numrefs x valueid, n x (valueid [ , rel_block_freq])
4197
+ // numrefs x valueid, n x (valueid, rel_block_freq+tailcall ])
4182
4198
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Array));
4183
4199
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 ));
4184
- unsigned FSCallsAbbrev = Stream.EmitAbbrev (std::move (Abbv));
4200
+ unsigned FSCallsRelBFAbbrev = Stream.EmitAbbrev (std::move (Abbv));
4185
4201
4186
4202
// Abbrev for FS_PERMODULE_GLOBALVAR_INIT_REFS.
4187
4203
Abbv = std::make_shared<BitCodeAbbrev>();
@@ -4253,9 +4269,9 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4253
4269
continue ;
4254
4270
}
4255
4271
auto *Summary = VI.getSummaryList ()[0 ].get ();
4256
- writePerModuleFunctionSummaryRecord (NameVals, Summary, VE. getValueID (&F),
4257
- FSCallsAbbrev, FSCallsProfileAbbrev ,
4258
- CallsiteAbbrev, AllocAbbrev, F);
4272
+ writePerModuleFunctionSummaryRecord (
4273
+ NameVals, Summary, VE. getValueID (&F), FSCallsRelBFAbbrev ,
4274
+ FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, F);
4259
4275
}
4260
4276
4261
4277
// Capture references from GlobalVariable initializers, which are outside
@@ -4326,25 +4342,8 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4326
4342
Stream.EmitRecord (bitc::FS_STACK_IDS, StackIds, StackIdAbbvId);
4327
4343
}
4328
4344
4329
- // Abbrev for FS_COMBINED.
4330
- auto Abbv = std::make_shared<BitCodeAbbrev>();
4331
- Abbv->Add (BitCodeAbbrevOp (bitc::FS_COMBINED));
4332
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // valueid
4333
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // modid
4334
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 6 )); // flags
4335
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // instcount
4336
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // fflags
4337
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // entrycount
4338
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // numrefs
4339
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // rorefcnt
4340
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // worefcnt
4341
- // numrefs x valueid, n x (valueid)
4342
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Array));
4343
- Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 ));
4344
- unsigned FSCallsAbbrev = Stream.EmitAbbrev (std::move (Abbv));
4345
-
4346
4345
// Abbrev for FS_COMBINED_PROFILE.
4347
- Abbv = std::make_shared<BitCodeAbbrev>();
4346
+ auto Abbv = std::make_shared<BitCodeAbbrev>();
4348
4347
Abbv->Add (BitCodeAbbrevOp (bitc::FS_COMBINED_PROFILE));
4349
4348
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // valueid
4350
4349
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 )); // modid
@@ -4355,7 +4354,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4355
4354
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // numrefs
4356
4355
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // rorefcnt
4357
4356
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 4 )); // worefcnt
4358
- // numrefs x valueid, n x (valueid, hotness)
4357
+ // numrefs x valueid, n x (valueid, hotness+tailcall flags )
4359
4358
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Array));
4360
4359
Abbv->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::VBR, 8 ));
4361
4360
unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev (std::move (Abbv));
@@ -4535,31 +4534,19 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4535
4534
NameVals[7 ] = RORefCnt;
4536
4535
NameVals[8 ] = WORefCnt;
4537
4536
4538
- bool HasProfileData = false ;
4539
- for (auto &EI : FS->calls ()) {
4540
- HasProfileData |=
4541
- EI.second .getHotness () != CalleeInfo::HotnessType::Unknown;
4542
- if (HasProfileData)
4543
- break ;
4544
- }
4545
-
4546
4537
for (auto &EI : FS->calls ()) {
4547
4538
// If this GUID doesn't have a value id, it doesn't have a function
4548
4539
// summary and we don't need to record any calls to it.
4549
4540
std::optional<unsigned > CallValueId = GetValueId (EI.first );
4550
4541
if (!CallValueId)
4551
4542
continue ;
4552
4543
NameVals.push_back (*CallValueId);
4553
- if (HasProfileData)
4554
- NameVals.push_back (static_cast <uint8_t >(EI.second .Hotness ));
4544
+ NameVals.push_back (getEncodedHotnessCallEdgeInfo (EI.second ));
4555
4545
}
4556
4546
4557
- unsigned FSAbbrev = (HasProfileData ? FSCallsProfileAbbrev : FSCallsAbbrev);
4558
- unsigned Code =
4559
- (HasProfileData ? bitc::FS_COMBINED_PROFILE : bitc::FS_COMBINED);
4560
-
4561
4547
// Emit the finished record.
4562
- Stream.EmitRecord (Code, NameVals, FSAbbrev);
4548
+ Stream.EmitRecord (bitc::FS_COMBINED_PROFILE, NameVals,
4549
+ FSCallsProfileAbbrev);
4563
4550
NameVals.clear ();
4564
4551
MaybeEmitOriginalName (*S);
4565
4552
});
0 commit comments