mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8353266: C2: Wrong execution with Integer.bitCount(int) intrinsic on AArch64
Reviewed-by: aph, thartmann
This commit is contained in:
parent
dbf562c725
commit
be923a8b72
@ -7761,14 +7761,12 @@ instruct popCountI(iRegINoSp dst, iRegIorL2I src, vRegF tmp) %{
|
||||
effect(TEMP tmp);
|
||||
ins_cost(INSN_COST * 13);
|
||||
|
||||
format %{ "movw $src, $src\n\t"
|
||||
"mov $tmp, $src\t# vector (1D)\n\t"
|
||||
format %{ "fmovs $tmp, $src\t# vector (1S)\n\t"
|
||||
"cnt $tmp, $tmp\t# vector (8B)\n\t"
|
||||
"addv $tmp, $tmp\t# vector (8B)\n\t"
|
||||
"mov $dst, $tmp\t# vector (1D)" %}
|
||||
ins_encode %{
|
||||
__ movw($src$$Register, $src$$Register); // ensure top 32 bits 0
|
||||
__ mov($tmp$$FloatRegister, __ D, 0, $src$$Register);
|
||||
__ fmovs($tmp$$FloatRegister, $src$$Register);
|
||||
__ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
|
||||
__ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
|
||||
__ mov($dst$$Register, $tmp$$FloatRegister, __ D, 0);
|
||||
|
||||
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2025, 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8353266
|
||||
* @summary Integer.bitCount modifies input register
|
||||
* @library /test/lib /
|
||||
*
|
||||
* @run main/othervm
|
||||
* -Xbatch
|
||||
* -XX:CompileOnly=compiler.intrinsics.BitCountIAarch64PreservesArgument::test
|
||||
* compiler.intrinsics.BitCountIAarch64PreservesArgument
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8353266
|
||||
* @library /test/lib /
|
||||
*
|
||||
* @run main compiler.intrinsics.BitCountIAarch64PreservesArgument
|
||||
*/
|
||||
|
||||
package compiler.intrinsics;
|
||||
|
||||
import static compiler.lib.generators.Generators.G;
|
||||
|
||||
public class BitCountIAarch64PreservesArgument {
|
||||
static long lFld;
|
||||
static long result;
|
||||
|
||||
public static void main(String[] args) {
|
||||
lFld = 0xfedc_ba98_7654_3210L;
|
||||
for (int i = 0; i < 10_000; i++) {
|
||||
test();
|
||||
if (result != 0xfedc_ba98_7654_3210L) {
|
||||
// Wrongly outputs the cut input 0x7654_3210 == 1985229328
|
||||
throw new RuntimeException("Wrong result. Expected result = " + lFld + "; Actual result = " + result);
|
||||
}
|
||||
}
|
||||
|
||||
lFld = G.longs().next();
|
||||
for (int i = 0; i < 10_000; i++) {
|
||||
test();
|
||||
if (result != lFld) {
|
||||
throw new RuntimeException("Wrong result. Expected result = " + lFld + "; Actual result = " + result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void test() {
|
||||
long x = lFld;
|
||||
try {
|
||||
result = Integer.bitCount((int) x); // Cut input: 0x7654_3210 == 1985229328
|
||||
throw new RuntimeException();
|
||||
} catch (RuntimeException _) {
|
||||
}
|
||||
result = x;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user