Commit 66bfe593 authored by yurys@chromium.org's avatar yurys@chromium.org

Disable allocation folding when allocations tracking is on

BUG=chromium:277984
R=hpayer@chromium.org, loislo@chromium.org, mvstanton@chromium.org, yurys@chromium.org

Review URL: https://codereview.chromium.org/32583002

Patch from Alexandra Mikhaylova <amikhaylova@google.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17337 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 701749c4
......@@ -3308,7 +3308,10 @@ void HAllocate::HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) {
ASSERT(side_effect == kChangesNewSpacePromotion);
Zone* zone = block()->zone();
if (!FLAG_use_allocation_folding) return;
if (!FLAG_use_allocation_folding ||
isolate()->heap_profiler()->is_tracking_allocations()) {
return;
}
// Try to fold allocations together with their dominating allocations.
if (!dominator->IsAllocate()) {
......
......@@ -5300,7 +5300,7 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
PretenureFlag pretenure_flag,
InstanceType instance_type) {
return new(zone) HAllocate(context, size, type, pretenure_flag,
instance_type);
instance_type, zone);
}
// Maximum instance size for which allocations will be inlined.
......@@ -5373,7 +5373,8 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
HValue* size,
HType type,
PretenureFlag pretenure_flag,
InstanceType instance_type)
InstanceType instance_type,
Zone* zone)
: HTemplateInstruction<2>(type),
dominating_allocate_(NULL),
filler_free_space_size_(NULL),
......@@ -5396,7 +5397,8 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
// other, i.e., have a pointer to each other. A GC in between these
// allocations may leave such objects behind in a not completely initialized
// state.
if (!FLAG_use_gvn || !FLAG_use_allocation_folding) {
if (!FLAG_use_gvn || !FLAG_use_allocation_folding ||
zone->isolate()->heap_profiler()->is_tracking_allocations()) {
flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER);
}
clear_next_map_word_ = pretenure_flag == NOT_TENURED &&
......
......@@ -2072,3 +2072,23 @@ TEST(HeapObjectsTracker) {
" a.shift();\n"
"findUntrackedObjects();\n");
}
// If we don't disable allocation folding when allocations tracking is on, we
// may have untracked allocations.
TEST(DisableAllocationFolding) {
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
HeapObjectsTracker tracker;
CompileRun(
"function literal() {"
" return [1];"
"}"
"function modify_literal(literal, v) {"
" literal[0] = v;"
" return literal;"
"}"
"obj = modify_literal(literal(), 1);"
"obj = modify_literal(literal(), 1.5);"
"obj = modify_literal(literal(), 1);");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment