if (method.getProgram() != null) { Program program = ProgramUtils.copy(method.getProgram()); MethodOptimizationContextImpl context = new MethodOptimizationContextImpl(method); inlining.apply(program, method.getReference()); new UnusedVariableElimination().optimize(context, program);
Program optimizedProgram = incremental && !noCache && programCache != null ? programCache.get(method.getReference()) : null; MethodOptimizationContextImpl context = new MethodOptimizationContextImpl(method, classSource); if (optimizedProgram == null) { optimizedProgram = ProgramUtils.copy(method.getProgram());
private void inline(ListableClassHolderSource classes, DependencyInfo dependencyInfo) { if (optimizationLevel != TeaVMOptimizationLevel.FULL) { return; } Map<MethodReference, Program> inlinedPrograms = new HashMap<>(); Inlining inlining = new Inlining(); for (String className : classes.getClassNames()) { ClassHolder cls = classes.get(className); for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null) { Program program = ProgramUtils.copy(method.getProgram()); MethodOptimizationContextImpl context = new MethodOptimizationContextImpl(method, classes); inlining.apply(program, method.getReference(), classes, dependencyInfo); new UnusedVariableElimination().optimize(context, program); inlinedPrograms.put(method.getReference(), program); } } if (wasCancelled()) { return; } } for (String className : classes.getClassNames()) { ClassHolder cls = classes.get(className); for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null) { method.setProgram(inlinedPrograms.get(method.getReference())); } } } }
private Program optimizeMethodCacheMiss(MethodHolder method, Program optimizedProgram) { target.beforeOptimizations(optimizedProgram, method); if (optimizedProgram.basicBlockCount() > 0) { MethodOptimizationContextImpl context = new MethodOptimizationContextImpl(method); boolean changed; do { changed = false; for (MethodOptimization optimization : getOptimizations()) { try { changed |= optimization.optimize(context, optimizedProgram); } catch (Exception | AssertionError e) { ListingBuilder listingBuilder = new ListingBuilder(); String listing = listingBuilder.buildListing(optimizedProgram, ""); System.err.println("Error optimizing program for method " + method.getReference() + ":\n" + listing); throw new RuntimeException(e); } } } while (changed); target.afterOptimizations(optimizedProgram, method); if (target.requiresRegisterAllocation()) { RegisterAllocator allocator = new RegisterAllocator(); allocator.allocateRegisters(method.getReference(), optimizedProgram, optimizationLevel == TeaVMOptimizationLevel.SIMPLE); } } return optimizedProgram; }