Introduce a new SROA implementation.
[oota-llvm.git] / include / llvm / PassSupport.h
index ad6ab754b8a1febb08e810720bdb5eecef6d2462..c50c2cc184e3aebeb6eaa86ea8c2d0e90e6c518d 100644 (file)
 #include "llvm/PassRegistry.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Support/Atomic.h"
+#include "llvm/Support/Valgrind.h"
 #include <vector>
 
 namespace llvm {
 
-  class PassManagerBase;
-
 //===---------------------------------------------------------------------------
 /// PassInfo class - An instance of this class exists for every pass known by
 /// the system, and can be obtained from a live Pass by calling its
@@ -137,7 +136,10 @@ private:
   if (old_val == 0) { \
     function(Registry); \
     sys::MemoryFence(); \
+    TsanIgnoreWritesBegin(); \
+    TsanHappensBefore(&initialized); \
     initialized = 2; \
+    TsanIgnoreWritesEnd(); \
   } else { \
     sys::cas_flag tmp = initialized; \
     sys::MemoryFence(); \
@@ -145,7 +147,8 @@ private:
       tmp = initialized; \
       sys::MemoryFence(); \
     } \
-  }
+  } \
+  TsanHappensAfter(&initialized);
 
 #define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
   static void* initialize##passName##PassOnce(PassRegistry &Registry) { \
@@ -209,149 +212,6 @@ struct RegisterPass : public PassInfo {
   }
 };
 
-  /// 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 DeadTypeEliminationID;
-    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;
-  }
-
-
-class RegisterStandardPass;
-/// RegisterStandardPass - Registers a pass as a member of a standard set.  
-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 OptimizationFlags(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) >> RequiredFlagShift;
-  }
-  /// 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 {
-    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 : &passName::ID, runBefore, set, flags);
-    };
-  };
-  /// Adds the passes from the specified set to a 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);
-  /// Registers the pass
-  static void RegisterDefaultPass(PassInfo::NormalCtor_t constructor,
-                                  unsigned char *newPass,
-                                  unsigned char *oldPass,
-                                  StandardSet set,
-                                  unsigned flags=0);
-};
-
 
 /// RegisterAnalysisGroup - Register a Pass as a member of an analysis _group_.
 /// Analysis groups are used to define an interface (which need not derive from