| Index: vm/intermediate_language.cc
|
| ===================================================================
|
| --- vm/intermediate_language.cc (revision 9281)
|
| +++ vm/intermediate_language.cc (working copy)
|
| @@ -66,7 +66,7 @@
|
| #define DEFINE_ACCEPT(ShortName) \
|
| Instruction* ShortName##Instr::Accept(FlowGraphVisitor* visitor) { \
|
| visitor->Visit##ShortName(this); \
|
| - return StraightLineSuccessor(); \
|
| + return successor(); \
|
| }
|
|
|
| FOR_EACH_INSTRUCTION(DEFINE_ACCEPT)
|
| @@ -459,15 +459,15 @@
|
|
|
| // 5. Iterate straight-line successors until a branch instruction or
|
| // another basic block entry instruction, and visit that instruction.
|
| - ASSERT(StraightLineSuccessor() != NULL);
|
| - Instruction* next = StraightLineSuccessor();
|
| + ASSERT(successor() != NULL);
|
| + Instruction* next = successor();
|
| if (next->IsBlockEntry()) {
|
| set_last_instruction(this);
|
| } else {
|
| while ((next != NULL) && !next->IsBlockEntry() && !next->IsBranch()) {
|
| if (vars != NULL) next->RecordAssignedVars(vars);
|
| set_last_instruction(next);
|
| - next = next->StraightLineSuccessor();
|
| + next = next->successor();
|
| }
|
| }
|
| if (next != NULL) {
|
| @@ -521,17 +521,54 @@
|
| intptr_t Instruction::SuccessorCount() const {
|
| ASSERT(!IsBranch());
|
| ASSERT(!IsGraphEntry());
|
| - ASSERT(StraightLineSuccessor() == NULL ||
|
| - StraightLineSuccessor()->IsBlockEntry());
|
| - return StraightLineSuccessor() != NULL ? 1 : 0;
|
| + ASSERT(successor() == NULL ||
|
| + successor()->IsBlockEntry());
|
| + return successor() != NULL ? 1 : 0;
|
| }
|
|
|
|
|
| BlockEntryInstr* Instruction::SuccessorAt(intptr_t index) const {
|
| - return StraightLineSuccessor()->AsBlockEntry();
|
| + return successor()->AsBlockEntry();
|
| }
|
|
|
|
|
| +void Instruction::RemoveFromGraph() {
|
| + ASSERT(!IsBlockEntry());
|
| + ASSERT(previous() != NULL);
|
| + Instruction* next = successor();
|
| + previous()->set_successor(next);
|
| + if (next != NULL) {
|
| + if (!next->IsBlockEntry()) {
|
| + next->set_previous(previous());
|
| + } else {
|
| + // Removing the last instruction of a block.
|
| + ASSERT(!IsBranch());
|
| + ASSERT(!IsThrow());
|
| + ASSERT(!IsReturn());
|
| + ASSERT(!IsReThrow());
|
| + // Update last_instruction of the current basic block.
|
| + Instruction* current = this;
|
| + while (!current->IsBlockEntry()) {
|
| + current = current->previous();
|
| + }
|
| + ASSERT(current->AsBlockEntry()->last_instruction() == this);
|
| + current->AsBlockEntry()->set_last_instruction(previous());
|
| + }
|
| + }
|
| + // Reset successor and previous instruction to indicate
|
| + // that the instruction is removed from the graph.
|
| + set_successor(NULL);
|
| + set_previous(NULL);
|
| +}
|
| +
|
| +
|
| +bool Instruction::is_linked() const {
|
| + ASSERT(!IsBlockEntry() || ((successor() != NULL) && (previous() == NULL)));
|
| + ASSERT(IsBlockEntry() || previous() != NULL);
|
| + return (previous() != NULL) || (successor() != NULL);
|
| +}
|
| +
|
| +
|
| intptr_t GraphEntryInstr::SuccessorCount() const {
|
| return 1 + catch_entries_.length();
|
| }
|
|
|