Package EDU.purdue.cs.bloat.trans
Performs transformations (optimizations) on a control flow graph. There are several optimizations performed by classes in this package. Older Java compilers produced poor code for initializing arrays. BLOAT can replace this poor code with more efficient code by loading the array from the constant pool. Dead code elimination removes code from a method that does not contribute to the final output of the program.
Value numbering associates a number with each expression such that if two expressions have the same number, they have the same value. A value folder is then used to eliminate redundent nodes from and to propagate constants through the control flow graph.
Constant propagation removes unnecessary assignments by replacing variables that are assigned constant values with those values. Copy propagation removes unnecessary assignments to varibles to other variables.
BLOAT was designed to optimize classes that were to be run inside a persistent system that required special opcodes to perform operation such as checking an object cache for a certain resident object. The analysis that BLOAT does can eliminate some of these checks.
SSA-based partial redundency elimination (PRE) of expressions and access paths can also be performed on a control flow graph. If a calculation is redundent along one control flow path leading to a merge point, PRE computes it once along all paths, assigns the result to a variable, and replaces further occurrences of the calculation with that variable. This way, the expression is only computed once along any given control flow path.
Finally, peephole optimizations are performed on Java bytecode. For instance, a push instruction followed by a pop instruction is useless and can be removed. Additionally, unreachable code is removed from the method.
This package also contains several auxiliary classes that perform operations like determining whether or not an expression has side effects and comparing two nodes.
-
ClassesClassDescriptionCompactArrayInitializer optimizes the initialization of arrays by transforming the initialization code into a loop that loads the array elements from a string in the class's constant pool.DeadCodeElimination performs SSA-based dead code elimination as described in [Cytron, et.Performs copy and constant propagation on the blocks in a control flow graph.NodeComparator is a class used to differentiate nodes in an expression tree.Performs some peephole optimizations such as loads and stores and removes unreachable instructions.Attempts to remove residency checks an update checks from a control flow graph.SideEffectChecker traverses a tree and determines is a node has any side effects such as changing the stack, calling a function, or performing a residency check.Perform partial redundancy elimination of a CFG in SSA form using the SSA-based algorithm described in:Eliminate partially redundant local variable loads and stores by replacing them with stack variables and dups.ValueFolding uses a ValueFolder to determine which nodes in an expression tree can be removed or replaced by common expression elimination and constant propagation.Performs value numbering analysis on the nodes in a control flow graph.