Correct removal of redundant moves

The logic for removing while iterating is non-standard and
a left over from a previous index based loop. This patch
replaces it with a standard erase based version.

This fixes a runtime crash with MSVC that invalidates the
iterator and then asserts. This also makes the code safe
in case the last move can be redundant.

Change-Id: Ie6990e0d65a3b83a4b7da3e2e89ed4e60a6cd215
Reviewed-on: https://chromium-review.googlesource.com/c/1488762
Reviewed-by: Ben Titzer <titzer@chromium.org>
Commit-Queue: Ben Titzer <titzer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59868}
This commit is contained in:
Allan Sandfeld Jensen 2019-02-26 11:49:36 +01:00 committed by Commit Bot
parent 561aaa3066
commit 385aa80aff
2 changed files with 2 additions and 2 deletions

View File

@ -46,6 +46,7 @@ Alexander Botero-Lowry <alexbl@FreeBSD.org>
Alexander Karpinsky <homm86@gmail.com>
Alexandre Vassalotti <avassalotti@gmail.com>
Alexis Campailla <alexis@janeasystems.com>
Allan Sandfeld Jensen <allan.jensen@qt.io>
Amos Lim <eui-sang.lim@samsung.com>
Andreas Anyuru <andreas.anyuru@gmail.com>
Andrew Paprocki <andrew@ishiboo.com>

View File

@ -96,8 +96,7 @@ void GapResolver::Resolve(ParallelMove* moves) {
for (auto it = moves->begin(); it != moves->end();) {
MoveOperands* move = *it;
if (move->IsRedundant()) {
*it = moves->back();
moves->pop_back();
it = moves->erase(it);
continue;
}
source_kinds.Add(GetKind(move->source()));