112617599757b625bd59e6c62e022c30735073622Calin Juravle/*
212617599757b625bd59e6c62e022c30735073622Calin Juravle * Copyright (C) 2015 The Android Open Source Project
312617599757b625bd59e6c62e022c30735073622Calin Juravle *
412617599757b625bd59e6c62e022c30735073622Calin Juravle * Licensed under the Apache License, Version 2.0 (the "License");
512617599757b625bd59e6c62e022c30735073622Calin Juravle * you may not use this file except in compliance with the License.
612617599757b625bd59e6c62e022c30735073622Calin Juravle * You may obtain a copy of the License at
712617599757b625bd59e6c62e022c30735073622Calin Juravle *
812617599757b625bd59e6c62e022c30735073622Calin Juravle *      http://www.apache.org/licenses/LICENSE-2.0
912617599757b625bd59e6c62e022c30735073622Calin Juravle *
1012617599757b625bd59e6c62e022c30735073622Calin Juravle * Unless required by applicable law or agreed to in writing, software
1112617599757b625bd59e6c62e022c30735073622Calin Juravle * distributed under the License is distributed on an "AS IS" BASIS,
1212617599757b625bd59e6c62e022c30735073622Calin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1312617599757b625bd59e6c62e022c30735073622Calin Juravle * See the License for the specific language governing permissions and
1412617599757b625bd59e6c62e022c30735073622Calin Juravle * limitations under the License.
1512617599757b625bd59e6c62e022c30735073622Calin Juravle */
1612617599757b625bd59e6c62e022c30735073622Calin Juravle
1712617599757b625bd59e6c62e022c30735073622Calin Juravlefinal class Final {
1812617599757b625bd59e6c62e022c30735073622Calin Juravle  public String toString() {
1912617599757b625bd59e6c62e022c30735073622Calin Juravle    return "final";
2012617599757b625bd59e6c62e022c30735073622Calin Juravle  }
2112617599757b625bd59e6c62e022c30735073622Calin Juravle}
2212617599757b625bd59e6c62e022c30735073622Calin Juravle
2312617599757b625bd59e6c62e022c30735073622Calin Juravlepublic class Main {
24badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil  /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) builder (after)
2512617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi klass:java.lang.Object
2612617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Class:l\d+>>   LoadClass
2712617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     CheckCast [<<Phi>>,<<Class>>]
2812617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Ret:l\d+>>     BoundType [<<Phi>>] klass:Final
2912617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     Return [<<Ret>>]
3012617599757b625bd59e6c62e022c30735073622Calin Juravle
314833f5a1990c76bc2be89504225fb13cca22bedfDavid Brazdil  /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) instruction_simplifier (after)
3212617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi
3312617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Class:l\d+>>   LoadClass
3412617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     CheckCast [<<Phi>>,<<Class>>]
3512617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Ret:l\d+>>     BoundType [<<Phi>>]
3612617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     Return [<<Ret>>]
3712617599757b625bd59e6c62e022c30735073622Calin Juravle  public static Final testKeepCheckCast(Object o, boolean cond) {
3812617599757b625bd59e6c62e022c30735073622Calin Juravle    Object x = new Final();
3912617599757b625bd59e6c62e022c30735073622Calin Juravle    while (cond) {
4012617599757b625bd59e6c62e022c30735073622Calin Juravle      x = o;
4112617599757b625bd59e6c62e022c30735073622Calin Juravle      cond = false;
4212617599757b625bd59e6c62e022c30735073622Calin Juravle    }
4312617599757b625bd59e6c62e022c30735073622Calin Juravle    return (Final) x;
4412617599757b625bd59e6c62e022c30735073622Calin Juravle  }
4512617599757b625bd59e6c62e022c30735073622Calin Juravle
46badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil  /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) builder (after)
4712617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi klass:java.lang.Object
4812617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Class:l\d+>>   LoadClass
4912617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     InstanceOf [<<Phi>>,<<Class>>]
5012617599757b625bd59e6c62e022c30735073622Calin Juravle
5142103c6daa606d4e1753ef567836ef556be51cdcWojciech Staszkiewicz  /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) dead_code_elimination$initial (after)
5212617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi
5312617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Class:l\d+>>   LoadClass
5412617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     InstanceOf [<<Phi>>,<<Class>>]
5512617599757b625bd59e6c62e022c30735073622Calin Juravle  public static void testKeepInstanceOf(Object o, boolean cond) {
5612617599757b625bd59e6c62e022c30735073622Calin Juravle    Object x = new Final();
5712617599757b625bd59e6c62e022c30735073622Calin Juravle    while (cond) {
5812617599757b625bd59e6c62e022c30735073622Calin Juravle      x = o;
5912617599757b625bd59e6c62e022c30735073622Calin Juravle      cond = false;
6012617599757b625bd59e6c62e022c30735073622Calin Juravle    }
6112617599757b625bd59e6c62e022c30735073622Calin Juravle    if (x instanceof Final) {
6212617599757b625bd59e6c62e022c30735073622Calin Juravle      System.out.println("instanceof succeed");
6312617599757b625bd59e6c62e022c30735073622Calin Juravle    } else {
6412617599757b625bd59e6c62e022c30735073622Calin Juravle      System.out.println("instanceof failed");
6512617599757b625bd59e6c62e022c30735073622Calin Juravle    }
6612617599757b625bd59e6c62e022c30735073622Calin Juravle  }
6712617599757b625bd59e6c62e022c30735073622Calin Juravle
68badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil  /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) builder (after)
6912617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi klass:java.lang.Object
7012617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<NC:l\d+>>      NullCheck [<<Phi>>]
7112617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Ret:l\d+>>     InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString
7212617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     Return [<<Ret>>]
7312617599757b625bd59e6c62e022c30735073622Calin Juravle
7412617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) inliner (after)
7512617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Phi:l\d+>>     Phi
7612617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<NC:l\d+>>      NullCheck [<<Phi>>]
7712617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:    <<Ret:l\d+>>     InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString
7812617599757b625bd59e6c62e022c30735073622Calin Juravle  /// CHECK:                     Return [<<Ret>>]
7912617599757b625bd59e6c62e022c30735073622Calin Juravle  public static String testNoInline(Object o, boolean cond) {
8012617599757b625bd59e6c62e022c30735073622Calin Juravle    Object x = new Final();
8112617599757b625bd59e6c62e022c30735073622Calin Juravle    while (cond) {
8212617599757b625bd59e6c62e022c30735073622Calin Juravle      x = o;
8312617599757b625bd59e6c62e022c30735073622Calin Juravle      cond = false;
8412617599757b625bd59e6c62e022c30735073622Calin Juravle    }
8512617599757b625bd59e6c62e022c30735073622Calin Juravle    return x.toString();
8612617599757b625bd59e6c62e022c30735073622Calin Juravle  }
8712617599757b625bd59e6c62e022c30735073622Calin Juravle
8812617599757b625bd59e6c62e022c30735073622Calin Juravle  public static void main(String[] args) {
8912617599757b625bd59e6c62e022c30735073622Calin Juravle    try {
9012617599757b625bd59e6c62e022c30735073622Calin Juravle      testKeepCheckCast(new Object(), true);
9112617599757b625bd59e6c62e022c30735073622Calin Juravle      throw new Error("Expected check cast exception");
9212617599757b625bd59e6c62e022c30735073622Calin Juravle    } catch (ClassCastException e) {
9312617599757b625bd59e6c62e022c30735073622Calin Juravle      // expected
9412617599757b625bd59e6c62e022c30735073622Calin Juravle    }
9512617599757b625bd59e6c62e022c30735073622Calin Juravle
9612617599757b625bd59e6c62e022c30735073622Calin Juravle    testKeepInstanceOf(new Object(), true);
9712617599757b625bd59e6c62e022c30735073622Calin Juravle
9812617599757b625bd59e6c62e022c30735073622Calin Juravle    if ("final".equals(testNoInline(new Object(), true))) {
9912617599757b625bd59e6c62e022c30735073622Calin Juravle      throw new Error("Bad inlining");
10012617599757b625bd59e6c62e022c30735073622Calin Juravle    }
10112617599757b625bd59e6c62e022c30735073622Calin Juravle  }
10212617599757b625bd59e6c62e022c30735073622Calin Juravle}
103