18 : density_(density),
size_(size), sorter_(sorter) {
33 for (
Builtin builtin : other->targets_) {
39 (
size_ + other->size_));
40 size_ += other->size_;
43 other->targets_.clear();
51 for (uint32_t
i = 0; i < static_cast<uint32_t>(
builtin_size_.size());
i++) {
69 return x.density_ > y.density_;
79 Builtin caller = caller_it->first;
81 if (callees_prob.count(callee) > 0) {
82 int32_t incoming_prob = callees_prob.at(callee).incoming_;
83 if (incoming_prob == -1) {
91 bestProb = incoming_prob;
103 if (predCls == succCls)
continue;
113 uint32_t new_density =
static_cast<uint32_t
>(
135 pred_cluster->
Merge(succ_cluster);
143 return x->density_ > y->density_;
148 [](
const Cluster*
x) { return x->targets_.empty(); }),
153 std::unordered_set<Builtin>& processed_builtins) {
154 if (processed_builtins.count(builtin) == 0) {
155 order.push_back(builtin);
156 processed_builtins.emplace(builtin);
163 std::istringstream& line_stream,
164 std::unordered_map<std::string, Builtin>& name2id) {
170 std::string caller_name;
171 CHECK(std::getline(line_stream, caller_name,
','));
172 Builtin caller_id = name2id[caller_name];
178 CHECK(std::getline(line_stream, token,
','));
179 int32_t block_id =
static_cast<int32_t
>(strtoul(token.c_str(), &
end, 0));
180 CHECK(errno == 0 &&
end != token.c_str());
182 CHECK(std::getline(line_stream, token,
','));
183 int32_t normalized_count =
184 static_cast<int32_t
>(strtoul(token.c_str(), &
end, 0));
185 CHECK(errno == 0 &&
end != token.c_str());
186 CHECK(line_stream.eof());
188 const BuiltinCallees* block_callees = profiler->GetBuiltinCallees(caller_id);
190 int32_t outgoing_prob = 0;
191 int32_t incoming_prob = 0;
192 int caller_density = 0;
193 int callee_density = 0;
201 if (block_callees->count(block_id)) {
204 for (
const auto& callee_id : block_callees->at(block_id)) {
205 if (caller_density != 0) {
206 outgoing_prob = normalized_count * 100 / caller_density;
217 outgoing_prob = normalized_count ? 100 : 0;
222 if (callee_density != 0) {
223 incoming_prob = normalized_count * 100 / callee_density;
226 incoming_prob = normalized_count ? 100 : 0;
243 call_probs.emplace(callee_id, probs);
247 CHECK(line_stream.eof());
251 std::istringstream& line_stream,
252 std::unordered_map<std::string, Builtin>& name2id) {
258 std::string builtin_name;
259 CHECK(std::getline(line_stream, builtin_name,
','));
260 std::getline(line_stream, token,
',');
261 CHECK(line_stream.eof());
264 int density =
static_cast<int>(strtol(token.c_str(), &
end, 0));
265 CHECK(errno == 0 &&
end != token.c_str());
267 Builtin builtin_id = name2id[builtin_name];
272 const std::vector<uint32_t>& size) {
273 std::ifstream
file(profiling_file);
276 std::unordered_map<std::string, Builtin> name2id;
279 name2id.emplace(name,
i);
283 for (std::string line; std::getline(file, line);) {
285 std::istringstream line_stream(line);
289 if (!std::getline(line_stream, token,
','))
continue;
299 const char* profiling_file,
const std::vector<uint32_t>& builtin_size) {
311 std::unordered_set<Builtin> processed_builtins;
312 std::vector<Builtin> builtin_order;
317 for (
size_t j = 0; j < cls->
targets_.size(); j++) {
329 return builtin_order;
static BuiltinsCallGraph * Get()
std::vector< BuiltinDensitySlot > builtin_density_order_
BuiltinClusterMap builtin_cluster_map_
const uint32_t kMaxClusterSize
void ProcessBlockCountLineInfo(std::istringstream &line_stream, std::unordered_map< std::string, Builtin > &name2id)
std::vector< Builtin > SortBuiltins(const char *profiling_file, const std::vector< uint32_t > &builtin_size)
std::vector< Cluster * > clusters_
void ProcessBuiltinDensityLineInfo(std::istringstream &line_stream, std::unordered_map< std::string, Builtin > &name2id)
const std::string kBuiltinCallBlockDensityMarker
void InitializeCallGraph(const char *profiling_file, const std::vector< uint32_t > &size)
BuiltinSize builtin_size_
const int32_t kMinEdgeProbabilityThreshold
Builtin FindBestPredecessorOf(Builtin callee)
const std::string kBuiltinDensityMarker
BuiltinDensityMap builtin_density_map_
void InitializeClusters()
const uint32_t kMaxDensityDecreaseThreshold
void MergeBestPredecessors()
static V8_EXPORT_PRIVATE Kind KindOf(Builtin builtin)
static constexpr Builtin kFirst
static constexpr Builtin FromInt(int id)
static constexpr Builtin kLast
static V8_EXPORT_PRIVATE const char * name(Builtin builtin)
uint64_t time_approximation()
void Merge(Cluster *other)
std::vector< Builtin > targets_
Cluster(uint32_t density, uint32_t size, Builtin target, BuiltinsSorter *sorter)
bool AddBuiltinIfNotProcessed(Builtin builtin, std::vector< Builtin > &order, std::unordered_set< Builtin > &processed_builtins)
std::unordered_map< int32_t, BlockCallees > BuiltinCallees
std::unordered_map< Builtin, CallProbability > CallProbabilities
#define CHECK_WITH_MSG(condition, message)
#define CHECK_EQ(lhs, rhs)