From e1c6ddcf64d7ed21254e21af58384161f1aaae90 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 13 Apr 2017 19:04:45 +0000 Subject: [PATCH] [ValueTracking] Prevent a call to computeKnownBits if we already know the state of the bit we would calculate. Also reuse a temporary APInt instead of creating a new one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300239 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ValueTracking.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 75ccc0ee64f..c72a3f63d05 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -918,13 +918,14 @@ static void computeKnownBitsFromOperator(const Operator *I, APInt &KnownZero, // TODO: This could be generalized to clearing any bit set in y where the // following bit is known to be unset in y. Value *Y = nullptr; - if (match(I->getOperand(0), m_Add(m_Specific(I->getOperand(1)), - m_Value(Y))) || - match(I->getOperand(1), m_Add(m_Specific(I->getOperand(0)), - m_Value(Y)))) { - APInt KnownZero3(BitWidth, 0), KnownOne3(BitWidth, 0); - computeKnownBits(Y, KnownZero3, KnownOne3, Depth + 1, Q); - if (KnownOne3.countTrailingOnes() > 0) + if (!KnownZero[0] && !KnownOne[0] && + (match(I->getOperand(0), m_Add(m_Specific(I->getOperand(1)), + m_Value(Y))) || + match(I->getOperand(1), m_Add(m_Specific(I->getOperand(0)), + m_Value(Y))))) { + KnownZero2.clearAllBits(); KnownOne2.clearAllBits(); + computeKnownBits(Y, KnownZero2, KnownOne2, Depth + 1, Q); + if (KnownOne2.countTrailingOnes() > 0) KnownZero.setBit(0); } break;