| Index: src/compiler/move-optimizer.cc
|
| diff --git a/src/compiler/move-optimizer.cc b/src/compiler/move-optimizer.cc
|
| index 8562410443f0b85f391886a320a65c90b4a1a726..e0932f41515275b474f93a264535cc9af4487269 100644
|
| --- a/src/compiler/move-optimizer.cc
|
| +++ b/src/compiler/move-optimizer.cc
|
| @@ -65,12 +65,12 @@ bool GapsCanMoveOver(Instruction* instr, Zone* zone) {
|
| }
|
|
|
|
|
| -int FindFirstNonEmptySlot(Instruction* instr) {
|
| +int FindFirstNonEmptySlot(const Instruction* instr) {
|
| int i = Instruction::FIRST_GAP_POSITION;
|
| for (; i <= Instruction::LAST_GAP_POSITION; i++) {
|
| - auto moves = instr->parallel_moves()[i];
|
| + ParallelMove* moves = instr->parallel_moves()[i];
|
| if (moves == nullptr) continue;
|
| - for (auto move : *moves) {
|
| + for (MoveOperands* move : *moves) {
|
| if (!move->IsRedundant()) return i;
|
| move->Eliminate();
|
| }
|
| @@ -98,7 +98,7 @@ void MoveOptimizer::Run() {
|
| if (block->PredecessorCount() <= 1) continue;
|
| if (!block->IsDeferred()) {
|
| bool has_only_deferred = true;
|
| - for (RpoNumber pred_id : block->predecessors()) {
|
| + for (RpoNumber& pred_id : block->predecessors()) {
|
| if (!code()->InstructionBlockAt(pred_id)->IsDeferred()) {
|
| has_only_deferred = false;
|
| break;
|
| @@ -112,7 +112,7 @@ void MoveOptimizer::Run() {
|
| }
|
| OptimizeMerge(block);
|
| }
|
| - for (auto gap : to_finalize_) {
|
| + for (Instruction* gap : to_finalize_) {
|
| FinalizeMoves(gap);
|
| }
|
| }
|
| @@ -124,19 +124,19 @@ void MoveOptimizer::CompressMoves(MoveOpVector* eliminated, ParallelMove* left,
|
| if (!left->empty()) {
|
| // Modify the right moves in place and collect moves that will be killed by
|
| // merging the two gaps.
|
| - for (auto move : *right) {
|
| + for (MoveOperands* move : *right) {
|
| if (move->IsRedundant()) continue;
|
| - auto to_eliminate = left->PrepareInsertAfter(move);
|
| + MoveOperands* to_eliminate = left->PrepareInsertAfter(move);
|
| if (to_eliminate != nullptr) eliminated->push_back(to_eliminate);
|
| }
|
| // Eliminate dead moves.
|
| - for (auto to_eliminate : *eliminated) {
|
| + for (MoveOperands* to_eliminate : *eliminated) {
|
| to_eliminate->Eliminate();
|
| }
|
| eliminated->clear();
|
| }
|
| // Add all possibly modified moves from right side.
|
| - for (auto move : *right) {
|
| + for (MoveOperands* move : *right) {
|
| if (move->IsRedundant()) continue;
|
| left->push_back(move);
|
| }
|
| @@ -148,25 +148,25 @@ void MoveOptimizer::CompressMoves(MoveOpVector* eliminated, ParallelMove* left,
|
| // Smash all consecutive moves into the left most move slot and accumulate them
|
| // as much as possible across instructions.
|
| void MoveOptimizer::CompressBlock(InstructionBlock* block) {
|
| - auto temp_vector = temp_vector_0();
|
| + MoveOpVector& temp_vector = temp_vector_0();
|
| DCHECK(temp_vector.empty());
|
| Instruction* prev_instr = nullptr;
|
| for (int index = block->code_start(); index < block->code_end(); ++index) {
|
| - auto instr = code()->instructions()[index];
|
| + Instruction* instr = code()->instructions()[index];
|
| int i = FindFirstNonEmptySlot(instr);
|
| if (i <= Instruction::LAST_GAP_POSITION) {
|
| // Move the first non-empty gap to position 0.
|
| std::swap(instr->parallel_moves()[0], instr->parallel_moves()[i]);
|
| - auto left = instr->parallel_moves()[0];
|
| + ParallelMove* left = instr->parallel_moves()[0];
|
| // Compress everything into position 0.
|
| for (++i; i <= Instruction::LAST_GAP_POSITION; ++i) {
|
| - auto move = instr->parallel_moves()[i];
|
| + ParallelMove* move = instr->parallel_moves()[i];
|
| if (move == nullptr) continue;
|
| CompressMoves(&temp_vector, left, move);
|
| }
|
| if (prev_instr != nullptr) {
|
| // Smash left into prev_instr, killing left.
|
| - auto pred_moves = prev_instr->parallel_moves()[0];
|
| + ParallelMove* pred_moves = prev_instr->parallel_moves()[0];
|
| CompressMoves(&temp_vector, pred_moves, left);
|
| }
|
| }
|
| @@ -187,7 +187,8 @@ void MoveOptimizer::CompressBlock(InstructionBlock* block) {
|
| }
|
|
|
|
|
| -Instruction* MoveOptimizer::LastInstruction(InstructionBlock* block) {
|
| +const Instruction* MoveOptimizer::LastInstruction(
|
| + const InstructionBlock* block) const {
|
| return code()->instructions()[block->last_instruction_index()];
|
| }
|
|
|
| @@ -196,14 +197,15 @@ void MoveOptimizer::OptimizeMerge(InstructionBlock* block) {
|
| DCHECK(block->PredecessorCount() > 1);
|
| // Ensure that the last instruction in all incoming blocks don't contain
|
| // things that would prevent moving gap moves across them.
|
| - for (auto pred_index : block->predecessors()) {
|
| - auto pred = code()->InstructionBlockAt(pred_index);
|
| - auto last_instr = code()->instructions()[pred->last_instruction_index()];
|
| + for (RpoNumber& pred_index : block->predecessors()) {
|
| + const InstructionBlock* pred = code()->InstructionBlockAt(pred_index);
|
| + const Instruction* last_instr =
|
| + code()->instructions()[pred->last_instruction_index()];
|
| if (last_instr->IsCall()) return;
|
| if (last_instr->TempCount() != 0) return;
|
| if (last_instr->OutputCount() != 0) return;
|
| for (size_t i = 0; i < last_instr->InputCount(); ++i) {
|
| - auto op = last_instr->InputAt(i);
|
| + const InstructionOperand* op = last_instr->InputAt(i);
|
| if (!op->IsConstant() && !op->IsImmediate()) return;
|
| }
|
| }
|
| @@ -211,17 +213,17 @@ void MoveOptimizer::OptimizeMerge(InstructionBlock* block) {
|
| MoveMap move_map(local_zone());
|
| size_t correct_counts = 0;
|
| // Accumulate set of shared moves.
|
| - for (auto pred_index : block->predecessors()) {
|
| - auto pred = code()->InstructionBlockAt(pred_index);
|
| - auto instr = LastInstruction(pred);
|
| + for (RpoNumber& pred_index : block->predecessors()) {
|
| + const InstructionBlock* pred = code()->InstructionBlockAt(pred_index);
|
| + const Instruction* instr = LastInstruction(pred);
|
| if (instr->parallel_moves()[0] == nullptr ||
|
| instr->parallel_moves()[0]->empty()) {
|
| return;
|
| }
|
| - for (auto move : *instr->parallel_moves()[0]) {
|
| + for (const MoveOperands* move : *instr->parallel_moves()[0]) {
|
| if (move->IsRedundant()) continue;
|
| - auto src = move->source();
|
| - auto dst = move->destination();
|
| + InstructionOperand src = move->source();
|
| + InstructionOperand dst = move->destination();
|
| MoveKey key = {src, dst};
|
| auto res = move_map.insert(std::make_pair(key, 1));
|
| if (!res.second) {
|
| @@ -251,13 +253,13 @@ void MoveOptimizer::OptimizeMerge(InstructionBlock* block) {
|
| gap_initialized = false;
|
| std::swap(instr->parallel_moves()[0], instr->parallel_moves()[1]);
|
| }
|
| - auto moves = instr->GetOrCreateParallelMove(
|
| + ParallelMove* moves = instr->GetOrCreateParallelMove(
|
| static_cast<Instruction::GapPosition>(0), code_zone());
|
| // Delete relevant entries in predecessors and move everything to block.
|
| bool first_iteration = true;
|
| - for (auto pred_index : block->predecessors()) {
|
| - auto pred = code()->InstructionBlockAt(pred_index);
|
| - for (auto move : *LastInstruction(pred)->parallel_moves()[0]) {
|
| + for (RpoNumber& pred_index : block->predecessors()) {
|
| + const InstructionBlock* pred = code()->InstructionBlockAt(pred_index);
|
| + for (MoveOperands* move : *LastInstruction(pred)->parallel_moves()[0]) {
|
| if (move->IsRedundant()) continue;
|
| MoveKey key = {move->source(), move->destination()};
|
| auto it = move_map.find(key);
|
| @@ -300,10 +302,10 @@ bool LoadCompare(const MoveOperands* a, const MoveOperands* b) {
|
| // Split multiple loads of the same constant or stack slot off into the second
|
| // slot and keep remaining moves in the first slot.
|
| void MoveOptimizer::FinalizeMoves(Instruction* instr) {
|
| - auto loads = temp_vector_0();
|
| + MoveOpVector& loads = temp_vector_0();
|
| DCHECK(loads.empty());
|
| // Find all the loads.
|
| - for (auto move : *instr->parallel_moves()[0]) {
|
| + for (MoveOperands* move : *instr->parallel_moves()[0]) {
|
| if (move->IsRedundant()) continue;
|
| if (move->source().IsConstant() || IsSlot(move->source())) {
|
| loads.push_back(move);
|
| @@ -314,7 +316,7 @@ void MoveOptimizer::FinalizeMoves(Instruction* instr) {
|
| // beginning of the group.
|
| std::sort(loads.begin(), loads.end(), LoadCompare);
|
| MoveOperands* group_begin = nullptr;
|
| - for (auto load : loads) {
|
| + for (MoveOperands* load : loads) {
|
| // New group.
|
| if (group_begin == nullptr ||
|
| !load->source().EqualsCanonicalized(group_begin->source())) {
|
| @@ -324,7 +326,7 @@ void MoveOptimizer::FinalizeMoves(Instruction* instr) {
|
| // Nothing to be gained from splitting here.
|
| if (IsSlot(group_begin->destination())) continue;
|
| // Insert new move into slot 1.
|
| - auto slot_1 = instr->GetOrCreateParallelMove(
|
| + ParallelMove* slot_1 = instr->GetOrCreateParallelMove(
|
| static_cast<Instruction::GapPosition>(1), code_zone());
|
| slot_1->AddMove(group_begin->destination(), load->destination());
|
| load->Eliminate();
|
|
|