summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-03-12 18:46:05 +0000
committerCraig Topper <craig.topper@intel.com>2018-03-12 18:46:05 +0000
commitee99aa4dd086b907bf4552f5b368a73e5f087655 (patch)
tree7a4bb18472ebefa218ea14a4ac9b11fbf0de289c /llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
parent3b4ad9c12d2e0c4ac67b2f0661aa0072dd0b64cb (diff)
downloadbcm5719-llvm-ee99aa4dd086b907bf4552f5b368a73e5f087655.tar.gz
bcm5719-llvm-ee99aa4dd086b907bf4552f5b368a73e5f087655.zip
[InstCombine] Replace calls to getNumUses with hasNUses or hasNUsesOrMore
getNumUses is a linear time operation. It traverses the user linked list to the end and counts as it goes. Since we are only interested in small constant counts, we should use hasNUses or hasNUsesMore more that terminate the traversal as soon as it can provide the answer. There are still two other locations in InstCombine, but changing those would force a rebase of D44266 which if accepted would remove them. Differential Revision: https://reviews.llvm.org/D44398 llvm-svn: 327315
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 44d11030eed..1b84eea74e4 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1192,7 +1192,7 @@ Instruction *InstCombiner::narrowMaskedBinOp(BinaryOperator &And) {
return nullptr;
Value *X;
- if (!match(Op1, m_ZExt(m_Value(X))) || Op1->getNumUses() > 2)
+ if (!match(Op1, m_ZExt(m_Value(X))) || Op1->hasNUsesOrMore(3))
return nullptr;
Type *Ty = And.getType();
@@ -2471,13 +2471,13 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
// We're relying on the fact that we only do this transform when the shift has
// exactly 2 uses and the add has exactly 1 use (otherwise, we might increase
// instructions).
- if (Op0->getNumUses() == 2)
+ if (Op0->hasNUses(2))
std::swap(Op0, Op1);
const APInt *ShAmt;
Type *Ty = I.getType();
if (match(Op1, m_AShr(m_Value(A), m_APInt(ShAmt))) &&
- Op1->getNumUses() == 2 && *ShAmt == Ty->getScalarSizeInBits() - 1 &&
+ Op1->hasNUses(2) && *ShAmt == Ty->getScalarSizeInBits() - 1 &&
match(Op0, m_OneUse(m_c_Add(m_Specific(A), m_Specific(Op1))))) {
// B = ashr i32 A, 31 ; smear the sign bit
// xor (add A, B), B ; add -1 and flip bits if negative
OpenPOWER on IntegriCloud