prog = (Program)prog.accept(new GenerateCopies(varGen));
    public static Program lowerIRToJava(Program prog, boolean libraryFormat,                                        TempVarGen varGen)    {        /* What's the right order for these?  Clearly generic         * things like MakeBodiesBlocks need to happen first.         * I don't think there's actually a problem running         * MoveStreamParameters after DoComplexProp, since         * this introduces only straight assignments which the         * Java front-end can handle.  OTOH,         * MoveStreamParameters introduces references to         * "this", which doesn't exist. */        prog = (Program)prog.accept(new MakeBodiesBlocks());        prog = (Program)prog.accept(new SeparateInitializers());        prog = (Program)prog.accept(new DisambiguateUnaries(varGen));        prog = (Program)prog.accept(new NoRefTypes());        prog = (Program)prog.accept(new NameAnonymousStreams(varGen));        if (!libraryFormat)            prog = (Program)prog.accept(new NoticePhasedFilters());        prog = (Program)prog.accept(new DoComplexProp(varGen));        prog = (Program)prog.accept(new GenerateCopies(varGen));        prog = (Program)prog.accept(new ComplexToStruct());        prog = (Program)prog.accept(new SeparateInitializers());        prog = (Program)prog.accept(new EnqueueToFunction());        prog = (Program)prog.accept(new InsertIODecls(libraryFormat));        prog = (Program)prog.accept(new InsertInitConstructors(varGen));	// separate field initializers after init constructors so that	// constructor doesn't get generated for fields that already	// have an initializer        prog = (Program)prog.accept(new SeparateFieldInitializers());        prog = (Program)prog.accept(new MoveStreamParameters());        prog = (Program)prog.accept(new NameAnonymousFunctions());        prog = (Program)prog.accept(new AssembleInitializers());        prog = (Program)prog.accept(new TrimDumbDeadCode());        return prog;    }