1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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 { main(String[] args)18*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 19*795d594fSAndroid Build Coastguard Worker System.out.println(test(0L)); 20*795d594fSAndroid Build Coastguard Worker } 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker public static long testField = 0; 23*795d594fSAndroid Build Coastguard Worker public static long longField0 = 0; 24*795d594fSAndroid Build Coastguard Worker public static long longField1 = 0; 25*795d594fSAndroid Build Coastguard Worker public static long longField2 = 0; 26*795d594fSAndroid Build Coastguard Worker public static long longField3 = 0; 27*795d594fSAndroid Build Coastguard Worker public static long longField4 = 0; 28*795d594fSAndroid Build Coastguard Worker public static long longField5 = 0; 29*795d594fSAndroid Build Coastguard Worker public static long longField6 = 0; 30*795d594fSAndroid Build Coastguard Worker public static long longField7 = 0; 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.test(long) register (after) 33*795d594fSAndroid Build Coastguard Worker /// CHECK: TypeConversion locations:[#-8690466096623102344]->{{.*}} test(long other)34*795d594fSAndroid Build Coastguard Worker public static int test(long other) { 35*795d594fSAndroid Build Coastguard Worker // To avoid constant folding TypeConversion(const), hide the constant in a field. Then, hide 36*795d594fSAndroid Build Coastguard Worker // it even more inside a Select that can only be reduced after LSE+InstructionSimplifier. We 37*795d594fSAndroid Build Coastguard Worker // don't run constant folding after that. 38*795d594fSAndroid Build Coastguard Worker testField = 0x8765432112345678L; 39*795d594fSAndroid Build Coastguard Worker long value = testField; 40*795d594fSAndroid Build Coastguard Worker if (value + 1 == 0x8765432112345679L) { 41*795d594fSAndroid Build Coastguard Worker value = testField; 42*795d594fSAndroid Build Coastguard Worker } else { 43*795d594fSAndroid Build Coastguard Worker value = other; 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker // Now, the `value` is in a register because of the store but we need 46*795d594fSAndroid Build Coastguard Worker // a constant location to trigger the bug, so load a bunch of other fields. 47*795d594fSAndroid Build Coastguard Worker long l0 = longField0; 48*795d594fSAndroid Build Coastguard Worker long l1 = longField1; 49*795d594fSAndroid Build Coastguard Worker long l2 = longField2; 50*795d594fSAndroid Build Coastguard Worker long l3 = longField3; 51*795d594fSAndroid Build Coastguard Worker long l4 = longField4; 52*795d594fSAndroid Build Coastguard Worker long l5 = longField5; 53*795d594fSAndroid Build Coastguard Worker long l6 = longField6; 54*795d594fSAndroid Build Coastguard Worker long l7 = longField7; 55*795d594fSAndroid Build Coastguard Worker if (l0 != 0 || l1 != 0 || l2 != 0 || l3 != 0 || l4 != 0 || l5 != 0 || l6 != 0 || l7 != 0) { 56*795d594fSAndroid Build Coastguard Worker throw new Error(); 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker // Do the conversion from constant location. 59*795d594fSAndroid Build Coastguard Worker return (int) value; 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker } 62