From: Chris Lattner Date: Mon, 23 May 2011 00:32:19 +0000 (+0000) Subject: rearrange two transforms, since one subsumes the other. Make the shift-exactness X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=613f1a3994ef6f009c93264f6708830249130896;p=oota-llvm.git rearrange two transforms, since one subsumes the other. Make the shift-exactness xform recurse. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131888 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index f3d10611ad2..a9b60d373c3 100644 --- a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -29,40 +29,47 @@ static Value *simplifyValueKnownNonZero(Value *V, InstCombiner &IC) { // code. if (!V->hasOneUse()) return 0; + bool MadeChange = false; + + // ((1 << A) >>u B) --> (1 << (A-B)) + // Because V cannot be zero, we know that B is less than A. + Value *A = 0, *B = 0, *PowerOf2 = 0; + if (match(V, m_LShr(m_OneUse(m_Shl(m_Value(PowerOf2), m_Value(A))), + m_Value(B))) && + // The "1" can be any value known to be a power of 2. + isPowerOfTwo(PowerOf2, IC.getTargetData())) { + A = IC.Builder->CreateSub(A, B, "tmp"); + return IC.Builder->CreateShl(PowerOf2, A); + } // (PowerOfTwo >>u B) --> isExact since shifting out the result would make it // inexact. Similarly for <<. if (BinaryOperator *I = dyn_cast(V)) if (I->isLogicalShift() && isPowerOfTwo(I->getOperand(0), IC.getTargetData())) { + // We know that this is an exact/nuw shift and that the input is a + // non-zero context as well. + if (Value *V2 = simplifyValueKnownNonZero(I->getOperand(0), IC)) { + I->setOperand(0, V2); + MadeChange = true; + } + if (I->getOpcode() == Instruction::LShr && !I->isExact()) { I->setIsExact(); - return I; + MadeChange = true; } if (I->getOpcode() == Instruction::Shl && !I->hasNoUnsignedWrap()) { I->setHasNoUnsignedWrap(); - return I; + MadeChange = true; } } - - // ((1 << A) >>u B) --> (1 << (A-B)) - // Because V cannot be zero, we know that B is less than A. - Value *A = 0, *B = 0, *PowerOf2 = 0; - if (match(V, m_LShr(m_OneUse(m_Shl(m_Value(PowerOf2), m_Value(A))), - m_Value(B))) && - // The "1" can be any value known to be a power of 2. - isPowerOfTwo(PowerOf2, IC.getTargetData())) { - A = IC.Builder->CreateSub(A, B, "tmp"); - return IC.Builder->CreateShl(PowerOf2, A); - } - + // TODO: Lots more we could do here: - // "1 >> X" could get an "isexact" bit. // If V is a phi node, we can call this on each of its operands. // "select cond, X, 0" can simplify to "X". - return 0; + return MadeChange ? V : 0; }