2011-05-18 21:40:04 +00:00
|
|
|
//===- 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) {
|
2011-05-20 09:20:25 +00:00
|
|
|
return flags & OptimizationLevelMask;
|
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
/// Returns the maximum optimization level for this set of flags
|
|
|
|
static unsigned MaxOptimizationLevel(unsigned flags) {
|
2011-05-20 09:20:25 +00:00
|
|
|
return (flags & MaxOptimizationLevelMask) >> 4;
|
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
/// 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)
|
2011-05-20 09:20:25 +00:00
|
|
|
| ((disallowedFlags<<DisallowedFlagShift) & DisallowedFlagMask));
|
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
/// Returns the flags that must be set for this to match
|
|
|
|
static unsigned RequiredFlags(unsigned flags) {
|
2011-05-20 09:20:25 +00:00
|
|
|
return (flags & RequiredFlagMask) >> RequiredFlagShift;
|
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
/// Returns the flags that must not be set for this to match
|
|
|
|
static unsigned DisallowedFlags(unsigned flags) {
|
2011-05-20 09:20:25 +00:00
|
|
|
return (flags & DisallowedFlagMask) >> DisallowedFlagShift;
|
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
/// 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);
|
2011-05-20 09:20:25 +00:00
|
|
|
}
|
2011-05-18 21:40:04 +00:00
|
|
|
};
|
|
|
|
/// 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
|