diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2013-05-12 00:07:05 +0000 | 
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2013-05-12 00:07:05 +0000 | 
| commit | 6c30f49af39da4c39cdab5f303f57f4809218b41 (patch) | |
| tree | eb372f6198fa0992596c4b53c3cd5c3cbba3c94a /llvm/lib | |
| parent | f2305e44675390adc80bae4834672132c12686f5 (diff) | |
| download | bcm5719-llvm-6c30f49af39da4c39cdab5f303f57f4809218b41.tar.gz bcm5719-llvm-6c30f49af39da4c39cdab5f303f57f4809218b41.zip | |
InstCombine: Flip the order of two urem transforms
There are two transforms in visitUrem that conflict with each other.
*) One, if a divisor is a power of two, subtracts one from the divisor
   and turns it into a bitwise-and.
*) The other unwraps both operands if they are surrounded by zext
   instructions.
Flipping the order allows the subtraction to go beneath the sign
extension.
llvm-svn: 181668
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 12 | 
1 files changed, 6 insertions, 6 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 249407818fd..87d56214a36 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1027,6 +1027,12 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) {    if (Instruction *common = commonIRemTransforms(I))      return common; +  // (zext A) urem (zext B) --> zext (A urem B) +  if (ZExtInst *ZOp0 = dyn_cast<ZExtInst>(Op0)) +    if (Value *ZOp1 = dyn_castZExtVal(Op1, ZOp0->getSrcTy())) +      return new ZExtInst(Builder->CreateURem(ZOp0->getOperand(0), ZOp1), +                          I.getType()); +    // X urem Y -> X and Y-1, where Y is a power of 2,    if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/true)) {      Constant *N1 = Constant::getAllOnesValue(I.getType()); @@ -1034,12 +1040,6 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) {      return BinaryOperator::CreateAnd(Op0, Add);    } -  // (zext A) urem (zext B) --> zext (A urem B) -  if (ZExtInst *ZOp0 = dyn_cast<ZExtInst>(Op0)) -    if (Value *ZOp1 = dyn_castZExtVal(Op1, ZOp0->getSrcTy())) -      return new ZExtInst(Builder->CreateURem(ZOp0->getOperand(0), ZOp1), -                          I.getType()); -    return 0;  } | 

