Use the stored entry position when moving constants.

Bug: b/230337727
Change-Id: Ie5435c4a83abcbf9e1ce4015226ff681b8406eb0
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
index 9787686..2e6cc06 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
@@ -228,6 +228,7 @@
           new IRCode(
               appView.options(),
               method,
+              callerPosition,
               ListUtils.newLinkedList(block),
               valueNumberGenerator,
               blockNumberGenerator,
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index a363790..4656ad8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -117,6 +117,7 @@
   private final ProgramMethod method;
   private final MutableMethodConversionOptions conversionOptions;
 
+  public final Position entryPosition;
   public LinkedList<BasicBlock> blocks;
   public final NumberGenerator valueNumberGenerator;
   public final NumberGenerator basicBlockNumberGenerator;
@@ -133,6 +134,7 @@
   public IRCode(
       InternalOptions options,
       ProgramMethod method,
+      Position entryPosition,
       LinkedList<BasicBlock> blocks,
       NumberGenerator valueNumberGenerator,
       NumberGenerator basicBlockNumberGenerator,
@@ -142,9 +144,11 @@
     assert metadata != null;
     assert options != null;
     assert blocks.size() == basicBlockNumberGenerator.peek();
+    assert entryPosition != null;
     this.options = options;
     this.conversionOptions = conversionOptions;
     this.method = method;
+    this.entryPosition = entryPosition;
     this.blocks = blocks;
     this.valueNumberGenerator = valueNumberGenerator;
     this.basicBlockNumberGenerator = basicBlockNumberGenerator;
@@ -169,6 +173,10 @@
     return blocks.getFirst();
   }
 
+  public Position getEntryPosition() {
+    return entryPosition;
+  }
+
   public MethodConversionOptions getConversionOptions() {
     return conversionOptions;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index b46ebad..85ac399 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -703,6 +703,7 @@
         new IRCode(
             appView.options(),
             method,
+            source.getCanonicalDebugPositionAtOffset(0),
             blocks,
             valueNumberGenerator,
             basicBlockNumberGenerator,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/SyntheticStraightLineSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/SyntheticStraightLineSourceCode.java
index b505cf0..e8d830e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/SyntheticStraightLineSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/SyntheticStraightLineSourceCode.java
@@ -63,7 +63,7 @@
 
   @Override
   public Position getCanonicalDebugPositionAtOffset(int offset) {
-    return null;
+    return Position.syntheticNone();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index 99ebaba..bf34207 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -279,10 +279,7 @@
     while (it.hasNext()) {
       Instruction next = it.next();
       if (!next.isArgument()) {
-        // Set the constant to be the same position as the point at which it is inserted.
-        // Doing so preserves the "break on entry / break on first line behavior" as the constant
-        // itself is assumed to be a non-observable change.
-        canonicalizedConstant.setPosition(next.getPosition());
+        canonicalizedConstant.setPosition(code.getEntryPosition());
         it.previous();
         break;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
index 734e09e..2cab3fb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
@@ -1738,7 +1738,7 @@
 
     @Override
     public Position getCanonicalDebugPositionAtOffset(int offset) {
-      throw new Unreachable();
+      return Position.syntheticNone();
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
index dd73d7e..6e187ae 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
@@ -83,6 +83,7 @@
     return new IRCode(
         appView.options(),
         checkNotZeroMethod,
+        code.getEntryPosition(),
         code.getBlocks(),
         code.valueNumberGenerator,
         code.basicBlockNumberGenerator,
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
index c81383c..8e0d7d4 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
@@ -207,7 +207,7 @@
 
   @Override
   public Position getCanonicalDebugPositionAtOffset(int offset) {
-    throw new Unreachable();
+    return Position.syntheticNone();
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
index 1427b24..9a0d0ce 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -142,6 +142,7 @@
         new IRCode(
             options,
             null,
+            Position.none(),
             blocks,
             new NumberGenerator(),
             basicBlockNumberGenerator,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
index 7bbc000..ea86918 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -100,6 +100,7 @@
         new IRCode(
             options,
             null,
+            Position.none(),
             blocks,
             new NumberGenerator(),
             basicBlockNumberGenerator,
@@ -188,6 +189,7 @@
         new IRCode(
             options,
             null,
+            Position.none(),
             blocks,
             new NumberGenerator(),
             basicBlockNumberGenerator,
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index dd40ecf..4d546d1 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -1014,7 +1014,7 @@
 
     @Override
     public Position getCanonicalDebugPositionAtOffset(int offset) {
-      throw new Unreachable();
+      return Position.none();
     }
 
     @Override