1a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray/*
2a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * Copyright (C) 2015 The Android Open Source Project
3a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray *
4a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License");
5a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * you may not use this file except in compliance with the License.
6a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * You may obtain a copy of the License at
7a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray *
8a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray *      http://www.apache.org/licenses/LICENSE-2.0
9a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray *
10a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software
11a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS,
12a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * See the License for the specific language governing permissions and
14a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray * limitations under the License.
15a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray */
16a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
17a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
18a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffraypublic class Main {
19a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static void main(String[] args) {
20a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    stringEqualsSame();
21a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    stringArgumentNotNull("Foo");
22a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
23a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
24a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START: boolean Main.stringEqualsSame() instruction_simplifier (before)
25a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      InvokeStaticOrDirect
26a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
27a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START: boolean Main.stringEqualsSame() register (before)
28a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      <<Const1:i\d+>> IntConstant 1
29a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      Return [<<Const1>>]
30a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
31a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START: boolean Main.stringEqualsSame() register (before)
32a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-NOT:  InvokeStaticOrDirect
33a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static boolean stringEqualsSame() {
34a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    return $inline$callStringEquals("obj", "obj");
35a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
36a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
37a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START: boolean Main.stringEqualsNull() register (after)
38e523423a053af5cb55837f07ceae9ff2fd581712Nicolas Geoffray  /// CHECK:      <<Invoke:z\d+>> InvokeVirtual
39a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      Return [<<Invoke>>]
40a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static boolean stringEqualsNull() {
41a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    String o = (String)myObject;
42a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    return $inline$callStringEquals(o, o);
43a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
44a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
45a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static boolean $inline$callStringEquals(String a, String b) {
46a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    return a.equals(b);
47a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
48a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
49a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START-X86: boolean Main.stringArgumentNotNull(java.lang.Object) disassembly (after)
50dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao  /// CHECK:          InvokeVirtual {{.*\.equals.*}}
51a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-NOT:      test
52a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static boolean stringArgumentNotNull(Object obj) {
53a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    obj.getClass();
54a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    return "foo".equals(obj);
55a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
56a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
57a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  // Test is very brittle as it depends on the order we emit instructions.
58a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-START-X86: boolean Main.stringArgumentIsString() disassembly (after)
59e523423a053af5cb55837f07ceae9ff2fd581712Nicolas Geoffray  /// CHECK:      InvokeVirtual
60a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      test
61a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      jz/eq
62a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  // Check that we don't try to compare the classes.
63a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK-NOT:  mov
64a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  /// CHECK:      cmp
65a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  public static boolean stringArgumentIsString() {
66a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray    return "foo".equals(myString);
67a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  }
68a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray
69a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  static String myString;
70a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray  static Object myObject;
71a83a54d7f2322060f08480f8aabac5eb07268912Nicolas Geoffray}
72