Lower llvm.isunordered(a, b) into a != a | b != b.
[oota-llvm.git] / lib / CodeGen / LiveIntervalAnalysis.h
index de7cc8001f89c96177a3c1622aeff5e2ea637ba8..815600861f52e614a8c030426c30776a2a7c0a58 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
 #define LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
 
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "LiveInterval.h"
 
@@ -44,9 +45,11 @@ namespace llvm {
     typedef std::map<unsigned, LiveInterval> Reg2IntervalMap;
     Reg2IntervalMap r2iMap_;
 
-    typedef std::map<unsigned, unsigned> Reg2RegMap;
+    typedef DenseMap<unsigned> Reg2RegMap;
     Reg2RegMap r2rMap_;
 
+    std::vector<bool> allocatableRegs_;
+
   public:
     struct InstrSlots
     {
@@ -78,8 +81,10 @@ namespace llvm {
       return getBaseIndex(index) + InstrSlots::STORE;
     }
 
-    // FIXME: this should really be a const_iterator
     typedef Reg2IntervalMap::iterator iterator;
+    typedef Reg2IntervalMap::const_iterator const_iterator;
+    const_iterator begin() const { return r2iMap_.begin(); }
+    const_iterator end() const { return r2iMap_.end(); }
     iterator begin() { return r2iMap_.begin(); }
     iterator end() { return r2iMap_.end(); }
     unsigned getNumIntervals() const { return r2iMap_.size(); }
@@ -122,6 +127,9 @@ namespace llvm {
     /// runOnMachineFunction - pass entry point
     virtual bool runOnMachineFunction(MachineFunction&);
 
+    /// print - Implement the dump method.
+    virtual void print(std::ostream &O, const Module* = 0) const;
+
   private:
     /// computeIntervals - compute live intervals
     void computeIntervals();
@@ -156,7 +164,7 @@ namespace llvm {
     /// register classes.  The registers may be either phys or virt regs.
     bool differingRegisterClasses(unsigned RegA, unsigned RegB) const;
 
-    bool overlapsAliases(const LiveInterval *lhs, 
+    bool overlapsAliases(const LiveInterval *lhs,
                          const LiveInterval *rhs) const;
 
     static LiveInterval createInterval(unsigned Reg);
@@ -169,11 +177,11 @@ namespace llvm {
     }
 
     /// rep - returns the representative of this register
-    unsigned rep(unsigned reg) {
-      Reg2RegMap::iterator it = r2rMap_.find(reg);
-      if (it != r2rMap_.end())
-        return it->second = rep(it->second);
-      return reg;
+    unsigned rep(unsigned Reg) {
+      unsigned Rep = r2rMap_[Reg];
+      if (Rep)
+        return r2rMap_[Reg] = rep(Rep);
+      return Reg;
     }
 
     void printRegName(unsigned reg) const;