/** * Checks if expression is simple enough to always inline at zero cost. * * @param expr expression to test * @return true when given expression is safe to always inline */ protected boolean isSimpleExpression(Expression expr) { if (expr instanceof ParameterExpression || expr instanceof ConstantExpression) { return true; } if (expr instanceof UnaryExpression) { UnaryExpression una = (UnaryExpression) expr; return una.getNodeType() == ExpressionType.Convert && isSimpleExpression(una.expression); } return false; }
private Expression append_(String name, Expression expression, boolean optimize) { if (isSimpleExpression(expression)) { // already simple; no need to declare a variable or // even to evaluate the expression return expression; } if (optimizing && optimize) { DeclarationStatement decl = getComputedExpression(expression); if (decl != null) { return decl.parameter; } } DeclarationStatement declare = Expressions.declare(Modifier.FINAL, newName(name, optimize), expression); add(declare); return declare.parameter; }
final Slot slot = useCounter.map.get(statement.parameter); int count = slot == null ? Integer.MAX_VALUE - 10 : slot.count; if (count > 1 && isSimpleExpression(statement.initializer)) { && oldStatement instanceof DeclarationStatement && isSafeForReuse((DeclarationStatement) oldStatement) && isSimpleExpression( ((DeclarationStatement) oldStatement).initializer)) {
result = append_(name, ((GotoStatement) statement).expression, optimize); if (isSimpleExpression(result)) {