1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker main(String args[])19*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) { 20*795d594fSAndroid Build Coastguard Worker Element[] elements = new Element[51]; 21*795d594fSAndroid Build Coastguard Worker testArraySetCheckCastNull(elements); 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testArraySetCheckCastNull(Main$Element[]) builder (after) 27*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> ParameterValue 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> IntConstant 42 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Null:l\d+>> NullConstant 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Class:l\d+>> LoadClass 31*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: CheckCast [<<Null>>,<<Class>>] 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedValue:l\d+>> BoundType [<<Null>>] klass:Main$Element can_be_null:true 33*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] 34*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] 35*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<CheckedValue>>] needs_type_check:true can_trigger_gc:true 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testArraySetCheckCastNull(Main$Element[]) instruction_simplifier (after) 39*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testArraySetCheckCastNull(Main$Element[]) prepare_for_register_allocation (before) 42*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> ParameterValue 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> IntConstant 42 44*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Null:l\d+>> NullConstant 45*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Class:l\d+>> LoadClass 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedValue:l\d+>> BoundType [<<Null>>] 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedArray:l\d+>> NullCheck [<<Array>>] 48*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<CheckedArray>>] 49*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CheckedIndex:i\d+>> BoundsCheck [<<Index>>,<<Length>>] 50*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<CheckedArray>>,<<CheckedIndex>>,<<CheckedValue>>] needs_type_check:true can_trigger_gc:true 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.testArraySetCheckCastNull(Main$Element[]) prepare_for_register_allocation (after) 53*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> ParameterValue 54*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> IntConstant 42 55*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Null:l\d+>> NullConstant 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Class:l\d+>> LoadClass 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Length:i\d+>> ArrayLength [<<Array>>] 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArraySet:v\d+>> ArraySet [<<Array>>,<<Index>>,<<Null>>] needs_type_check:false can_trigger_gc:false 59*795d594fSAndroid Build Coastguard Worker testArraySetCheckCastNull(Element[] elements)60*795d594fSAndroid Build Coastguard Worker static void testArraySetCheckCastNull(Element[] elements) { 61*795d594fSAndroid Build Coastguard Worker Object object = null; 62*795d594fSAndroid Build Coastguard Worker Element element = (Element) object; 63*795d594fSAndroid Build Coastguard Worker elements[42] = element; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker class Element {} 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker } 69