RFR: 8359412: Template-Framework Library: Operations and Expressions
Manuel Hässig
mhaessig at openjdk.org
Wed Sep 17 14:32:37 UTC 2025
On Thu, 21 Aug 2025 15:03:57 GMT, Emanuel Peter <epeter at openjdk.org> wrote:
> Impliementing ideas from original draft PR: https://github.com/openjdk/jdk/pull/23418 ([Exceptions](https://github.com/openjdk/jdk/pull/23418/files#diff-77e7db8cc0c5e02786e1c993362f98fabe219042eb342fdaffc09fd11380259dR41), [ExpressionFuzzer](https://github.com/openjdk/jdk/pull/23418/files#diff-01844ca5cb007f5eab5fa4195f2f1378d4e7c64ba477fba64626c98ff4054038R66)).
>
> Specifically, I'm extending the Template Library with `Expression`s, and lists of `Operations` (some basic Expressions). These Expressions can easily be nested and then filled with arguments, and applied in a `Template`.
>
> Details, in **order you should review**:
> - `Operations.java`: maps lots of primitive operators as Expressions.
> - `Expression.java`: the fundamental engine behind Expressions.
> - `examples/TestExpressions.java`: basic example using Expressions, filling them with random constants.
> - `tests/TestExpression.java`: correctness test of Expression machinery.
> - `compiler/igvn/ExpressionFuzzer.java`: expression fuzzer for primitive type expressions, including input range/bits constraints and output range/bits verification.
> - `PrimitiveType.java`: added `LibraryRNG` facility. We already had `type.con()` which gave us random constants. But we also want to have `type.callLibraryRNG()` so that we can insert a call to a random number generator of the corresponding primitive type. I use this facility in the `ExpressionFuzzer.java` to generate random arguments for the expressions.
> - `examples/TestPrimitiveTypes.java`: added a `LibraryRNG` example, that tests that has a weak test for randomness: we should have at least 2 different value in 1000 calls.
>
> If the reviewers absolutely insist, I could split out `LibraryRNG` into a separate RFE. But it's really not that much code, and has direct use in the `Expression` examples.
>
> **Future Work**:
> - Use `Expression`s in a loop over arrays / MemorySegment: fuzz auto-vectorization.
> - Use `Expression`s to model more operations:
> - `Vector API`, more arithmetic operations like from `Math` classes etc.
> - Ensure that the constraints / checksum mechanic in `compiler/igvn/ExpressionFuzzer.java` work, using IR rules. We may even need to add new IGVN optimizations. Add unsigned constraints.
> - Find a way to delay IGVN optimizations to test worklist notification: For example, we could add a new testing operator call `TestUtils.delay(x) -> x`, which is intrinsified as some new `DelayNode` that in normal circumstances just folds away, but under `StressIGVN` and `Stres...
Thank you for this enhancement, @eme64! It is nice to see the template framework library evolving.
The changes look good. I mostly have nits.
test/hotspot/jtreg/compiler/igvn/ExpressionFuzzer.java line 31:
> 29: * @library /test/lib /
> 30: * @compile ../lib/verify/Verify.java
> 31: * @run main compiler.igvn.ExpressionFuzzer
Since you are fuzzing, you might want to consider adding a compile task timeout in case the random methods cause degenerate compilations. Below is a suggestion for a timeout of 10 seconds, which should be plenty.
Suggestion:
* @run main -XX:+IgnoreUnrecognizedVMOptions -XX:CompileTaskTimeout=10000 compiler.igvn.ExpressionFuzzer
test/hotspot/jtreg/compiler/igvn/ExpressionFuzzer.java line 204:
> 202: // once, and pass the same values into both the compiled and reference method.
> 203: var valueTemplate = Template.make("name", "type", (String name, CodeGenerationDataNameType type) -> body(
> 204: //"#type #name = ", type.con(), ";\n"
Suggestion:
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 40:
> 38: /**
> 39: * {@link Expression}s model Java expressions, that have a list of arguments with specified
> 40: * argument types, and an result with a specified result type. Once can {@link #make} a new
Suggestion:
* argument types, and a result with a specified result type. Once can {@link #make} a new
Nit: typo
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 152:
> 150:
> 151: /**
> 152: * Creates a new Espression with 1 arguments.
For every make(): s/Espression/Expression/
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 164:
> 162: CodeGenerationDataNameType t0,
> 163: String s1) {
> 164: return new Expression(returnType, List.of(t0), List.of(s0, s1), new Info());
To reduce code duplication, the methods without an additional info should probably use the ones with.
Suggestion:
return make(returnType, s0, t0, s1, new Info());
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 358:
> 356: tokens.add(arguments.get(i));
> 357: }
> 358: tokens.add(strings.get(strings.size()-1));
Suggestion:
tokens.add(strings.getLast());
A wee bit easier to read.
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 380:
> 378: }
> 379: sb.append("\"");
> 380: sb.append(this.strings.get(this.strings.size()-1));
Suggestion:
sb.append(this.strings.getLast());
test/hotspot/jtreg/compiler/lib/template_framework/library/Expression.java line 465:
> 463: newArgumentTypes.add(nestingExpression.argumentTypes.get(i));
> 464: }
> 465: newStrings.add(nestingExpression.strings.get(nestingExpression.strings.size() - 1) +
Suggestion:
newStrings.add(nestingExpression.strings.getLast() +
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 1:
> 1: /*
I gave it my best shot to suggest a reasonable and reasonably consistent alignment.
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 67:
> 65: ops.add(Expression.make(BYTES, "(byte)(", LONGS, ")"));
> 66: ops.add(Expression.make(BYTES, "(byte)(", FLOATS, ")"));
> 67: ops.add(Expression.make(BYTES, "(byte)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(BYTES, "(byte)(", BYTES, ")"));
ops.add(Expression.make(BYTES, "(byte)(", SHORTS, ")"));
ops.add(Expression.make(BYTES, "(byte)(", CHARS, ")"));
ops.add(Expression.make(BYTES, "(byte)(", INTS, ")"));
ops.add(Expression.make(BYTES, "(byte)(", LONGS, ")"));
ops.add(Expression.make(BYTES, "(byte)(", FLOATS, ")"));
ops.add(Expression.make(BYTES, "(byte)(", DOUBLES, ")"));
Whitespace example
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 78:
> 76: ops.add(Expression.make(INTS, "Byte.compareUnsigned(", BYTES, ", ", BYTES, ")"));
> 77: ops.add(Expression.make(INTS, "Byte.toUnsignedInt(", BYTES, ")"));
> 78: ops.add(Expression.make(LONGS, "Byte.toUnsignedLong(", BYTES, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Byte.compare(", BYTES, ", ", BYTES, ")"));
ops.add(Expression.make(INTS, "Byte.compareUnsigned(", BYTES, ", ", BYTES, ")"));
ops.add(Expression.make(INTS, "Byte.toUnsignedInt(", BYTES, ")"));
ops.add(Expression.make(LONGS, "Byte.toUnsignedLong(", BYTES, ")"));
Alignment
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 87:
> 85: ops.add(Expression.make(CHARS, "(char)(", LONGS, ")"));
> 86: ops.add(Expression.make(CHARS, "(char)(", FLOATS, ")"));
> 87: ops.add(Expression.make(CHARS, "(char)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(CHARS, "(char)(", BYTES, ")"));
ops.add(Expression.make(CHARS, "(char)(", SHORTS, ")"));
ops.add(Expression.make(CHARS, "(char)(", CHARS, ")"));
ops.add(Expression.make(CHARS, "(char)(", INTS, ")"));
ops.add(Expression.make(CHARS, "(char)(", LONGS, ")"));
ops.add(Expression.make(CHARS, "(char)(", FLOATS, ")"));
ops.add(Expression.make(CHARS, "(char)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 96:
> 94: // ------------ Character -------------
> 95: ops.add(Expression.make(INTS, "Character.compare(", CHARS, ", ", CHARS, ")"));
> 96: ops.add(Expression.make(CHARS, "Character.reverseBytes(", CHARS, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Character.compare(", CHARS, ", ", CHARS, ")"));
ops.add(Expression.make(CHARS, "Character.reverseBytes(", CHARS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 105:
> 103: ops.add(Expression.make(SHORTS, "(short)(", LONGS, ")"));
> 104: ops.add(Expression.make(SHORTS, "(short)(", FLOATS, ")"));
> 105: ops.add(Expression.make(SHORTS, "(short)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(SHORTS, "(short)(", BYTES, ")"));
ops.add(Expression.make(SHORTS, "(short)(", SHORTS, ")"));
ops.add(Expression.make(SHORTS, "(short)(", CHARS, ")"));
ops.add(Expression.make(SHORTS, "(short)(", INTS, ")"));
ops.add(Expression.make(SHORTS, "(short)(", LONGS, ")"));
ops.add(Expression.make(SHORTS, "(short)(", FLOATS, ")"));
ops.add(Expression.make(SHORTS, "(short)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 117:
> 115: ops.add(Expression.make(SHORTS, "Short.reverseBytes(", SHORTS, ")"));
> 116: ops.add(Expression.make(INTS, "Short.toUnsignedInt(", SHORTS, ")"));
> 117: ops.add(Expression.make(LONGS, "Short.toUnsignedLong(", SHORTS, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Short.compare(", SHORTS, ", ", SHORTS, ")"));
ops.add(Expression.make(INTS, "Short.compareUnsigned(", SHORTS, ", ", SHORTS, ")"));
ops.add(Expression.make(SHORTS, "Short.reverseBytes(", SHORTS, ")"));
ops.add(Expression.make(INTS, "Short.toUnsignedInt(", SHORTS, ")"));
ops.add(Expression.make(LONGS, "Short.toUnsignedLong(", SHORTS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 126:
> 124: ops.add(Expression.make(INTS, "(int)(", LONGS, ")"));
> 125: ops.add(Expression.make(INTS, "(int)(", FLOATS, ")"));
> 126: ops.add(Expression.make(INTS, "(int)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(INTS, "(int)(", BYTES, ")"));
ops.add(Expression.make(INTS, "(int)(", SHORTS, ")"));
ops.add(Expression.make(INTS, "(int)(", CHARS, ")"));
ops.add(Expression.make(INTS, "(int)(", INTS, ")"));
ops.add(Expression.make(INTS, "(int)(", LONGS, ")"));
ops.add(Expression.make(INTS, "(int)(", FLOATS, ")"));
ops.add(Expression.make(INTS, "(int)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 137:
> 135: ops.add(Expression.make(INTS, "(", INTS, " * ", INTS, ")"));
> 136: ops.add(Expression.make(INTS, "(", INTS, " / ", INTS, ")", withArithmeticException));
> 137: ops.add(Expression.make(INTS, "(", INTS, " % ", INTS, ")", withArithmeticException));
Suggestion:
ops.add(Expression.make(INTS, "(-(", INTS, "))"));
ops.add(Expression.make(INTS, "(", INTS, " + ", INTS, ")"));
ops.add(Expression.make(INTS, "(", INTS, " - ", INTS, ")"));
ops.add(Expression.make(INTS, "(", INTS, " * ", INTS, ")"));
ops.add(Expression.make(INTS, "(", INTS, " / ", INTS, ")", withArithmeticException));
ops.add(Expression.make(INTS, "(", INTS, " % ", INTS, ")", withArithmeticException));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 154:
> 152: ops.add(Expression.make(BOOLEANS, "(", INTS, " < ", INTS, ")"));
> 153: ops.add(Expression.make(BOOLEANS, "(", INTS, " >= ", INTS, ")"));
> 154: ops.add(Expression.make(BOOLEANS, "(", INTS, " <= ", INTS, ")"));
Suggestion:
ops.add(Expression.make(BOOLEANS, "(", INTS, " == ", INTS, ")"));
ops.add(Expression.make(BOOLEANS, "(", INTS, " != ", INTS, ")"));
ops.add(Expression.make(BOOLEANS, "(", INTS, " > ", INTS, ")"));
ops.add(Expression.make(BOOLEANS, "(", INTS, " < ", INTS, ")"));
ops.add(Expression.make(BOOLEANS, "(", INTS, " >= ", INTS, ")"));
ops.add(Expression.make(BOOLEANS, "(", INTS, " <= ", INTS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 176:
> 174: ops.add(Expression.make(INTS, "Integer.signum(", INTS, ")"));
> 175: ops.add(Expression.make(INTS, "Integer.sum(", INTS, ", ", INTS, ")"));
> 176: ops.add(Expression.make(LONGS, "Integer.toUnsignedLong(", INTS, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Integer.bitCount(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.compare(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.compareUnsigned(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.compress(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.divideUnsigned(", INTS, ", ", INTS, ")", withArithmeticException));
ops.add(Expression.make(INTS, "Integer.expand(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.highestOneBit(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.lowestOneBit(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.max(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.min(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.numberOfLeadingZeros(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.numberOfTrailingZeros(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.remainderUnsigned(", INTS, ", ", INTS, ")", withArithmeticException));
ops.add(Expression.make(INTS, "Integer.reverse(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.reverseBytes(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.rotateLeft(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.rotateRight(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.signum(", INTS, ")"));
ops.add(Expression.make(INTS, "Integer.sum(", INTS, ", ", INTS, ")"));
ops.add(Expression.make(LONGS, "Integer.toUnsignedLong(", INTS, ")"));
Also aligning the arguments might be a bit much...
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 185:
> 183: ops.add(Expression.make(LONGS, "(long)(", LONGS, ")"));
> 184: ops.add(Expression.make(LONGS, "(long)(", FLOATS, ")"));
> 185: ops.add(Expression.make(LONGS, "(long)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(LONGS, "(long)(", BYTES, ")"));
ops.add(Expression.make(LONGS, "(long)(", SHORTS, ")"));
ops.add(Expression.make(LONGS, "(long)(", CHARS, ")"));
ops.add(Expression.make(LONGS, "(long)(", INTS, ")"));
ops.add(Expression.make(LONGS, "(long)(", LONGS, ")"));
ops.add(Expression.make(LONGS, "(long)(", FLOATS, ")"));
ops.add(Expression.make(LONGS, "(long)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 196:
> 194: ops.add(Expression.make(LONGS, "(", LONGS, " * ", LONGS, ")"));
> 195: ops.add(Expression.make(LONGS, "(", LONGS, " / ", LONGS, ")", withArithmeticException));
> 196: ops.add(Expression.make(LONGS, "(", LONGS, " % ", LONGS, ")", withArithmeticException));
Suggestion:
ops.add(Expression.make(LONGS, "(-(", LONGS, "))"));
ops.add(Expression.make(LONGS, "(", LONGS, " + ", LONGS, ")"));
ops.add(Expression.make(LONGS, "(", LONGS, " - ", LONGS, ")"));
ops.add(Expression.make(LONGS, "(", LONGS, " * ", LONGS, ")"));
ops.add(Expression.make(LONGS, "(", LONGS, " / ", LONGS, ")", withArithmeticException));
ops.add(Expression.make(LONGS, "(", LONGS, " % ", LONGS, ")", withArithmeticException));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 213:
> 211: ops.add(Expression.make(BOOLEANS, "(", LONGS, " < ", LONGS, ")"));
> 212: ops.add(Expression.make(BOOLEANS, "(", LONGS, " >= ", LONGS, ")"));
> 213: ops.add(Expression.make(BOOLEANS, "(", LONGS, " <= ", LONGS, ")"));
Suggestion:
ops.add(Expression.make(BOOLEANS, "(", LONGS, " == ", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "(", LONGS, " != ", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "(", LONGS, " > ", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "(", LONGS, " < ", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "(", LONGS, " >= ", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "(", LONGS, " <= ", LONGS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 234:
> 232: ops.add(Expression.make(LONGS, "Long.rotateRight(", LONGS, ", ", INTS, ")"));
> 233: ops.add(Expression.make(INTS, "Long.signum(", LONGS, ")"));
> 234: ops.add(Expression.make(LONGS, "Long.sum(", LONGS, ", ", LONGS, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Long.bitCount(", LONGS, ")"));
ops.add(Expression.make(INTS, "Long.compare(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(INTS, "Long.compareUnsigned(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.compress(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.divideUnsigned(", LONGS, ", ", LONGS, ")", withArithmeticException));
ops.add(Expression.make(LONGS, "Long.expand(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.highestOneBit(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.lowestOneBit(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.max(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.min(", LONGS, ", ", LONGS, ")"));
ops.add(Expression.make(INTS, "Long.numberOfLeadingZeros(", LONGS, ")"));
ops.add(Expression.make(INTS, "Long.numberOfTrailingZeros(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.remainderUnsigned(", LONGS, ", ", LONGS, ")", withArithmeticException));
ops.add(Expression.make(LONGS, "Long.reverse(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.reverseBytes(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.rotateLeft(", LONGS, ", ", INTS, ")"));
ops.add(Expression.make(LONGS, "Long.rotateRight(", LONGS, ", ", INTS, ")"));
ops.add(Expression.make(INTS, "Long.signum(", LONGS, ")"));
ops.add(Expression.make(LONGS, "Long.sum(", LONGS, ", ", LONGS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 243:
> 241: ops.add(Expression.make(FLOATS, "(float)(", LONGS, ")"));
> 242: ops.add(Expression.make(FLOATS, "(float)(", FLOATS, ")"));
> 243: ops.add(Expression.make(FLOATS, "(float)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(FLOATS, "(float)(", BYTES, ")"));
ops.add(Expression.make(FLOATS, "(float)(", SHORTS, ")"));
ops.add(Expression.make(FLOATS, "(float)(", CHARS, ")"));
ops.add(Expression.make(FLOATS, "(float)(", INTS, ")"));
ops.add(Expression.make(FLOATS, "(float)(", LONGS, ")"));
ops.add(Expression.make(FLOATS, "(float)(", FLOATS, ")"));
ops.add(Expression.make(FLOATS, "(float)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 254:
> 252: ops.add(Expression.make(FLOATS, "(", FLOATS, " * ", FLOATS, ")"));
> 253: ops.add(Expression.make(FLOATS, "(", FLOATS, " / ", FLOATS, ")"));
> 254: ops.add(Expression.make(FLOATS, "(", FLOATS, " % ", FLOATS, ")"));
Suggestion:
ops.add(Expression.make(FLOATS, "(", FLOATS, " + ", FLOATS, ")"));
ops.add(Expression.make(FLOATS, "(", FLOATS, " - ", FLOATS, ")"));
ops.add(Expression.make(FLOATS, "(", FLOATS, " * ", FLOATS, ")"));
ops.add(Expression.make(FLOATS, "(", FLOATS, " / ", FLOATS, ")"));
ops.add(Expression.make(FLOATS, "(", FLOATS, " % ", FLOATS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 286:
> 284: ops.add(Expression.make(DOUBLES, "(double)(", LONGS, ")"));
> 285: ops.add(Expression.make(DOUBLES, "(double)(", FLOATS, ")"));
> 286: ops.add(Expression.make(DOUBLES, "(double)(", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(DOUBLES, "(double)(", BYTES, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", SHORTS, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", CHARS, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", INTS, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", LONGS, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", FLOATS, ")"));
ops.add(Expression.make(DOUBLES, "(double)(", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 297:
> 295: ops.add(Expression.make(DOUBLES, "(", DOUBLES, " * ", DOUBLES, ")"));
> 296: ops.add(Expression.make(DOUBLES, "(", DOUBLES, " / ", DOUBLES, ")"));
> 297: ops.add(Expression.make(DOUBLES, "(", DOUBLES, " % ", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(DOUBLES, "(-(", DOUBLES, "))"));
ops.add(Expression.make(DOUBLES, "(", DOUBLES, " + ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "(", DOUBLES, " - ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "(", DOUBLES, " * ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "(", DOUBLES, " / ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "(", DOUBLES, " % ", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 318:
> 316: ops.add(Expression.make(DOUBLES, "Double.max(", DOUBLES, ", ", DOUBLES, ")"));
> 317: ops.add(Expression.make(DOUBLES, "Double.min(", DOUBLES, ", ", DOUBLES, ")"));
> 318: ops.add(Expression.make(DOUBLES, "Double.sum(", DOUBLES, ", ", DOUBLES, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Double.compare(", DOUBLES, ", ", DOUBLES, ")"));
ops.add(Expression.make(LONGS, "Double.doubleToLongBits(", DOUBLES, ")"));
// Note: there are multiple NaN values with different bit representations.
ops.add(Expression.make(LONGS, "Double.doubleToRawLongBits(", DOUBLES, ")", withNondeterministicResult));
ops.add(Expression.make(DOUBLES, "Double.longBitsToDouble(", LONGS, ")"));
ops.add(Expression.make(BOOLEANS, "Double.isFinite(", DOUBLES, ")"));
ops.add(Expression.make(BOOLEANS, "Double.isInfinite(", DOUBLES, ")"));
ops.add(Expression.make(BOOLEANS, "Double.isNaN(", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "Double.max(", DOUBLES, ", ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "Double.min(", DOUBLES, ", ", DOUBLES, ")"));
ops.add(Expression.make(DOUBLES, "Double.sum(", DOUBLES, ", ", DOUBLES, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 331:
> 329: ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " || ", BOOLEANS, ")"));
> 330: ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " && ", BOOLEANS, ")"));
> 331: ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " ^ ", BOOLEANS, ")"));
Suggestion:
ops.add(Expression.make(BOOLEANS, "(!(", BOOLEANS, "))"));
ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " || ", BOOLEANS, ")"));
ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " && ", BOOLEANS, ")"));
ops.add(Expression.make(BOOLEANS, "(", BOOLEANS, " ^ ", BOOLEANS, ")"));
test/hotspot/jtreg/compiler/lib/template_framework/library/Operations.java line 337:
> 335: ops.add(Expression.make(BOOLEANS, "Boolean.logicalAnd(", BOOLEANS, ", ", BOOLEANS, ")"));
> 336: ops.add(Expression.make(BOOLEANS, "Boolean.logicalOr(", BOOLEANS, ", ", BOOLEANS, ")"));
> 337: ops.add(Expression.make(BOOLEANS, "Boolean.logicalXor(", BOOLEANS, ", ", BOOLEANS, ")"));
Suggestion:
ops.add(Expression.make(INTS, "Boolean.compare(", BOOLEANS, ", ", BOOLEANS, ")"));
ops.add(Expression.make(BOOLEANS, "Boolean.logicalAnd(", BOOLEANS, ", ", BOOLEANS, ")"));
ops.add(Expression.make(BOOLEANS, "Boolean.logicalOr(", BOOLEANS, ", ", BOOLEANS, ")"));
ops.add(Expression.make(BOOLEANS, "Boolean.logicalXor(", BOOLEANS, ", ", BOOLEANS, ")"));
test/hotspot/jtreg/testlibrary_tests/template_framework/examples/TestExpressions.java line 27:
> 25: * @test
> 26: * @bug 8359412
> 27: * @summary Demonstrate the use of Expressions form the Template Library.
Suggestion:
* @summary Demonstrate the use of Expressions from the Template Library.
Typo
-------------
Changes requested by mhaessig (Committer).
PR Review: https://git.openjdk.org/jdk/pull/26885#pullrequestreview-3233825268
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355431170
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355670847
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355097557
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355135345
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355130769
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355157237
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355161790
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355198561
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355213439
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355218584
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355223397
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355224657
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355226625
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355227306
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355231339
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355232551
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355236084
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355238196
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355246768
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355239424
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355240287
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355241763
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355248929
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355249864
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355251161
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355253694
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355254950
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355258668
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355259835
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355261549
PR Review Comment: https://git.openjdk.org/jdk/pull/26885#discussion_r2355263778
More information about the hotspot-compiler-dev
mailing list