diff options
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;  }  | 

