diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index 28d1ed5..e5ba3f1 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.position.Position;
-import com.google.common.collect.ObjectArrays;
 import java.io.IOException;
 import java.nio.file.FileSystemException;
 import java.nio.file.Paths;
@@ -98,10 +97,6 @@
       suppressed.add(innerMostCause);
       innerMostCause = innerMostCause.getCause();
     }
-    // Add the full stack as a suppressed stack on the inner cause.
-    if (topMostException != innerMostCause) {
-      innerMostCause.addSuppressed(topMostException);
-    }
 
     // If no abort is seen, the exception is not reported, so report it now.
     if (!hasBeenReported) {
@@ -121,9 +116,10 @@
         new CompilationFailedException(message.toString(), innerMostCause);
     // Replace its stack by the cause stack and insert version info at the top.
     String filename = "Version_" + Version.LABEL + ".java";
-    StackTraceElement versionElement =
-        new StackTraceElement(Version.class.getSimpleName(), "fakeStackEntry", filename, 0);
-    rethrow.setStackTrace(ObjectArrays.concat(versionElement, rethrow.getStackTrace()));
+    rethrow.setStackTrace(
+        new StackTraceElement[] {
+          new StackTraceElement(Version.class.getSimpleName(), "fakeStackEntry", filename, 0)
+        });
     return rethrow;
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/Reporter.java b/src/main/java/com/android/tools/r8/utils/Reporter.java
index f251b0c..f7f9d1f 100644
--- a/src/main/java/com/android/tools/r8/utils/Reporter.java
+++ b/src/main/java/com/android/tools/r8/utils/Reporter.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.errors.Unreachable;
 
 public class Reporter implements DiagnosticsHandler {
 
@@ -55,13 +56,14 @@
    */
   public RuntimeException fatalError(Diagnostic error) {
     error(error);
-    throw abort;
+    failIfPendingErrors();
+    throw new Unreachable();
   }
 
   /** @throws AbortException if any error was reported. */
   public synchronized void failIfPendingErrors() {
     if (abort != null) {
-      throw new RuntimeException(abort);
+      throw abort;
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/diagnostics/ErrorDuringIrConversionTest.java b/src/test/java/com/android/tools/r8/diagnostics/ErrorDuringIrConversionTest.java
index b9eabe6..1f19d89 100644
--- a/src/test/java/com/android/tools/r8/diagnostics/ErrorDuringIrConversionTest.java
+++ b/src/test/java/com/android/tools/r8/diagnostics/ErrorDuringIrConversionTest.java
@@ -28,7 +28,6 @@
 import java.io.StringWriter;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.hamcrest.Matcher;
-import org.hamcrest.core.IsAnything;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -36,6 +35,8 @@
 @RunWith(Parameterized.class)
 public class ErrorDuringIrConversionTest extends TestBase {
 
+  static final String EXPECTED = StringUtils.lines("Hello, world");
+
   static final Origin ORIGIN =
       new Origin(Origin.root()) {
         @Override
@@ -60,21 +61,10 @@
       CompilationFailedException e, Matcher<String> messageMatcher, Matcher<String> stackMatcher) {
     // Check that the failure exception exiting the compiler contains origin info in the message.
     assertThat(e.getMessage(), messageMatcher);
+    // Check that the stack trace has the version marker.
     StringWriter writer = new StringWriter();
     e.printStackTrace(new PrintWriter(writer));
-    String fullStackTrace = writer.toString();
-    // Extract the top cause stack.
-    int topStackTraceEnd = fullStackTrace.indexOf("Caused by:");
-    String topStackTrace = fullStackTrace.substring(0, topStackTraceEnd);
-    String restStackTrace = fullStackTrace.substring(topStackTraceEnd);
-    // Check that top stack trace always has the version marker.
-    assertThat(topStackTrace, containsString("fakeStackEntry"));
-    // Check that top stack has the D8 entry (from tests the non-renamed entry is ToolHelper.runD8).
-    assertThat(topStackTrace, containsString("com.android.tools.r8.ToolHelper.runD8("));
-    // Check that the stack trace always has the suppressed info.
-    assertThat(restStackTrace, containsString(StringUtils.LINE_SEPARATOR + "\tSuppressed:"));
-    // Custom test checks.
-    assertThat(restStackTrace, stackMatcher);
+    assertThat(writer.toString(), stackMatcher);
   }
 
   private static void throwNPE() {
@@ -100,7 +90,9 @@
               });
     } catch (CompilationFailedException e) {
       checkCompilationFailedException(
-          e, containsString(ORIGIN.toString()), containsString("throwNPE"));
+          e,
+          containsString(ORIGIN.toString()),
+          allOf(containsString("fakeStackEntry"), containsString("throwNPE")));
       return;
     }
     fail("Expected compilation to fail");
@@ -130,7 +122,8 @@
                         diagnosticOrigin(Origin.unknown())));
               });
     } catch (CompilationFailedException e) {
-      checkCompilationFailedException(e, containsString(ORIGIN.toString()), new IsAnything<>());
+      checkCompilationFailedException(
+          e, containsString(ORIGIN.toString()), containsString("fakeStackEntry"));
       return;
     }
     fail("Expected compilation to fail");
@@ -180,9 +173,10 @@
           // There may be no fail-if-error barrier inside any origin association, thus only the
           // top level message can be expected here.
           containsString("Compilation failed to complete"),
-          // The stack trace must contain the reportErrors frame for the hook above, and one
+          // The stack trace must contain both the version, the frame for the hook above, and one
           // of the error messages.
           allOf(
+              containsString("fakeStackEntry"),
               containsString("reportErrors"),
               anyOf(containsString("FOO!"), containsString("BAR!"), containsString("BAZ!"))));
       return;
