diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-29 23:40:02 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-29 23:40:02 +0000 |
commit | 96feada378dc9769644333ca9670b265fd15a2ef (patch) | |
tree | 2eccfe9877205be0e0f7f52ebcceb1772f9abe82 /include/llvm/Target/TargetRegisterInfo.h | |
parent | f52baf72c116d9cf8680d25a8e751ce354c7d44b (diff) | |
download | external_llvm-96feada378dc9769644333ca9670b265fd15a2ef.tar.gz external_llvm-96feada378dc9769644333ca9670b265fd15a2ef.tar.bz2 external_llvm-96feada378dc9769644333ca9670b265fd15a2ef.zip |
Use MCRegUnitIterator to compute regsOverlap().
The register unit lists are typically much shorter than the register
overlap lists, and the backing table for register units has better cache
locality because it is smaller.
This makes llc about 0.5% faster. The regsOverlap() function isn't that hot.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157651 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Target/TargetRegisterInfo.h')
-rw-r--r-- | include/llvm/Target/TargetRegisterInfo.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/include/llvm/Target/TargetRegisterInfo.h b/include/llvm/Target/TargetRegisterInfo.h index 7e73db3a44..949fce8461 100644 --- a/include/llvm/Target/TargetRegisterInfo.h +++ b/include/llvm/Target/TargetRegisterInfo.h @@ -337,9 +337,15 @@ public: if (regA == regB) return true; if (isVirtualRegister(regA) || isVirtualRegister(regB)) return false; - for (const uint16_t *regList = getOverlaps(regA)+1; *regList; ++regList) { - if (*regList == regB) return true; - } + + // Regunits are numerically ordered. Find a common unit. + MCRegUnitIterator RUA(regA, this); + MCRegUnitIterator RUB(regB, this); + do { + if (*RUA == *RUB) return true; + if (*RUA < *RUB) ++RUA; + else ++RUB; + } while (RUA.isValid() && RUB.isValid()); return false; } |