1 //===- llvm/DefaultPasses.h - Default Pass Support code --------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 // This file defines the infrastructure for registering the standard pass list.
10 // This defines sets of standard optimizations that plugins can modify and
11 // front ends can use.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_DEFAULT_PASS_SUPPORT_H
15 #define LLVM_DEFAULT_PASS_SUPPORT_H
17 #include "llvm/PassSupport.h"
21 class PassManagerBase;
23 /// Unique identifiers for the default standard passes. The addresses of
24 /// these symbols are used to uniquely identify passes from the default list.
25 namespace DefaultStandardPasses {
26 extern unsigned char AggressiveDCEID;
27 extern unsigned char ArgumentPromotionID;
28 extern unsigned char BasicAliasAnalysisID;
29 extern unsigned char CFGSimplificationID;
30 extern unsigned char ConstantMergeID;
31 extern unsigned char CorrelatedValuePropagationID;
32 extern unsigned char DeadArgEliminationID;
33 extern unsigned char DeadStoreEliminationID;
34 extern unsigned char EarlyCSEID;
35 extern unsigned char FunctionAttrsID;
36 extern unsigned char FunctionInliningID;
37 extern unsigned char GVNID;
38 extern unsigned char GlobalDCEID;
39 extern unsigned char GlobalOptimizerID;
40 extern unsigned char GlobalsModRefID;
41 extern unsigned char IPSCCPID;
42 extern unsigned char IndVarSimplifyID;
43 extern unsigned char InlinerPlaceholderID;
44 extern unsigned char InstructionCombiningID;
45 extern unsigned char JumpThreadingID;
46 extern unsigned char LICMID;
47 extern unsigned char LoopDeletionID;
48 extern unsigned char LoopIdiomID;
49 extern unsigned char LoopRotateID;
50 extern unsigned char LoopUnrollID;
51 extern unsigned char LoopUnswitchID;
52 extern unsigned char MemCpyOptID;
53 extern unsigned char PruneEHID;
54 extern unsigned char ReassociateID;
55 extern unsigned char SCCPID;
56 extern unsigned char ScalarReplAggregatesID;
57 extern unsigned char SimplifyLibCallsID;
58 extern unsigned char StripDeadPrototypesID;
59 extern unsigned char TailCallEliminationID;
60 extern unsigned char TypeBasedAliasAnalysisID;
63 /// StandardPass - The class responsible for maintaining the lists of standard
65 friend class RegisterStandardPassLists;
67 /// Predefined standard sets of passes
74 /// Flags to specify whether a pass should be enabled. Passes registered
75 /// with the standard sets may specify a minimum optimization level and one
76 /// or more flags that must be set when constructing the set for the pass to
78 enum OptimizationFlags {
79 /// Optimize for size was requested.
81 /// Allow passes which may make global module changes.
83 /// UnrollLoops - Allow loop unrolling.
85 /// Allow library calls to be simplified.
86 SimplifyLibCalls = 1<<3,
87 /// Whether the module may have code using exceptions.
88 HaveExceptions = 1<<4,
89 // Run an inliner pass as part of this set.
92 enum OptimizationFlagComponents {
93 /// The low bits are used to store the optimization level. When requesting
94 /// passes, this should store the requested optimisation level. When
95 /// setting passes, this should set the minimum optimization level at which
96 /// the pass will run.
97 OptimizationLevelMask=0xf,
98 /// The maximum optimisation level at which the pass is run.
99 MaxOptimizationLevelMask=0xf0,
100 // Flags that must be set
101 RequiredFlagMask=0xff00,
102 // Flags that may not be set.
103 DisallowedFlagMask=0xff0000,
104 MaxOptimizationLevelShift=4,
106 DisallowedFlagShift=16
108 /// Returns the optimisation level from a set of flags.
109 static unsigned OptimizationLevel(unsigned flags) {
110 return flags & OptimizationLevelMask;
112 /// Returns the maximum optimization level for this set of flags
113 static unsigned MaxOptimizationLevel(unsigned flags) {
114 return (flags & MaxOptimizationLevelMask) >> 4;
116 /// Constructs a set of flags from the specified minimum and maximum
117 /// optimisation level
118 static unsigned OptimzationFlags(unsigned minLevel=0, unsigned maxLevel=0xf,
119 unsigned requiredFlags=0, unsigned disallowedFlags=0) {
120 return ((minLevel & OptimizationLevelMask) |
121 ((maxLevel<<MaxOptimizationLevelShift) & MaxOptimizationLevelMask)
122 | ((requiredFlags<<RequiredFlagShift) & RequiredFlagMask)
123 | ((disallowedFlags<<DisallowedFlagShift) & DisallowedFlagMask));
125 /// Returns the flags that must be set for this to match
126 static unsigned RequiredFlags(unsigned flags) {
127 return (flags & RequiredFlagMask) >> RequiredFlagShift;
129 /// Returns the flags that must not be set for this to match
130 static unsigned DisallowedFlags(unsigned flags) {
131 return (flags & DisallowedFlagMask) >> DisallowedFlagShift;
133 /// Register a standard pass in the specified set. If flags is non-zero,
134 /// then the pass will only be returned when the specified flags are set.
135 template<typename passName>
136 class RegisterStandardPass {
138 RegisterStandardPass(StandardSet set, unsigned char *runBefore=0,
139 unsigned flags=0, unsigned char *ID=0) {
140 // Use the pass's ID if one is not specified
141 RegisterDefaultPass(PassInfo::NormalCtor_t(callDefaultCtor<passName>),
142 ID ? ID : (unsigned char*)&passName::ID, runBefore, set, flags);
145 /// Adds the passes from the specified set to the provided pass manager
146 static void AddPassesFromSet(PassManagerBase *PM,
149 bool VerifyEach=false,
152 /// Registers the default passes. This is set by RegisterStandardPassLists
153 /// and is called lazily.
154 static void (*RegisterDefaultPasses)(void);
155 /// Creates the verifier pass that is inserted when a VerifyEach is passed to
156 /// AddPassesFromSet()
157 static Pass* (*CreateVerifierPass)(void);
158 /// Registers the pass
159 static void RegisterDefaultPass(PassInfo::NormalCtor_t constructor,
160 unsigned char *newPass,
161 unsigned char *oldPass,