Adjust pointer maps for branches when connecting live ranges.

Review URL: http://codereview.chromium.org/6541024

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6858 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
vegorov@chromium.org 2011-02-18 16:29:41 +00:00
parent 5ec91a4279
commit c411adca55

View File

@ -1098,6 +1098,21 @@ void LAllocator::ResolveControlFlow(LiveRange* range,
} else {
ASSERT(pred->end()->SecondSuccessor() == NULL);
gap = GetLastGap(pred);
// We are going to insert a move before the branch instruction.
// Some branch instructions (e.g. loops' back edges)
// can potentially cause a GC so they have a pointer map.
// By insterting a move we essentially create a copy of a
// value which is invisible to PopulatePointerMaps(), because we store
// it into a location different from the operand of a live range
// covering a branch instruction.
// Thus we need to manually record a pointer.
if (HasTaggedValue(range->id())) {
LInstruction* branch = InstructionAt(pred->last_instruction_index());
if (branch->HasPointerMap()) {
branch->pointer_map()->RecordPointer(cur_op);
}
}
}
gap->GetOrCreateParallelMove(LGap::START)->AddMove(pred_op, cur_op);
}