From e965d70a7425bec78620a2ca8bfaca3c392edf6a Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Tue, 18 Jun 2024 16:15:09 +0000 Subject: [PATCH] 8333876: C2 SuperWord: regression after JDK-8325155: failed: internal connection Reviewed-by: kvn, roland --- src/hotspot/share/opto/superword.cpp | 8 +-- .../superword/TestParallelReduction.java | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index 5cd4341c42d..f78a9b63926 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -2755,11 +2755,11 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const { // Reduction: first input is internal connection. if (is_marked_reduction(use) && u_idx == 1) { -#ifdef ASSERT - for (uint i = 1; i < u_pk->size(); i++) { - assert(u_pk->at(i - 1) == u_pk->at(i)->in(1), "internal connection"); + for (uint i = 1; i < u_pk->size(); i++) { + if (u_pk->at(i - 1) != u_pk->at(i)->in(1)) { + return false; // not internally connected } -#endif + } return true; } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java new file mode 100644 index 00000000000..2062469edb0 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.loopopts.superword; + +/* + * @test + * @bug 8333876 + * @summary Test parallel reductions. + * @run main compiler.loopopts.superword.TestParallelReduction + */ + +public class TestParallelReduction { + static int RANGE = 10_000; + + public static void main(String[] args) { + float[] a = new float[RANGE]; + for (int i = 0; i < a.length; i++) { + a[i] = i; + } + + float gold = test(a); + + for (int i = 0; i < 10_000; i++) { + if (test(a) != gold) { + throw new RuntimeException("wrong value"); + } + } + } + + static float test(float[] a) { + float x = 0; + float y = 0; + for (int i = 0; i < a.length; i+=2) { + x += a[i+0]; + y += a[i+1]; + } + return x+y; + } +}