| // 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". |
| } |
| } |
| } |