--- /dev/null
+//===-- LevelChange.h - Functions for raising/lowering methods ---*- C++ -*--=//
+//
+// This family of functions is useful for changing the 'level' of a method.
+// This can either be raising (converting direct addressing to use getelementptr
+// for structs and arrays), or lowering (for instruction selection).
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OPT_LEVELCHANGE_H
+#define LLVM_OPT_LEVELCHANGE_H
+
+#include "llvm/Module.h"
+#include "llvm/Method.h"
+
+namespace opt {
+ struct Level { // Define a namespace to contain the enum
+ enum ID { // Define an enum of levels to change into
+ Lowest, // The lowest level: ...
+ //...
+
+ Normal, // The level LLVM is assumed to be in
+
+ Simplified, // Elminate silly things like unnecesary casts
+
+ StructureAccess, // Convert pointer addressing to structure getelementptr
+ // instructions.
+
+ ArrayAccess, // Simple direct access through pointers is converted to
+ // array accessors
+
+ InductionVars, // Auxillary induction variables are eliminated by
+ // introducing a cannonical indvar, and making all
+ // others use it. This creates more opportunites to
+ // apply the previous optimizations.
+
+ Highest = InductionVars,
+ };
+ };
+
+ // DoRaiseRepresentation - Raise a method representation to a higher level.
+ // The specific features to add are specified with the ToLevel argument.
+ //
+ bool DoRaiseRepresentation(Method *M, Level::ID ToLevel);
+ bool DoRaiseRepresentation(Module *M, Level::ID ToLevel);
+ static inline bool DoRaiseRepresentation(Method *M) {
+ return DoRaiseRepresentation(M, Level::Highest);
+ }
+ bool DoRaiseRepresentation(Module *M, Level::ID ToLevel);
+ static inline bool DoRaiseRepresentation(Module *M) {
+ return DoRaiseRepresentation(M, Level::Highest);
+ }
+
+ // DoEliminateAuxillaryInductionVariables - Eliminate all aux indvars. This
+ // is one of the transformations performed by DoRaiseRepresentation, that
+ // converts all induction variables to reference a cannonical induction
+ // variable (which starts at 0 and counts by 1).
+ //
+ bool DoEliminateAuxillaryInductionVariables(Method *M);
+ static inline bool DoEliminateAuxillaryInductionVariables(Module *M) {
+ return M->reduceApply(DoEliminateAuxillaryInductionVariables);
+ }
+
+
+ // DoLowerRepresentation - Lower a method representation to a lower level.
+ // The specific features to eliminate are specified with the ToLevel argument.
+ //
+ bool DoLowerRepresentation(Method *M, Level::ID ToLevel);
+ bool DoLowerRepresentation(Module *M, Level::ID ToLevel);
+ static inline bool DoLowerRepresentation(Module *M) {
+ return DoLowerRepresentation(M, Level::Lowest);
+ }
+ static inline bool DoLowerRepresentation(Method *M) {
+ return DoLowerRepresentation(M, Level::Lowest);
+ }
+} // End namespace opt
+
+#endif