Now, after a bit more work since my last post, when I compile the SimpleLisp interpreter, I get the following optimisations applied:
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '161l[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '161l[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '("type error in ""[java.lang.String] ++ (fn[java.lang.String] ++ """[java.lang.String])[java.lang.String])[java.lang.String]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression 'cs[java.lang.Class[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'cs[java.lang.Class[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'es[org.simplelisp.interpreter.LispExpr[]].length[int]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '(!true[boolean])[boolean]' of class jkit.core.FlowGraph$UnOp out of loop.
Factoring expression '(!whitespace[boolean])[boolean]' of class jkit.core.FlowGraph$UnOp out of loop.
Factoring expression '(!whitespace[boolean])[boolean]' of class jkit.core.FlowGraph$UnOp out of loop.
Factoring expression '(!whitespace[boolean])[boolean]' of class jkit.core.FlowGraph$UnOp out of loop.
Factoring expression '(!whitespace[boolean])[boolean]' of class jkit.core.FlowGraph$UnOp out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '17f[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '17f[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].params[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '17f[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '17f[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression 'this[org.simplelisp.interpreter.LispExternal].body[java.util.List]' of class jkit.core.FlowGraph$Deref out of loop.
Factoring expression '(1[int] + this[org.simplelisp.interpreter.LispFunction].numEval[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '(1[int] + this[org.simplelisp.interpreter.LispFunction].numEval[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '5es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '5es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '(l[int] + 6[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '(l[int] + 6[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '13es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '13es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '(l[int] + 6[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '(l[int] + 6[int])[int]' of class jkit.core.FlowGraph$BinOp out of loop.
Factoring expression '13es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Factoring expression '13es[org.simplelisp.interpreter.LispList].size()[int]' of class jkit.core.FlowGraph$Invoke out of loop.
Note that these include some traditional loop invariant code movement optimisations as well as my particular optimisation of pure method calls, as allowed by the more general approach I mentioned recently.
Tags: evaluation, optimisations, purejava, simplelisp, test