java-topology/test/hotspot/jtreg/compiler/c2/gvn/ReverseBytesConstantsTests.java
russell@unturf.com 0a580b313d undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com

Patches, unit tests, benchmarks, whitepaper, and outreach briefs.
Public domain — no copyright claimed. Use freely.
2026-03-26 17:11:57 -04:00

223 lines
7.1 KiB
Java

/*
* 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.
*/
package compiler.c2.gvn;
import compiler.lib.generators.Generators;
import compiler.lib.generators.RestrictableGenerator;
import compiler.lib.ir_framework.DontCompile;
import compiler.lib.ir_framework.IR;
import compiler.lib.ir_framework.IRNode;
import compiler.lib.ir_framework.Run;
import compiler.lib.ir_framework.Test;
import compiler.lib.ir_framework.TestFramework;
import jdk.test.lib.Asserts;
/*
* @test
* @bug 8353551 8359678
* @summary Test that ReverseBytes operations constant-fold.
* @library /test/lib /
* @compile ReverseBytesConstantsHelper.jasm
* @run driver compiler.c2.gvn.ReverseBytesConstantsTests
*/
public class ReverseBytesConstantsTests {
private static final RestrictableGenerator<Integer> GEN_CHAR = Generators.G.safeRestrict(Generators.G.ints(), Character.MIN_VALUE, Character.MAX_VALUE);
private static final char C_CHAR = (char) GEN_CHAR.next().intValue();
private static final RestrictableGenerator<Integer> GEN_SHORT = Generators.G.safeRestrict(Generators.G.ints(), Short.MIN_VALUE, Short.MAX_VALUE);
private static final short C_SHORT = GEN_SHORT.next().shortValue();
private static final RestrictableGenerator<Long> GEN_LONG = Generators.G.longs();
private static final long C_LONG = GEN_LONG.next();
private static final RestrictableGenerator<Integer> GEN_INT = Generators.G.ints();
private static final int C_INT = GEN_INT.next();
public static void main(String[] args) {
TestFramework.runWithFlags("-XX:CompileCommand=inline,compiler.c2.gvn.ReverseBytesConstantsHelper::*");
}
@Run(test = {
"testI1", "testI2", "testI3", "testI4",
"testL1", "testL2", "testL3", "testL4",
"testS1", "testS2", "testS3", "testS4",
"testUS1", "testUS2", "testUS3", "testUS4",
})
public void runMethod() {
assertResultI();
assertResultL();
assertResultS();
assertResultUS();
}
@DontCompile
public void assertResultI() {
Asserts.assertEQ(Integer.reverseBytes(0x04030201), testI1());
Asserts.assertEQ(Integer.reverseBytes(0x50607080), testI2());
Asserts.assertEQ(Integer.reverseBytes(0x80706050), testI3());
Asserts.assertEQ(Integer.reverseBytes(C_INT), testI4());
}
@DontCompile
public void assertResultL() {
Asserts.assertEQ(Long.reverseBytes(0x0807060504030201L), testL1());
Asserts.assertEQ(Long.reverseBytes(0x1020304050607080L), testL2());
Asserts.assertEQ(Long.reverseBytes(0x8070605040302010L), testL3());
Asserts.assertEQ(Long.reverseBytes(C_LONG), testL4());
}
@DontCompile
public void assertResultS() {
Asserts.assertEQ(Short.reverseBytes((short) 0x0201), testS1());
Asserts.assertEQ(Short.reverseBytes((short) 0x7080), testS2());
Asserts.assertEQ(Short.reverseBytes((short) 0x8070), testS3());
Asserts.assertEQ(Short.reverseBytes(C_SHORT), testS4());
}
@DontCompile
public void assertResultUS() {
Asserts.assertEQ(Character.reverseBytes((char) 0x0201), testUS1());
Asserts.assertEQ(Character.reverseBytes((char) 0x7080), testUS2());
Asserts.assertEQ(Character.reverseBytes((char) 0x8070), testUS3());
Asserts.assertEQ(Character.reverseBytes(C_CHAR), testUS4());
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_I})
public int testI1() {
return Integer.reverseBytes(0x04030201);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_I})
public int testI2() {
return Integer.reverseBytes(0x50607080);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_I})
public int testI3() {
return Integer.reverseBytes(0x80706050);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_I})
public int testI4() {
return Integer.reverseBytes(C_INT);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_L})
public long testL1() {
return Long.reverseBytes(0x0807060504030201L);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_L})
public long testL2() {
return Long.reverseBytes(0x1020304050607080L);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_L})
public long testL3() {
return Long.reverseBytes(0x8070605040302010L);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_L})
public long testL4() {
return Long.reverseBytes(C_LONG);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S})
public short testS1() {
return Short.reverseBytes((short) 0x0201);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S})
public short testS2() {
return Short.reverseBytes((short) 0x7080);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S})
public short testS3() {
return Short.reverseBytes((short) 0x8070);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S})
public short testS4() {
return Short.reverseBytes(C_SHORT);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S, IRNode.CALL})
public short testS5() {
return ReverseBytesConstantsHelper.reverseBytesShort(C_INT);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_S, IRNode.CALL})
public short testS6() {
return ReverseBytesConstantsHelper.reverseBytesShort(C_CHAR);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US})
public char testUS1() {
return Character.reverseBytes((char) 0x0201);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US})
public char testUS2() {
return Character.reverseBytes((char) 0x7080);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US})
public char testUS3() {
return Character.reverseBytes((char) 0x8070);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US})
public char testUS4() {
return Character.reverseBytes(C_CHAR);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US, IRNode.CALL})
public char testUS5() {
return ReverseBytesConstantsHelper.reverseBytesChar(C_INT);
}
@Test
@IR(failOn = {IRNode.REVERSE_BYTES_US, IRNode.CALL})
public char testUS6() {
return ReverseBytesConstantsHelper.reverseBytesChar(C_SHORT);
}
}