Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Unified Diff: src/compiler/escape-analysis.cc

Issue 1674603002: Add measurement code to escape analysis Base URL: https://chromium.googlesource.com/v8/v8.git@delay_status
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/escape-analysis.h ('k') | src/compiler/escape-analysis-reducer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/escape-analysis.cc
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc
index b57ae6d9b87424d028758e353aa74f39cbfe0836..2cddedae87f11fabe83ee75d1e259259bb1ea97d 100644
--- a/src/compiler/escape-analysis.cc
+++ b/src/compiler/escape-analysis.cc
@@ -40,6 +40,8 @@ const Alias EscapeStatusAnalysis::kNotReachable =
const Alias EscapeStatusAnalysis::kUntrackable =
std::numeric_limits<Alias>::max() - 1;
+EscapeAnalysisStats EscapeAnalysis::stats;
+
class VirtualObject : public ZoneObject {
public:
enum Status {
@@ -56,7 +58,9 @@ class VirtualObject : public ZoneObject {
fields_(zone),
phi_(zone),
object_state_(nullptr),
- owner_(owner) {}
+ owner_(owner) {
+ EscapeAnalysis::stats.virtualObjectCount_++;
+ }
VirtualObject(VirtualState* owner, const VirtualObject& other)
: id_(other.id_),
@@ -64,7 +68,10 @@ class VirtualObject : public ZoneObject {
fields_(other.fields_),
phi_(other.phi_),
object_state_(other.object_state_),
- owner_(owner) {}
+ owner_(owner) {
+ EscapeAnalysis::stats.virtualObjectCount_++;
+ EscapeAnalysis::stats.fieldCount_ += fields_.size();
+ }
VirtualObject(NodeId id, VirtualState* owner, Zone* zone, size_t field_number,
bool initialized)
@@ -76,6 +83,8 @@ class VirtualObject : public ZoneObject {
owner_(owner) {
fields_.resize(field_number);
phi_.resize(field_number, false);
+ EscapeAnalysis::stats.virtualObjectCount_++;
+ EscapeAnalysis::stats.fieldCount_ += fields_.size();
}
Node* GetField(size_t offset) { return fields_[offset]; }
@@ -95,6 +104,7 @@ class VirtualObject : public ZoneObject {
size_t field_count() { return fields_.size(); }
bool ResizeFields(size_t field_count) {
if (field_count > fields_.size()) {
+ EscapeAnalysis::stats.fieldCount_ += field_count - fields_.size();
fields_.resize(field_count);
phi_.resize(field_count);
return true;
@@ -168,7 +178,9 @@ bool VirtualObject::UpdateFrom(const VirtualObject& other) {
class VirtualState : public ZoneObject {
public:
VirtualState(Node* owner, Zone* zone, size_t size)
- : info_(size, nullptr, zone), owner_(owner) {}
+ : info_(size, nullptr, zone), owner_(owner) {
+ EscapeAnalysis::stats.virtualStateCount_++;
+ }
VirtualState(Node* owner, const VirtualState& state)
: info_(state.info_.size(), nullptr, state.info_.get_allocator().zone()),
@@ -178,6 +190,7 @@ class VirtualState : public ZoneObject {
info_[i] = state.info_[i];
}
}
+ EscapeAnalysis::stats.virtualStateCount_++;
}
VirtualObject* VirtualObjectFromAlias(size_t alias);
@@ -763,7 +776,11 @@ EscapeAnalysis::EscapeAnalysis(Graph* graph, CommonOperatorBuilder* common,
common_(common),
virtual_states_(zone),
replacements_(zone),
- cache_(nullptr) {}
+ cache_(nullptr),
+ phi_map_(PhiObjectMap::key_compare(),
+ PhiObjectMap::allocator_type(zone)) {
+ stats = EscapeAnalysisStats();
+}
EscapeAnalysis::~EscapeAnalysis() {}
@@ -773,7 +790,7 @@ void EscapeAnalysis::Run() {
PrintF("--trace-turbo-escape only supported in DEBUG builds\n.");
}
#endif
- replacements_.resize(graph()->NodeCount());
+ EscapeAnalysis::stats.initialNodeCount_ = graph()->NodeCount();
status_analysis_.AssignAliases();
if (status_analysis_.AliasCount() > 0) {
cache_ = new (zone()) MergeCache(zone());
@@ -781,6 +798,8 @@ void EscapeAnalysis::Run() {
status_analysis_.ResizeStatusVector();
RunObjectAnalysis();
status_analysis_.RunStatusAnalysis();
+ } else {
+ TRACE("No allocations discovered\n");
}
}
@@ -789,6 +808,7 @@ void EscapeStatusAnalysis::AssignAliases() {
size_t min_size = 32;
size_t stack_size =
std::min(std::max(graph()->NodeCount() / 5, min_size), max_size);
+ size_t max_stack = 0;
stack_.reserve(stack_size);
ResizeStatusVector();
stack_.push_back(graph()->end());
@@ -798,8 +818,12 @@ void EscapeStatusAnalysis::AssignAliases() {
status_stack_.reserve(8);
TRACE("Discovering trackable nodes");
while (!stack_.empty()) {
+ max_stack = std::max(max_stack, stack_.size());
Node* node = stack_.back();
stack_.pop_back();
+ if (node->op()->EffectInputCount() > 0) {
+ EscapeAnalysis::stats.effectNodeCount_++;
+ }
switch (node->opcode()) {
case IrOpcode::kAllocate:
if (aliases_[node->id()] >= kUntrackable) {
@@ -841,6 +865,9 @@ void EscapeStatusAnalysis::AssignAliases() {
}
}
TRACE("\n");
+ EscapeAnalysis::stats.discoverStackMaxSize_ = max_stack;
+ EscapeAnalysis::stats.discoverStackCapacity_ = stack_.capacity();
+ EscapeAnalysis::stats.aliasCount_ = AliasCount();
}
bool EscapeStatusAnalysis::IsNotReachable(Node* node) {
@@ -1265,6 +1292,7 @@ int EscapeAnalysis::OffsetFromAccess(Node* node) {
void EscapeAnalysis::ProcessLoadFromPhi(int offset, Node* from, Node* load,
VirtualState* state) {
+ EscapeAnalysis::stats.loadPhiCount_++;
TRACE("Load #%d from phi #%d", load->id(), from->id());
cache_->fields().clear();
@@ -1447,6 +1475,7 @@ Node* EscapeAnalysis::GetOrCreateObjectState(Node* effect, Node* node) {
if (Node* object_state = vobj->GetObjectState()) {
return object_state;
} else {
+ stats.objectStatesCreated_++;
cache_->fields().clear();
for (size_t i = 0; i < vobj->field_count(); ++i) {
if (Node* field = vobj->GetField(i)) {
@@ -1534,6 +1563,25 @@ bool EscapeAnalysis::ExistsVirtualAllocate() {
return false;
}
+void EscapeAnalysisStats::Print() {
+ PrintF("{\n");
+ PrintF(" \"InitialNodeCount\" : %zu,\n", initialNodeCount_);
+ PrintF(" \"EffectNodeCount\" : %zu,\n", effectNodeCount_);
+ PrintF(" \"DiscoverStackMaxSize\" : %zu,\n", discoverStackMaxSize_);
+ PrintF(" \"DiscoverStackCapacity\" : %zu,\n", discoverStackCapacity_);
+ PrintF(" \"AliasCount\" : %zu,\n", aliasCount_);
+ PrintF(" \"VirtualObjects\" : %zu,\n", virtualObjectCount_);
+ PrintF(" \"VirtualStates\" : %zu,\n", virtualStateCount_);
+ PrintF(" \"FieldCount\" : %zu,\n", fieldCount_);
+ PrintF(" \"MergePhiCount\" : %zu,\n", mergePhiCount_);
+ PrintF(" \"LoadPhiCount\" : %zu,\n", loadPhiCount_);
+ PrintF(" \"ObjectStatesCreated\" : %zu,\n", objectStatesCreated_);
+ PrintF(" \"VirtualObjectSize\" : %zu,\n", sizeof(VirtualObject));
+ PrintF(" \"VirtualStateSize\" : %zu\n",
+ sizeof(VirtualState) + aliasCount_ * kPointerSize);
+ PrintF("},\n");
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
« no previous file with comments | « src/compiler/escape-analysis.h ('k') | src/compiler/escape-analysis-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698