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