Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GWT cannot optimize switched expressions #10005

Open
natros opened this issue Sep 28, 2024 · 1 comment
Open

GWT cannot optimize switched expressions #10005

natros opened this issue Sep 28, 2024 · 1 comment

Comments

@natros
Copy link
Contributor

natros commented Sep 28, 2024

GWT version: HEAD-SNAPSHOT
Java Version: 17


Description

For some reason GWT cannot compile the following code

Steps to reproduce
public class Basic implements EntryPoint {
  @Override
  public void onModuleLoad() {
    getKind(Kind.A);
  }

  private static String getKind(Kind kind) {
    return switch (kind) {
      case A -> "1";
      case B -> "2";
      case C -> "3";
      case D -> "4";
      case E -> "5";
      case F -> "6";
      case G -> "7";
      case H -> "8";
      case I -> "9";
      case J -> "10";
      case K -> "11";
      case L -> "12";
      case M -> "13";
      case N -> "14";
      case O -> "15";
    };
  }
}
Output
Compiling module it.pkg.Basic
   Compiling 2 permutations
      Compiling permutation 0...
      [ERROR] An internal compiler exception occurred
com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
	at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:111)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:130)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
	at com.google.gwt.dev.jjs.impl.CloneExpressionVisitor.cloneExpression(CloneExpressionVisitor.java:78)
	at com.google.gwt.dev.jjs.impl.MethodInliner$InliningVisitor.extractExpressionsFromBody(MethodInliner.java:265)
	at com.google.gwt.dev.jjs.impl.MethodInliner$InliningVisitor.tryInlineMethodCall(MethodInliner.java:147)
	at com.google.gwt.dev.jjs.impl.MethodInliner$InliningVisitor.endVisit(MethodInliner.java:112)
	at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:268)
	at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
	at com.google.gwt.dev.jjs.ast.JExpressionStatement.traverse(JExpressionStatement.java:42)
	at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88)
	at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331)
	at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:94)
	at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:135)
	at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:83)
	at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
	at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:786)
	at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:778)
	at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
	at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
	at com.google.gwt.dev.jjs.impl.FullOptimizerContext.traverse(FullOptimizerContext.java:224)
	at com.google.gwt.dev.jjs.impl.MethodInliner.execImpl(MethodInliner.java:611)
	at com.google.gwt.dev.jjs.impl.MethodInliner.exec(MethodInliner.java:588)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.optimizeJavaOneTime(JavaToJavaScriptCompiler.java:1514)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.optimizeJavaToFixedPoint(JavaToJavaScriptCompiler.java:1443)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.optimizeJava(JavaToJavaScriptCompiler.java:525)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:362)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:274)
	at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
	at com.google.gwt.dev.ThreadedPermutationWorkerFactory$ThreadedPermutationWorker.compile(ThreadedPermutationWorkerFactory.java:50)
	at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.UnsupportedOperationException: switch expression cannot be cloned
	at com.google.gwt.dev.jjs.impl.CloneExpressionVisitor.visit(CloneExpressionVisitor.java:261)
	at com.google.gwt.dev.jjs.ast.JSwitchExpression.traverse(JSwitchExpression.java:50)
	at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
	... 40 more
         [ERROR] at Basic.java(12): switch (Enum.$ordinal(kind))  {
  case Enum.$ordinal(Kind.A):
  yield  "1";
  case Enum.$ordinal(Kind.B):
  yield  "2";
  case Enum.$ordinal(Kind.C):
  yield  "3";
  case Enum.$ordinal(Kind.D):
  yield  "4";
  case Enum.$ordinal(Kind.E):
  yield  "5";
  case Enum.$ordinal(Kind.F):
  yield  "6";
  case Enum.$ordinal(Kind.G):
  yield  "7";
  case Enum.$ordinal(Kind.H):
  yield  "8";
  case Enum.$ordinal(Kind.I):
  yield  "9";
  case Enum.$ordinal(Kind.J):
  yield  "10";
  case Enum.$ordinal(Kind.K):
  yield  "11";
  case Enum.$ordinal(Kind.L):
  yield  "12";
  case Enum.$ordinal(Kind.M):
  yield  "13";
  case Enum.$ordinal(Kind.N):
  yield  "14";
  case Enum.$ordinal(Kind.O):
  yield  "15";
}
            com.google.gwt.dev.jjs.ast.JSwitchExpression
         [ERROR] at Basic.java(8): Basic.getKind(Kind.A)
            com.google.gwt.dev.jjs.ast.JMethodCall
         [ERROR] at Basic.java(8): Basic.getKind(Kind.A)
            com.google.gwt.dev.jjs.ast.JExpressionStatement
         [ERROR] at Basic.java(7): {
  Basic.getKind(Kind.A);
}
            com.google.gwt.dev.jjs.ast.JBlock
         [ERROR] at Basic.java(7): {
  Basic.getKind(Kind.A);
}
            com.google.gwt.dev.jjs.ast.JMethodBody
         [ERROR] at Basic.java(7): it.pkg.client.Basic.onModuleLoad()V
            com.google.gwt.dev.jjs.ast.JMethod
      [ERROR] Unrecoverable exception, shutting down
com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
	at com.google.gwt.dev.javac.CompilationProblemReporter.logAndTranslateException(CompilationProblemReporter.java:106)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:461)
	at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:274)
	at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
	at com.google.gwt.dev.ThreadedPermutationWorkerFactory$ThreadedPermutationWorker.compile(ThreadedPermutationWorkerFactory.java:50)
	at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
	at java.base/java.lang.Thread.run(Thread.java:840)
      [ERROR] Not all permutation were compiled , completed (0/2)
Known workarounds

-optimize=0

@jnehlmeier
Copy link
Member

You should be able to forbid inlining the method in question using javaemul.internal.annotations.DoNotInline annotation as a workaround and still use a higher optimize level.

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

No branches or pull requests

2 participants