diff options
author | Andrew Trick <atrick@apple.com> | 2012-02-22 21:59:00 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2012-02-22 21:59:00 +0000 |
commit | 8ae3ac7a8c2112ab739b4a0dc24f28b2bbb84117 (patch) | |
tree | 6111cd9ee143e0e5f447d43570e5d00f2e5f1fcf /lib/CodeGen/ScheduleDAGInstrs.h | |
parent | d55a2664f9493a4c3be242a75d339fac0ebe2e21 (diff) | |
download | llvm-8ae3ac7a8c2112ab739b4a0dc24f28b2bbb84117.tar.gz llvm-8ae3ac7a8c2112ab739b4a0dc24f28b2bbb84117.tar.bz2 llvm-8ae3ac7a8c2112ab739b4a0dc24f28b2bbb84117.tar.xz |
misched: Use SparseSet for VRegDegs for constant time clear().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151205 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ScheduleDAGInstrs.h')
-rw-r--r-- | lib/CodeGen/ScheduleDAGInstrs.h | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/lib/CodeGen/ScheduleDAGInstrs.h b/lib/CodeGen/ScheduleDAGInstrs.h index 9a209fff4c..3b450b0de9 100644 --- a/lib/CodeGen/ScheduleDAGInstrs.h +++ b/lib/CodeGen/ScheduleDAGInstrs.h @@ -20,8 +20,8 @@ #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/Support/Compiler.h" #include "llvm/Target/TargetRegisterInfo.h" -#include "llvm/ADT/IndexedMap.h" #include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/SparseSet.h" #include <map> namespace llvm { @@ -125,9 +125,24 @@ namespace llvm { std::vector<std::vector<SUnit *> > Defs; std::vector<std::vector<SUnit *> > Uses; + /// An individual mapping from virtual register number to SUnit. + struct VReg2SUnit { + unsigned VirtReg; + SUnit *SU; + + VReg2SUnit(unsigned reg, SUnit *su): VirtReg(reg), SU(su) {} + + unsigned getSparseSetKey() const { + return TargetRegisterInfo::virtReg2Index(VirtReg); + } + }; + // Use SparseSet as a SparseMap by relying on the fact that it never + // compares ValueT's, only unsigned keys. This allows the set to be cleared + // between scheduling regions in constant time. + typedef SparseSet<VReg2SUnit> VReg2SUnitMap; + // Track the last instructon in this region defining each virtual register. - // FIXME: turn this into a sparse set with constant time clear(). - DenseMap<unsigned, SUnit*> VRegDefs; + VReg2SUnitMap VRegDefs; /// PendingLoads - Remember where unknown loads are after the most recent /// unknown store, as we iterate. As with Defs and Uses, this is here @@ -235,6 +250,10 @@ namespace llvm { void addPhysRegDeps(SUnit *SU, unsigned OperIdx); void addVRegDefDeps(SUnit *SU, unsigned OperIdx); void addVRegUseDeps(SUnit *SU, unsigned OperIdx); + + VReg2SUnitMap::iterator findVRegDef(unsigned VirtReg) { + return VRegDefs.find(TargetRegisterInfo::virtReg2Index(VirtReg)); + } }; } |