[vm] Address various quirks observed in Fuchsia profiling samples.
- Don't waste time scrubbing or qualifying function metadata names.
- Don't waste time scrubbing or lib qualifying function names for timeline events.
- Give intrinsic functions a grace usage counter.
- Fix wrong flag guarding stack overflow name-based slow paths.
Change-Id: Ib78e7e4f8de51208266190fff2d1f7eb8d80c329
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97174
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 65791e4..df7618f 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -303,9 +303,8 @@
return Object::null();
}
// Prevent premature code collection due to major GC during startup.
- const intptr_t kFakeInitialUsage = 32;
- if (function.usage_counter() < kFakeInitialUsage) {
- function.set_usage_counter(kFakeInitialUsage);
+ if (function.usage_counter() < Function::kGraceUsageCounter) {
+ function.set_usage_counter(Function::kGraceUsageCounter);
}
return Compiler::CompileFunction(thread_, function);
}
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 52dd77c..722ab12 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -419,6 +419,12 @@
}
#endif // !defined(PRODUCT)
+ if (function.is_intrinsic() &&
+ (function.usage_counter() < Function::kGraceUsageCounter)) {
+ // Intrinsic functions may execute without incrementing their usage counter.
+ // Give them a non-zero initial usage to prevent premature code collection.
+ function.set_usage_counter(Function::kGraceUsageCounter);
+ }
if (!function.IsOptimizable()) {
// A function with huge unoptimized code can become non-optimizable
// after generating unoptimized code.
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3cae1d4..8d2c158 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9749,7 +9749,7 @@
GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
- pieces.Add(String::Handle(field.name()));
+ pieces.Add(String::Handle(zone, field.name()));
return Symbols::FromConcatAll(thread, pieces);
}
@@ -9762,7 +9762,7 @@
GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
- pieces.Add(String::Handle(func.QualifiedScrubbedName()));
+ pieces.Add(String::Handle(zone, func.name()));
return Symbols::FromConcatAll(thread, pieces);
}
@@ -9776,7 +9776,7 @@
GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
- pieces.Add(String::Handle(param.name()));
+ pieces.Add(String::Handle(zone, param.name()));
return Symbols::FromConcatAll(thread, pieces);
}
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 798331a..df88871 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1954,6 +1954,9 @@
class Function : public Object {
public:
+ // A value to prevent premature code collection. lg(32) = 5 major GCs.
+ static constexpr intptr_t kGraceUsageCounter = 32;
+
RawString* name() const { return raw_ptr()->name_; }
RawString* UserVisibleName() const; // Same as scrubbed name.
RawString* QualifiedScrubbedName() const {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 8e90333..e08bd90 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1838,7 +1838,7 @@
}
}
if ((FLAG_deoptimize_filter != NULL) || (FLAG_stacktrace_filter != NULL) ||
- FLAG_reload_every_optimized) {
+ FLAG_reload_every) {
DartFrameIterator iterator(thread,
StackFrameIterator::kNoCrossThreadIteration);
StackFrame* frame = iterator.NextFrame();
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 1d1462a..37e5af9 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -457,8 +457,7 @@
TimelineDurationScope tds(thread, Timeline::GetCompilerStream(), name); \
if (tds.enabled()) { \
tds.SetNumArguments(1); \
- tds.CopyArgument(0, "function", \
- function.ToLibNamePrefixedQualifiedCString()); \
+ tds.CopyArgument(0, "function", function.ToQualifiedCString()); \
}
#define TIMELINE_FUNCTION_GC_DURATION(thread, name) \