diff options
author | Yingwei Zheng <dtcxzyw2333@gmail.com> | 2024-01-11 15:15:12 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-11 15:15:12 +0800 |
commit | 3d795bdd4d9067e96b2ff9e6278a5b8847eebe2b (patch) | |
tree | 95dd59f476ff1ecc0d1e5fb56ed49a63943f4151 /llvm/lib/Transforms/Utils/Local.cpp | |
parent | 164f85db876e61cf4a3c34493ed11e8f5820f968 (diff) | |
download | llvm-3d795bdd4d9067e96b2ff9e6278a5b8847eebe2b.zip llvm-3d795bdd4d9067e96b2ff9e6278a5b8847eebe2b.tar.gz llvm-3d795bdd4d9067e96b2ff9e6278a5b8847eebe2b.tar.bz2 |
[InstCombine] Handle a bitreverse idiom which ends with a bswap (#77677)
This patch handles the following `bitreverse` idiom, which is found in
https://github.com/abseil/abseil-cpp/blob/8bd6445acc4bd0d123da2a44448b7218dfc70939/absl/crc/internal/crc.cc#L75-L80:
```
uint32_t ReverseBits(uint32_t bits) {
bits = (bits & 0xaaaaaaaau) >> 1 | (bits & 0x55555555u) << 1;
bits = (bits & 0xccccccccu) >> 2 | (bits & 0x33333333u) << 2;
bits = (bits & 0xf0f0f0f0u) >> 4 | (bits & 0x0f0f0f0fu) << 4;
return absl::gbswap_32(bits);
}
```
Alive2: https://alive2.llvm.org/ce/z/ZYXNmj
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index c76cc9d..b9cad76 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -3905,7 +3905,8 @@ bool llvm::recognizeBSwapOrBitReverseIdiom( SmallVectorImpl<Instruction *> &InsertedInsts) { if (!match(I, m_Or(m_Value(), m_Value())) && !match(I, m_FShl(m_Value(), m_Value(), m_Value())) && - !match(I, m_FShr(m_Value(), m_Value(), m_Value()))) + !match(I, m_FShr(m_Value(), m_Value(), m_Value())) && + !match(I, m_BSwap(m_Value()))) return false; if (!MatchBSwaps && !MatchBitReversals) return false; |