| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| public class Main { |
| public static void main(String[] args) { |
| System.out.println(test()); |
| } |
| |
| public static long testField = 0; |
| public static long longField0 = 0; |
| public static long longField1 = 0; |
| public static long longField2 = 0; |
| public static long longField3 = 0; |
| public static long longField4 = 0; |
| public static long longField5 = 0; |
| public static long longField6 = 0; |
| public static long longField7 = 0; |
| |
| /// CHECK-START-ARM: int Main.test() register (after) |
| /// CHECK: TypeConversion locations:[#-8690466096623102344]->{{.*}} |
| public static int test() { |
| // To avoid constant folding TypeConversion(const), hide the constant in a field. Then, hide |
| // it even more inside a Select that can only be reduced after LSE+InstructionSelector. We |
| // don't run constant folding after that. |
| testField = 0x8765432112345678L; |
| long value = testField; |
| if (value + 1 == 0x8765432112345679L) { |
| value = testField; |
| } else { |
| value = 0; |
| } |
| // Now, the `value` is in a register because of the store but we need |
| // a constant location to trigger the bug, so load a bunch of other fields. |
| long l0 = longField0; |
| long l1 = longField1; |
| long l2 = longField2; |
| long l3 = longField3; |
| long l4 = longField4; |
| long l5 = longField5; |
| long l6 = longField6; |
| long l7 = longField7; |
| if (l0 != 0 || l1 != 0 || l2 != 0 || l3 != 0 || l4 != 0 || l5 != 0 || l6 != 0 || l7 != 0) { |
| throw new Error(); |
| } |
| // Do the conversion from constant location. |
| return (int) value; |
| } |
| } |