blob: fca80fbeda481cc707313beea45c51713f86ac2b [file] [log] [blame]
/*
* 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. Arm32 vectorizes consistently
// but it also removes the ArrayGet. X86/X86_64 doesn't vectorize consistently (other
// vectorization tests also ignore x86/x86_64).
/// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (before)
/// CHECK: ArrayGet
/// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (after)
/// CHECK: ArrayGet
/// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (before)
/// CHECK-NOT: VecLoad
/// CHECK-START-ARM64: void Main.$noinline$testVectorAndNonVector() loop_optimization (after)
/// CHECK: VecLoad
// 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-DAG: VecLoad outer_loop:<<VecBlock:B\d+>>
/// CHECK-DAG: ArrayGet outer_loop:<<ScalarBlock:B\d+>>
/// CHECK-EVAL: "<<VecBlock>>" == "<<ScalarBlock>>"
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;
}
}
}