//===- llvm/DefaultPasses.h - Default Pass Support code --------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // This file defines the infrastructure for registering the standard pass list. // This defines sets of standard optimizations that plugins can modify and // front ends can use. //===----------------------------------------------------------------------===// #ifndef LLVM_DEFAULT_PASS_SUPPORT_H #define LLVM_DEFAULT_PASS_SUPPORT_H namespace llvm { class PassManagerBase; /// Unique identifiers for the default standard passes. The addresses of /// these symbols are used to uniquely identify passes from the default list. namespace DefaultStandardPasses { extern unsigned char AggressiveDCEID; extern unsigned char ArgumentPromotionID; extern unsigned char BasicAliasAnalysisID; extern unsigned char CFGSimplificationID; extern unsigned char ConstantMergeID; extern unsigned char CorrelatedValuePropagationID; extern unsigned char DeadArgEliminationID; extern unsigned char DeadStoreEliminationID; extern unsigned char EarlyCSEID; extern unsigned char FunctionAttrsID; extern unsigned char FunctionInliningID; extern unsigned char GVNID; extern unsigned char GlobalDCEID; extern unsigned char GlobalOptimizerID; extern unsigned char GlobalsModRefID; extern unsigned char IPSCCPID; extern unsigned char IndVarSimplifyID; extern unsigned char InlinerPlaceholderID; extern unsigned char InstructionCombiningID; extern unsigned char JumpThreadingID; extern unsigned char LICMID; extern unsigned char LoopDeletionID; extern unsigned char LoopIdiomID; extern unsigned char LoopRotateID; extern unsigned char LoopUnrollID; extern unsigned char LoopUnswitchID; extern unsigned char MemCpyOptID; extern unsigned char PruneEHID; extern unsigned char ReassociateID; extern unsigned char SCCPID; extern unsigned char ScalarReplAggregatesID; extern unsigned char SimplifyLibCallsID; extern unsigned char StripDeadPrototypesID; extern unsigned char TailCallEliminationID; extern unsigned char TypeBasedAliasAnalysisID; } /// StandardPass - The class responsible for maintaining the lists of standard class StandardPass { friend class RegisterStandardPassLists; public: /// Predefined standard sets of passes enum StandardSet { AliasAnalysis, Function, Module, LTO }; /// Flags to specify whether a pass should be enabled. Passes registered /// with the standard sets may specify a minimum optimization level and one /// or more flags that must be set when constructing the set for the pass to /// be used. enum OptimizationFlags { /// Optimize for size was requested. OptimizeSize = 1<<0, /// Allow passes which may make global module changes. UnitAtATime = 1<<1, /// UnrollLoops - Allow loop unrolling. UnrollLoops = 1<<2, /// Allow library calls to be simplified. SimplifyLibCalls = 1<<3, /// Whether the module may have code using exceptions. HaveExceptions = 1<<4, // Run an inliner pass as part of this set. RunInliner = 1<<5 }; enum OptimizationFlagComponents { /// The low bits are used to store the optimization level. When requesting /// passes, this should store the requested optimisation level. When /// setting passes, this should set the minimum optimization level at which /// the pass will run. OptimizationLevelMask=0xf, /// The maximum optimisation level at which the pass is run. MaxOptimizationLevelMask=0xf0, // Flags that must be set RequiredFlagMask=0xff00, // Flags that may not be set. DisallowedFlagMask=0xff0000, MaxOptimizationLevelShift=4, RequiredFlagShift=8, DisallowedFlagShift=16 }; /// Returns the optimisation level from a set of flags. static unsigned OptimizationLevel(unsigned flags) { return flags & OptimizationLevelMask; } /// Returns the maximum optimization level for this set of flags static unsigned MaxOptimizationLevel(unsigned flags) { return (flags & MaxOptimizationLevelMask) >> 4; } /// Constructs a set of flags from the specified minimum and maximum /// optimisation level static unsigned OptimzationFlags(unsigned minLevel=0, unsigned maxLevel=0xf, unsigned requiredFlags=0, unsigned disallowedFlags=0) { return ((minLevel & OptimizationLevelMask) | ((maxLevel<<MaxOptimizationLevelShift) & MaxOptimizationLevelMask) | ((requiredFlags<<RequiredFlagShift) & RequiredFlagMask) | ((disallowedFlags<<DisallowedFlagShift) & DisallowedFlagMask)); } /// Returns the flags that must be set for this to match static unsigned RequiredFlags(unsigned flags) { return (flags & RequiredFlagMask) >> RequiredFlagShift; } /// Returns the flags that must not be set for this to match static unsigned DisallowedFlags(unsigned flags) { return (flags & DisallowedFlagMask) >> DisallowedFlagShift; } /// Register a standard pass in the specified set. If flags is non-zero, /// then the pass will only be returned when the specified flags are set. template<typename passName> class RegisterStandardPass { public: RegisterStandardPass(StandardSet set, unsigned char *runBefore=0, unsigned flags=0, unsigned char *ID=0) { // Use the pass's ID if one is not specified RegisterDefaultPass(PassInfo::NormalCtor_t(callDefaultCtor<passName>), ID ? ID : (unsigned char*)&passName::ID, runBefore, set, flags); } }; /// Adds the passes from the specified set to the provided pass manager static void AddPassesFromSet(PassManagerBase *PM, StandardSet set, unsigned flags=0, bool VerifyEach=false, Pass *inliner=0); private: /// Registers the default passes. This is set by RegisterStandardPassLists /// and is called lazily. static void (*RegisterDefaultPasses)(void); /// Creates the verifier pass that is inserted when a VerifyEach is passed to /// AddPassesFromSet() static Pass* (*CreateVerifierPass)(void); /// Registers the pass static void RegisterDefaultPass(PassInfo::NormalCtor_t constructor, unsigned char *newPass, unsigned char *oldPass, StandardSet set, unsigned flags=0); }; } // namespace llvm #endif