From: Erik B. <eri...@gm...> - 2012-10-04 19:22:41
|
Hi, On 04.10.2012 18:09, abhishek gupta wrote: > 1. I am not able to find out how to use the command line options of > jikes. If their is any tutorial that give us whole idea how to > generate the dumps after the different compilation phase etc ?. > (user guide does not have sufficient information on these things). You can use ./rvm -X:opt:help to print all the options for the optimizing compiler subsystem, but it seems that you already know this. If you want to dump the IR after certain compilation phases, the following options might be interesting to you: print_all_ir print_high print_final_hir print_cfg print_ir_level method_to_print For example, ff you want to dump the IR after every compiler phase but are only interested in method foo, you can use rvm -X:opt:print_all_ir=true -X:method_to_print=foo [rest of arguments] > 2. I am able to generate some dumps but I am not able to understand the > information generated by them. So where I can find out how to > understand different dump information. Have you taken a look at the presentation "Jikes RVM Optimizing Compiler Intermediate Code Representation" by Shane Brewer that is linked from http://jikesrvm.org/Presentations? IIRC it contains explanations for the format of the IR dump output. You can also take a look at the places in the codebase that are used when producing the debug output, e.g. CompilerPhase.dumpIR() and Instruction.toString(). > 3. I would also like to know how can i add new optimizing pass to > jikes. Is there is any tutorial which that can help me to speed my > work.? I don't know of any tutorial but here are some hints that might be useful to you: a) Remember that Jikes RVM is metacircular, i.e. the compilers are used during the build process of the Jikes RVM (e.g. the opt compiler is used to build production and development images). If you do not want a certain region of code to execute when building the VM, you can use VM.runningVM: if (VM.runningVM) { .. some debug output .. } b) Compiler passes are subclasses of CompilerPhase. To add a new compiler pass to the system, you just need to create a new subclass of CompilerPhase and add that class to the OptimizationPlanner. For example, if you want to implement a new high-level optimization, you could create a new compiler phase called NewOptimization and add it to the HIROptimizations: --- a/rvm/src/org/jikesrvm/compilers/opt/driver/OptimizationPlanner.java +++ b/rvm/src/org/jikesrvm/compilers/opt/driver/OptimizationPlanner.java @@ -273,6 +273,8 @@ // Perform local common-subexpression elimination for a // factored basic block. addComponent(p, new LocalCSE(true)); + // Your new compiler phase + addComponent(p, new NewOptimization()); // Flow-insensitive field analysis addComponent(p, new FieldAnalysis()); if (VM.BuildForAdaptiveSystem) { To check that your compiler phase is called, just add some debug code into your implementation of the perform() method. A quick way is to use VM.sysFail(..) to forcefully terminate the VM. You can override the shouldPerform() method to make sure the compiler phase is only called when you want (e.g. not during bootimage writing, only when an option is set, ...). c) Try to make progress in small steps that are easily verifiable. d) The OptTestHarness (see http://www.jikesrvm.org/OptTestHarness) can be useful for testing and debugging. You can also use the OptTestHarness from Java programs that run on the RVM, e.g. unit tests. It's cumbersome because you have to use the command line interface (i.e. main method and string arrays) but it works. e) You should think about an approach to testing your changes. Testing is very important. That's even more true for compilers, which are notoriously buggy because of their complexity. f) The prototype, prototype-opt and development builds do IR verification by default. You can enable more extensive and expensive verification by enabling paranoid IR verification in IR.java. Please don't hesitate to ask if you have more questions. Kind regards, Erik Brangs |