1// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5// This code is not run directly. It needs to be compiled to dex code.
6// 'arithmetic.dex' is what is run.
7
8package cse;
9
10public class CommonSubexpressionElimination {
11
12  public static int divNoCatch(int a, int b, int c) {
13    int d = c / (a - b);
14    System.out.println(d);
15    return c / (a - b);
16  }
17
18  public static int divNoCatch2(int a, int b, int c) {
19    int d = c / (a - b);
20    int e = c / (a - b);
21    System.out.println(d + " " + e);
22    return c / (a - b);
23  }
24
25  public static int divCatch(int a, int b, int c) {
26    try {
27      int d = c / (a - b);
28      System.out.println(d);
29      return d;
30    } catch (Throwable t) {
31      return c / (a - b);
32    }
33  }
34
35  public static int divCatch2(int a, int b, int c) {
36    try {
37      int d = c / (a - b);
38      int e = c / (a - b);
39      System.out.println(d + " " + e);
40      return d;
41    } catch (Throwable t) {
42      return c / (a - b);
43    }
44  }
45
46  public static String divCatchCatch(int a, int b, int c) {
47    try {
48      int d = c / (a - b);
49      System.out.println(d);
50      return "X";
51    } catch (Throwable t) {
52      try {
53        return "" + c / (a - b);
54      } catch (Throwable t2) {
55        return "A";
56      }
57    }
58  }
59
60  public static String divCatchSharedCatchHandler(int a, int b, int c) {
61    try {
62      int d = c / (a - b);
63      System.out.println(d);
64      if (a == 0) {
65        int e = c / (a - b);
66        System.out.println(e);
67      } else {
68        int f = c / (a - b);
69        System.out.println(f);
70      }
71      return "X";
72    } catch (Throwable t) {
73      return "B";
74    }
75  }
76
77
78  public static void main(String[] args) {
79    System.out.println(divNoCatch(1, 0, 1));
80    System.out.println(divNoCatch2(1, 0, 2));
81    System.out.println(divCatch(1, 0, 3));
82    System.out.println(divCatch2(1, 0, 4));
83
84    System.out.println(divCatchCatch(0, 0, 1));
85    System.out.println(divCatchSharedCatchHandler(0, 0, 1));
86
87    try {
88      divNoCatch(0, 0, 1);
89      throw new RuntimeException("UNEXPECTED");
90    } catch (ArithmeticException e) {
91      // Expected "divide by zero".
92    }
93
94    try {
95      divNoCatch2(0, 0, 1);
96      throw new RuntimeException("UNEXPECTED");
97    } catch (ArithmeticException e) {
98      // Expected "divide by zero".
99    }
100
101    try {
102      divCatch(0, 0, 1);
103      throw new RuntimeException("UNEXPECTED");
104    } catch (ArithmeticException e) {
105      // Expected "divide by zero".
106    }
107
108    try {
109      divCatch2(0, 0, 1);
110      throw new RuntimeException("UNEXPECTED");
111    } catch (ArithmeticException e) {
112      // Expected "divide by zero".
113    }
114  }
115}
116