Initial push.
diff --git a/src/test/examples/cse/CommonSubexpressionElimination.java b/src/test/examples/cse/CommonSubexpressionElimination.java
new file mode 100644
index 0000000..3c64a1d
--- /dev/null
+++ b/src/test/examples/cse/CommonSubexpressionElimination.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2017, 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.
+
+// This code is not run directly. It needs to be compiled to dex code.
+// 'arithmetic.dex' is what is run.
+
+package cse;
+
+public class CommonSubexpressionElimination {
+
+ public static int divNoCatch(int a, int b, int c) {
+ int d = c / (a - b);
+ System.out.println(d);
+ return c / (a - b);
+ }
+
+ public static int divNoCatch2(int a, int b, int c) {
+ int d = c / (a - b);
+ int e = c / (a - b);
+ System.out.println(d + " " + e);
+ return c / (a - b);
+ }
+
+ public static int divCatch(int a, int b, int c) {
+ try {
+ int d = c / (a - b);
+ System.out.println(d);
+ return d;
+ } catch (Throwable t) {
+ return c / (a - b);
+ }
+ }
+
+ public static int divCatch2(int a, int b, int c) {
+ try {
+ int d = c / (a - b);
+ int e = c / (a - b);
+ System.out.println(d + " " + e);
+ return d;
+ } catch (Throwable t) {
+ return c / (a - b);
+ }
+ }
+
+ public static String divCatchCatch(int a, int b, int c) {
+ try {
+ int d = c / (a - b);
+ System.out.println(d);
+ return "X";
+ } catch (Throwable t) {
+ try {
+ return "" + c / (a - b);
+ } catch (Throwable t2) {
+ return "A";
+ }
+ }
+ }
+
+ public static String divCatchSharedCatchHandler(int a, int b, int c) {
+ try {
+ int d = c / (a - b);
+ System.out.println(d);
+ if (a == 0) {
+ int e = c / (a - b);
+ System.out.println(e);
+ } else {
+ int f = c / (a - b);
+ System.out.println(f);
+ }
+ return "X";
+ } catch (Throwable t) {
+ return "B";
+ }
+ }
+
+
+ public static void main(String[] args) {
+ System.out.println(divNoCatch(1, 0, 1));
+ System.out.println(divNoCatch2(1, 0, 2));
+ System.out.println(divCatch(1, 0, 3));
+ System.out.println(divCatch2(1, 0, 4));
+
+ System.out.println(divCatchCatch(0, 0, 1));
+ System.out.println(divCatchSharedCatchHandler(0, 0, 1));
+
+ try {
+ divNoCatch(0, 0, 1);
+ throw new RuntimeException("UNEXPECTED");
+ } catch (ArithmeticException e) {
+ // Expected "divide by zero".
+ }
+
+ try {
+ divNoCatch2(0, 0, 1);
+ throw new RuntimeException("UNEXPECTED");
+ } catch (ArithmeticException e) {
+ // Expected "divide by zero".
+ }
+
+ try {
+ divCatch(0, 0, 1);
+ throw new RuntimeException("UNEXPECTED");
+ } catch (ArithmeticException e) {
+ // Expected "divide by zero".
+ }
+
+ try {
+ divCatch2(0, 0, 1);
+ throw new RuntimeException("UNEXPECTED");
+ } catch (ArithmeticException e) {
+ // Expected "divide by zero".
+ }
+ }
+}