diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 0849c7f..bca780b 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "v1.0.5";
+  public static final String LABEL = "v1.0.6";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index aff5063..27b09c1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -231,6 +231,13 @@
     block = null;
   }
 
+  /**
+   * Returns true if the instruction is in the IR and therefore has a block.
+   */
+  public boolean hasBlock() {
+    return block != null;
+  }
+
   public String getInstructionName() {
     return getClass().getSimpleName();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
index 5144704..f767e1b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
@@ -40,13 +40,13 @@
 
   // Add the block from where the value originates to the worklist.
   private static void updateWorklist(Queue<BasicBlock> worklist, Value value, int color) {
-    BasicBlock block;
+    BasicBlock block = null;
     if (value.isPhi()) {
       block = value.asPhi().getBlock();
-    } else {
+    } else if (value.definition.hasBlock()) {
       block = value.definition.getBlock();
     }
-    if (!block.isMarked(color)) {
+    if (block != null && !block.isMarked(color)) {
       worklist.add(block);
     }
   }
@@ -98,7 +98,6 @@
       assert outValue != null;
       if (!outValue.isDead(options)) {
         continue;
-
       }
       updateWorklist(worklist, current, color);
       // All users will be removed for this instruction. Eagerly clear them so further inspection
diff --git a/src/test/examples/regress_72361252/Test.java b/src/test/examples/regress_72361252/Test.java
new file mode 100644
index 0000000..98d687e
--- /dev/null
+++ b/src/test/examples/regress_72361252/Test.java
@@ -0,0 +1,303 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package regress_72361252;
+
+/**
+ * AOSP JFuzz Tester.
+ * Automatically generated program.
+ * jfuzz -s 3131542579 -d 1 -l 8 -i 2 -n 3 (version 1.5)
+ */
+
+import java.util.Arrays;
+
+public class Test {
+
+  private interface X {
+    int x();
+  }
+
+  private class A {
+    public int a() {
+      return (Math.subtractExact(mI, (++mI)));
+    }
+  }
+
+  private class B extends A implements X {
+    public int a() {
+      return super.a() + (Integer.MAX_VALUE);
+    }
+    public int x() {
+      return (mI & mI);
+    }
+  }
+
+  private static class C implements X {
+    public static int s() {
+      return 485062193;
+    }
+    public int c() {
+      return -1161609244;
+    }
+    public int x() {
+      return -210091649;
+    }
+  }
+
+  private A mA  = new B();
+  private B mB  = new B();
+  private X mBX = new B();
+  private C mC  = new C();
+  private X mCX = new C();
+
+  private boolean mZ = false;
+  private int     mI = 0;
+  private long    mJ = 0;
+  private float   mF = 0;
+  private double  mD = 0;
+
+  private float[][][][][][][][][] mArray = new float[1][1][1][1][1][1][1][1][1];
+
+  private Test() {
+    float a = 1786185107.0f;
+    for (int i0 = 0; i0 < 1; i0++) {
+      for (int i1 = 0; i1 < 1; i1++) {
+        for (int i2 = 0; i2 < 1; i2++) {
+          for (int i3 = 0; i3 < 1; i3++) {
+            for (int i4 = 0; i4 < 1; i4++) {
+              for (int i5 = 0; i5 < 1; i5++) {
+                for (int i6 = 0; i6 < 1; i6++) {
+                  for (int i7 = 0; i7 < 1; i7++) {
+                    for (int i8 = 0; i8 < 1; i8++) {
+                      mArray[i0][i1][i2][i3][i4][i5][i6][i7][i8] = a;
+                      a++;
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private double testMethod() {
+    mJ /= ( mI);
+    mD *= (--mD);
+    {
+      long lJ0 = ((Math.incrementExact(mJ)) / ((long) (mF - -356872921.0f)));
+      for (int i0 = 0; i0 < 1; i0++) {
+        for (int i1 = 0; i1 < 1; i1++) {
+          mF += (mC.s());
+          lJ0 += ((long)(int)(long) -1924533530L);
+          mD = ((double) new Double((Double.POSITIVE_INFINITY)));
+          mD = ((double) (49956622.0f / 1285981813.0f));
+          continue;
+        }
+        for (int i1 = 0; i1 < 1; i1++) {
+          if ((mZ)) {
+            mI >>= (- (mI & -1283058927));
+            {
+              int i2 = -1;
+              while (++i2 < 1) {
+                try {
+                  mD *= ((double) (++mArray[i1][0][i0][0][0][i0][i0][0][0]));
+                  mD -= ((this instanceof Test) ? 110559916.0 : mD);
+                  lJ0 -= (- (+ 417176163L));
+                  lJ0 /= (+ -491731430L);
+                  mI /= (-651651736 * ((int)(byte)(int) mI));
+                } finally {
+                  {
+                    float[][][][][][][][][] tmp = {
+                      {
+                        {
+                          {
+                            {
+                              {
+                                {
+                                  {
+                                    { (mF * ((Math.signum(498770569.0f)) / mArray[i1][0][0][i1][i2][0][0][0][0])), },
+                                  },
+                                },
+                              },
+                            },
+                          },
+                        },
+                      },
+                    };
+                    mArray = tmp;
+                  }
+                }
+              }
+            }
+            try {
+              mZ |= ((false ? false : true) | mZ);
+            } catch (IllegalStateException ex1_0) {
+              lJ0 >>= (Long.MAX_VALUE);
+            } catch (NullPointerException ex1_1) {
+              mJ = (Long.MAX_VALUE);
+              {
+                int i2 = 0;
+                do {
+                  mArray[0][0][0][i0][0][0][i2][0][0] -= ((float) new Float((mArray[0][mArray.length - 1][0][i2][0][i0][0][i0][i1] / (++mF))));
+                } while (++i2 < 1);
+              }
+            }
+            switch (i0) {
+              case 0: {
+                mArray[mArray.length - 1][0][0][0][0][0][0][i0][i1] *= ((2005931898.0f >= -170622901.0f) ? 1714576973.0f : (+ ((true ? mF : (++mF)) / 1116904717.0f)));
+                break;
+              }
+              default: {
+                try {
+                  mD /= (mD++);
+                } catch (IllegalStateException ex1_0) {
+                  nop();
+                } catch (NullPointerException ex1_1) {
+                  mJ += (Long.numberOfLeadingZeros(686016417L));
+                  mJ %= (++lJ0);
+                } catch (IllegalArgumentException ex1_2) {
+                  lJ0 |= (--mJ);
+                } catch (ArrayIndexOutOfBoundsException ex1_3) {
+                  nop();
+                } finally {
+                  {
+                    float[][][][][][][][][] tmp = {
+                      {
+                        {
+                          {
+                            {
+                              {
+                                {
+                                  {
+                                    { (mF - mF), },
+                                  },
+                                },
+                              },
+                            },
+                          },
+                        },
+                      },
+                    };
+                    mArray = tmp;
+                  }
+                  try {
+                    mD /= (Math.nextUp(mD));
+                    {
+                      int i2 = 0;
+                      do {
+                        lJ0 %= ((mZ) ? mJ : (- -1060440504L));
+                      } while (++i2 < 1);
+                    }
+                    mArray[mArray.length - 1][0][i0][0][mArray.length - 1][0][i0][0][0] *= ((float) (~ (mI++)));
+                  } finally {
+                    try {
+                      mJ *= (--lJ0);
+                    } catch (IllegalStateException ex3_0) {
+                      for (int i2 = 1 - 1; i2 >= 0; i2--) {
+                        mI %= (~ (~ 2111805872));
+                      }
+                    } finally {
+                      lJ0 = ((Long.MAX_VALUE) + ((1268602383L >>> -366323683L) / 2001325153L));
+                    }
+                  }
+                }
+                break;
+              }
+            }
+          } else {
+            mF = (++mF);
+          }
+          if ((((mZ) & true) & true)) {
+            try {
+              lJ0 |= (+ mJ);
+            } catch (IllegalStateException ex1_0) {
+              lJ0 >>>= (- 34814636L);
+            } catch (NullPointerException ex1_1) {
+              if (((boolean) new Boolean((1137859375L < -1146618420L)))) {
+                {
+                  float[][][][][][][][][] tmp = {
+                    {
+                      {
+                        {
+                          {
+                            {
+                              {
+                                {
+                                  { ((float) new Float(mF)), },
+                                },
+                              },
+                            },
+                          },
+                        },
+                      },
+                    },
+                  };
+                  mArray = tmp;
+                }
+              } else {
+                mF -= ((float) new Float(mF));
+              }
+            } finally {
+              {
+                float[][][][][][][][][] tmp = {
+                  {
+                    {
+                      {
+                        {
+                          {
+                            {
+                              {
+                                { (mA.a()), },
+                              },
+                            },
+                          },
+                        },
+                      },
+                    },
+                  },
+                };
+                mArray = tmp;
+              }
+            }
+          } else {
+            switch (i0) {
+              case 0: {
+                lJ0 -= (- mJ);
+                break;
+              }
+              default: {
+                mD += (((double) new Double(mD)) * ((double) new Double(mD)));
+                lJ0 <<= ((! (true & mZ)) ? -482511807L : lJ0);
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+    return ((-663287294.0 - 970965601.0) + mD);
+  }
+
+  public static void nop() {}
+
+  public static void main(String[] args) {
+    Test t = new Test();
+    double r = -437780077.0;
+    try {
+      r = t.testMethod();
+    } catch (Exception e) {
+      // Arithmetic, null pointer, index out of bounds, etc.
+      System.out.println("An exception was caught.");
+    }
+    System.out.println("r  = " + r);
+    System.out.println("mZ = " + t.mZ);
+    System.out.println("mI = " + t.mI);
+    System.out.println("mJ = " + t.mJ);
+    System.out.println("mF = " + t.mF);
+    System.out.println("mD = " + t.mD);
+    System.out.println("mArray = " + Arrays.deepToString(t.mArray));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index f4783b2..44015c9 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -70,6 +70,7 @@
         "regress_70703087.Test",
         "regress_70736958.Test",
         "regress_70737019.Test",
+        "regress_72361252.Test",
         "memberrebinding2.Memberrebinding",
         "memberrebinding3.Memberrebinding",
         "minification.Minification",
