Skip to content

Error failed guarantee: DynamicNewArrayNode.element is constant, should have been canonicalized to NewArrayNode #648

Closed
@graemerocher

Description

@graemerocher
Member

I have got basic Micronaut functions (unrelated to issue report #470 which relates to HTTP server apps) working on Graal. The following example shows the steps to get a Micronaut function running as a native image:

https://github.com/graemerocher/micronaut-graal-experiments/tree/master/hello-world-function

However, a more complex example found at https://github.com/micronaut-guides/micronaut-function-aws-lambda/tree/graal

Results in the following error:

error: Error encountered while parsing io.micronaut.inject.annotation.DefaultAnnotationMetadata.lambda$static$2(io.micronaut.core.annotation.AnnotationValue[], java.lang.Class, io.micronaut.core.convert.ConversionContext) 
Parsing context:
	parsing io.micronaut.inject.annotation.DefaultAnnotationMetadata$$Lambda$2156/1329223773.convert(Unknown Source)
	parsing io.micronaut.core.convert.DefaultConversionService.convert(DefaultConversionService.java:125)
	parsing io.micronaut.core.convert.ConversionService.convert(ConversionService.java:105)
	parsing io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1243)
	parsing io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:1727)
	parsing io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1497)
	parsing io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1477)
	parsing io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:505)
	parsing io.micronaut.function.executor.StreamFunctionExecutor.execute(StreamFunctionExecutor.java:83)
	parsing io.micronaut.function.executor.StreamFunctionExecutor.execute(StreamFunctionExecutor.java:64)
	parsing io.micronaut.function.executor.FunctionApplication.lambda$run$0(FunctionApplication.java:63)
	parsing io.micronaut.function.executor.FunctionApplication$$Lambda$1931/1186147400.accept(Unknown Source)
	parsing io.micronaut.function.executor.FunctionApplication.parseData(FunctionApplication.java:97)
	parsing io.micronaut.function.executor.FunctionApplication.run(FunctionApplication.java:61)
	parsing io.micronaut.function.executor.FunctionApplication.main(FunctionApplication.java:51)
	parsing com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:177)
	parsing com.oracle.svm.core.code.CEntryPointCallStubs.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Original error: jdk.vm.ci.common.JVMCIError: failed guarantee: DynamicNewArrayNode.element is constant, should have been canonicalized to NewArrayNode.
	at jdk.vm.ci.common.JVMCIError.guarantee(JVMCIError.java:70)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder$NodeIterator.node(MethodTypeFlowBuilder.java:821)
	at org.graalvm.compiler.phases.graph.PostOrderNodeIterator.apply(PostOrderNodeIterator.java:106)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:396)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:346)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:502)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:174)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

To reproduce the steps are:

git clone https://github.com/micronaut-guides/micronaut-function-aws-lambda.git
cd micronaut-function-aws-lambda/complete/vies-vat-validator
./gradlew run # Don't worry if this fails with an error
./gradlew assemble
./build-native-image.sh

Activity

cstancu

cstancu commented on Aug 31, 2018

@cstancu
Member

@graemerocher did you forget to push build-native-image.sh? Looking at the stack trace I think it is safe to remove the JVMCIError.guarantee() line that causes the issue. That guarantee was just a sanity check that doesn't hold anymore due to changes in DynamicNewArrayNode.canonical().

diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodTypeFlowBuilder.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodTypeFlowBuilder.java
index def40cc..0b34a32 100644
--- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodTypeFlowBuilder.java
+++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodTypeFlowBuilder.java
@@ -826,8 +826,6 @@ public class MethodTypeFlowBuilder {
                 DynamicNewArrayNode node = (DynamicNewArrayNode) n;
                 ValueNode elementType = node.getElementType();
 
-                JVMCIError.guarantee(!elementType.isConstant(), "DynamicNewArrayNode.element is constant, should have been canonicalized to NewArrayNode.");
-
                 /*
                  * Without precise type information the dynamic new array node has to generate a
                  * heap object for each instantiated array type.
graemerocher

graemerocher commented on Sep 3, 2018

@graemerocher
MemberAuthor

@cstancu Sorry missed a step, you have to checkout the graal branch of the repo:

git checkout graal

Does your comment above mean the issue will be resolved in the next version of Graal?

graemerocher

graemerocher commented on Sep 4, 2018

@graemerocher
MemberAuthor

Fixed in 1.0 rc6 it seems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @graemerocher@cstancu

      Issue actions

        Error failed guarantee: DynamicNewArrayNode.element is constant, should have been canonicalized to NewArrayNode · Issue #648 · oracle/graal