case kBlockEnd:
break;
case kFallThrough:
- result = EmitFallThrough();
+ result = EmitJump();
break;
case kJump:
CHECK(!block_returns_);
void InstructionSequenceTest::WireBlocks() {
CHECK(!current_block());
CHECK(instruction_blocks_.size() == completions_.size());
+ CHECK(loop_blocks_.empty());
+ // Wire in end block to look like a scheduler produced cfg.
+ auto end_block = NewBlock();
+ current_block_ = nullptr;
+ sequence()->EndBlock(end_block->rpo_number());
size_t offset = 0;
for (const auto& completion : completions_) {
switch (completion.type_) {
- case kBlockEnd:
+ case kBlockEnd: {
+ auto block = instruction_blocks_[offset];
+ block->successors().push_back(end_block->rpo_number());
+ end_block->predecessors().push_back(block->rpo_number());
break;
+ }
case kFallThrough: // Fallthrough.
case kJump:
WireBlock(offset, completion.offset_0_);
StartBlock();
EndBlock(Last());
+ auto last = LastInstruction();
+
Optimize();
- auto move = LastInstruction()->parallel_moves()[0];
+ auto move = last->parallel_moves()[0];
CHECK_EQ(1, NonRedundantSize(move));
CHECK(Contains(move, Reg(0), Reg(1)));
}
StartBlock();
EndBlock(Last());
+ auto last = LastInstruction();
+
Optimize();
CHECK(gap_0->AreMovesRedundant());
CHECK(gap_1->AreMovesRedundant());
- auto move = LastInstruction()->parallel_moves()[0];
+ auto move = last->parallel_moves()[0];
CHECK_EQ(2, NonRedundantSize(move));
CHECK(Contains(move, Reg(0), Reg(1)));
CHECK(Contains(move, Reg(1), Reg(0)));