| //===- 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 |