/* * Copyright (C) 2023 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) { $noinline$testVectorAndNonVector(); } // Before loop optimization we only had an array get. After it, we optimized to also have // VecLoad operations. This happens consistently only for Arm64 when using traditional // vectorization (NEON). Arm32 vectorizes consistently but it also removes the ArrayGet, as does // Arm64 predicated vectorization (SVE) because the scalar tail loop is eliminated. X86/X86_64 // doesn't vectorize consistently (other vectorization tests also ignore x86/x86_64). // TODO: Create equivalent ArrayGet-replacement regression test for SVE, when SVE supports LSE. /// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (before) /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') /// CHECK-DAG: ArrayGet /// CHECK-NOT: VecLoad /// CHECK-FI: /// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (after) /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') /// CHECK-DAG: ArrayGet /// CHECK-DAG: VecLoad /// CHECK-FI: // In LoadStoreElimination both ArrayGet and VecLoad have the same heap location. We will try to // replace the ArrayGet with the constant 0. The crash happens when we want to do the same with // the vector operation, changing the vector operation to a scalar. /// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() load_store_elimination (before) /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') /// CHECK-DAG: VecLoad outer_loop:<> /// CHECK-DAG: ArrayGet outer_loop:<> /// CHECK-EVAL: "<>" == "<>" /// CHECK-FI: private static void $noinline$testVectorAndNonVector() { int[] result = new int[2]; int[] source = new int[12]; // This will get vectorized. for (int i = 0; i < result.length; ++i) { int value = 0; // Always true but needed to repro a crash since we need Phis. if (i + 10 < source.length) { for (int j = 0; j < 10; j++) { value += Math.abs(source[i + j]); } } result[i] = value; } } }