What Optimizing Compilers Cannot DoWhat Optimizing Compilers Can DoRemove unused methods and classesIncrease statically bound callsCut dead code and unnecessary instructions, including checks for nullUse computationally cheaper alternatives (strength reduction)Replace runtime computations with compiled resultsRemove unused fieldsRemove unnecessary parts of compiled filesReduce necessary parts of compiled filesAlter access control to speed up invocationsInline callsRemove dynamic type checksUnroll loopsCode motionEliminate common subexpressionsEliminate unnecessary assignmentsRename classes, fields, and methodsReorder or change bytecodesGenerate information to help a VMManaging Compilers