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