Reproduce NoSuchElementException in move scheduler
Change-Id: I08b5975d3043d33856ad41660efa7a85562307dd
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index e88ebf3..5d57ddb 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.regalloc;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -22,6 +23,7 @@
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.BasicBlockIterator;
+import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.InitClass;
import com.android.tools.r8.ir.code.Instruction;
@@ -38,6 +40,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;
@@ -583,6 +586,42 @@
assertEquals(2, scheduler.getUsedTempRegisters());
}
+ @Test
+ public void reproNoSuchElementException() {
+ CollectMovesIterator moves = new CollectMovesIterator();
+ int temp = 53;
+ int args = 1;
+ RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp, args);
+ scheduler.addMove(new RegisterMove(23, 15, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(26, 14, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(15, 20, TypeElement.getLong()));
+ scheduler.addMove(new RegisterMove(17, 27, TypeElement.getLong()));
+ scheduler.addMove(new RegisterMove(19, 4, TypeElement.getLong()));
+ scheduler.addMove(new RegisterMove(21, 16, TypeElement.getLong()));
+ scheduler.addMove(new RegisterMove(24, 6, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(25, 7, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(14, 8, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(30, 9, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(31, 13, TypeElement.getInt()));
+ scheduler.addMove(new RegisterMove(34, 1, TypeElement.getInt()));
+ scheduler.addMove(
+ new RegisterMove(
+ 27,
+ TypeElement.getInt(),
+ new ConstNumber(new Value(0, TypeElement.getInt(), null), 3)));
+ scheduler.addMove(
+ new RegisterMove(
+ 28,
+ TypeElement.getInt(),
+ new ConstNumber(new Value(1, TypeElement.getInt(), null), 18)));
+ try {
+ scheduler.schedule();
+ fail();
+ } catch (NoSuchElementException e) {
+ // Expected.
+ }
+ }
+
// Debugging aid.
private void printMoves(List<Instruction> moves) {
System.out.println("Generated moves:");
diff --git a/tools/d8.py b/tools/d8.py
index b831849..6c2dbc2 100755
--- a/tools/d8.py
+++ b/tools/d8.py
@@ -17,6 +17,11 @@
'--commit_hash',
help='Commit hash of D8 to use.',
default=None)
+ parser.add_option('--debug-agent',
+ '--debug_agent',
+ help='Enable Java debug agent and suspend compilation',
+ default=False,
+ action='store_true')
parser.add_option('--disable-assertions',
'--disable_assertions',
help='Disable assertions when running',
@@ -45,6 +50,7 @@
return toolhelper.run('d8',
d8_args,
build=not options.no_build,
+ debug_agent=options.debug_agent,
disable_assertions=options.disable_assertions,
jar=utils.find_r8_jar_from_options(options),
main='com.android.tools.r8.D8',