Skip to content

Commit d514762

Browse files
committed
Permit variadic Object[] operand to Fallback specializations
1 parent eb7fd62 commit d514762

File tree

4 files changed

+46
-20
lines changed

4 files changed

+46
-20
lines changed

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/BytecodeDSLPartialEvaluationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,12 +384,12 @@ public void testVariadicLength() {
384384
b.beginBlock();
385385

386386
b.beginReturn();
387-
b.beginVeryComplexOperation();
387+
b.beginVariadicOperation();
388388
b.emitLoadConstant(3L);
389389
for (int i = 0; i < numVariadic; i++) {
390390
b.emitLoadNull();
391391
}
392-
b.endVeryComplexOperation();
392+
b.endVariadicOperation();
393393
b.endReturn();
394394

395395
b.endBlock();

truffle/src/com.oracle.truffle.api.bytecode.test/src/com/oracle/truffle/api/bytecode/test/basic_interpreter/BasicInterpreter.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,16 @@ public static String addStrings(String lhs, long constantRhs) {
323323
}
324324

325325
@Operation
326-
static final class VeryComplexOperation {
326+
static final class VariadicOperation {
327327
@Specialization
328-
public static long bla(long a1, @Variadic Object[] a2) {
328+
public static long doLong(long a1, @Variadic Object[] a2) {
329329
return a1 + a2.length;
330330
}
331+
332+
@Fallback
333+
public static long doOther(@SuppressWarnings("unused") Object a1, @Variadic Object[] a2) {
334+
return a2.length;
335+
}
331336
}
332337

333338
@Operation

truffle/src/com.oracle.truffle.api.bytecode.test/src/com/oracle/truffle/api/bytecode/test/basic_interpreter/BasicInterpreterTest.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,15 +1857,15 @@ public void testLocalsNonlocalDifferentFrameSizes() {
18571857

18581858
@Test
18591859
public void testVariadicZeroVarargs() {
1860-
// return veryComplex(7);
1860+
// return variadicOperation(7);
18611861

18621862
RootCallTarget root = parse("variadicZeroVarargs", b -> {
18631863
b.beginRoot();
18641864

18651865
b.beginReturn();
1866-
b.beginVeryComplexOperation();
1866+
b.beginVariadicOperation();
18671867
b.emitLoadConstant(7L);
1868-
b.endVeryComplexOperation();
1868+
b.endVariadicOperation();
18691869
b.endReturn();
18701870

18711871
b.endRoot();
@@ -1876,16 +1876,16 @@ public void testVariadicZeroVarargs() {
18761876

18771877
@Test
18781878
public void testVariadicOneVarargs() {
1879-
// return veryComplex(7, "foo");
1879+
// return variadicOperation(7, "foo");
18801880

18811881
RootCallTarget root = parse("variadicOneVarargs", b -> {
18821882
b.beginRoot();
18831883

18841884
b.beginReturn();
1885-
b.beginVeryComplexOperation();
1885+
b.beginVariadicOperation();
18861886
b.emitLoadConstant(7L);
18871887
b.emitLoadConstant("foo");
1888-
b.endVeryComplexOperation();
1888+
b.endVariadicOperation();
18891889
b.endReturn();
18901890

18911891
b.endRoot();
@@ -1896,18 +1896,18 @@ public void testVariadicOneVarargs() {
18961896

18971897
@Test
18981898
public void testVariadicFewVarargs() {
1899-
// return veryComplex(7, "foo", "bar", "baz");
1899+
// return variadicOperation(7, "foo", "bar", "baz");
19001900

19011901
RootCallTarget root = parse("variadicFewVarargs", b -> {
19021902
b.beginRoot();
19031903

19041904
b.beginReturn();
1905-
b.beginVeryComplexOperation();
1905+
b.beginVariadicOperation();
19061906
b.emitLoadConstant(7L);
19071907
b.emitLoadConstant("foo");
19081908
b.emitLoadConstant("bar");
19091909
b.emitLoadConstant("baz");
1910-
b.endVeryComplexOperation();
1910+
b.endVariadicOperation();
19111911
b.endReturn();
19121912

19131913
b.endRoot();
@@ -1918,18 +1918,18 @@ public void testVariadicFewVarargs() {
19181918

19191919
@Test
19201920
public void testVariadicManyVarargs() {
1921-
// return veryComplex(7, [1330 args]);
1921+
// return variadicOperation(7, [1330 args]);
19221922

19231923
RootCallTarget root = parse("variadicManyVarArgs", b -> {
19241924
b.beginRoot();
19251925

19261926
b.beginReturn();
1927-
b.beginVeryComplexOperation();
1927+
b.beginVariadicOperation();
19281928
b.emitLoadConstant(7L);
19291929
for (int i = 0; i < 1330; i++) {
19301930
b.emitLoadConstant("test");
19311931
}
1932-
b.endVeryComplexOperation();
1932+
b.endVariadicOperation();
19331933
b.endReturn();
19341934

19351935
b.endRoot();
@@ -1938,15 +1938,36 @@ public void testVariadicManyVarargs() {
19381938
assertEquals(1337L, root.call());
19391939
}
19401940

1941+
public void testVariadicFallback() {
1942+
// return variadicOperation(arg0, arg1, arg2);
1943+
1944+
RootCallTarget root = parse("variadicFallback", b -> {
1945+
b.beginRoot();
1946+
1947+
b.beginReturn();
1948+
b.beginVariadicOperation();
1949+
b.emitLoadArgument(0);
1950+
b.emitLoadArgument(1);
1951+
b.emitLoadArgument(2);
1952+
b.endVariadicOperation();
1953+
b.endReturn();
1954+
1955+
b.endRoot();
1956+
});
1957+
1958+
assertEquals(42L, root.call(40L, "foo", "bar"));
1959+
assertEquals(2L, root.call("foo", "bar", "baz"));
1960+
}
1961+
19411962
@Test
19421963
public void testVariadicTooFewArguments() {
1943-
assertThrowsWithMessage("Operation VeryComplexOperation expected at least 1 child, but 0 provided. This is probably a bug in the parser.", IllegalStateException.class, () -> {
1964+
assertThrowsWithMessage("Operation VariadicOperation expected at least 1 child, but 0 provided. This is probably a bug in the parser.", IllegalStateException.class, () -> {
19441965
parse("variadicTooFewArguments", b -> {
19451966
b.beginRoot();
19461967

19471968
b.beginReturn();
1948-
b.beginVeryComplexOperation();
1949-
b.endVeryComplexOperation();
1969+
b.beginVariadicOperation();
1970+
b.endVariadicOperation();
19501971
b.endReturn();
19511972

19521973
b.endRoot();

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/bytecode/parser/SpecializationSignatureParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public SpecializationSignature parse(ExecutableElement specialization, MessageCo
156156
* synthesize our own execute method that only takes Object arguments, fallback
157157
* specializations with non-Object parameters are unsupported.
158158
*/
159-
if (!isObject(dynamicOperand.asType())) {
159+
if (!isObject(dynamicOperand.asType()) && !isVariadic(dynamicOperand)) {
160160
if (errorTarget != null) {
161161
errorTarget.addError(dynamicOperand, "Operands to @%s specializations of Operation nodes must have type %s.",
162162
getSimpleName(types.Fallback),

0 commit comments

Comments
 (0)