brintos

brintos / llvm-project-archived public Read only

0
0
Text · 96.9 KiB · a9aacc7 Raw
2564 lines · cpp
1//===- InstCombineMulDivRem.cpp -------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the visit functions for mul, fmul, sdiv, udiv, fdiv,10// srem, urem, frem.11//12//===----------------------------------------------------------------------===//13 14#include "InstCombineInternal.h"15#include "llvm/ADT/APInt.h"16#include "llvm/ADT/SmallPtrSet.h"17#include "llvm/ADT/SmallVector.h"18#include "llvm/Analysis/InstructionSimplify.h"19#include "llvm/Analysis/ValueTracking.h"20#include "llvm/IR/BasicBlock.h"21#include "llvm/IR/Constant.h"22#include "llvm/IR/Constants.h"23#include "llvm/IR/InstrTypes.h"24#include "llvm/IR/Instruction.h"25#include "llvm/IR/Instructions.h"26#include "llvm/IR/IntrinsicInst.h"27#include "llvm/IR/Intrinsics.h"28#include "llvm/IR/Operator.h"29#include "llvm/IR/PatternMatch.h"30#include "llvm/IR/Type.h"31#include "llvm/IR/Value.h"32#include "llvm/Support/Casting.h"33#include "llvm/Support/ErrorHandling.h"34#include "llvm/Transforms/InstCombine/InstCombiner.h"35#include "llvm/Transforms/Utils/BuildLibCalls.h"36#include <cassert>37 38#define DEBUG_TYPE "instcombine"39#include "llvm/Transforms/Utils/InstructionWorklist.h"40 41using namespace llvm;42using namespace PatternMatch;43 44/// The specific integer value is used in a context where it is known to be45/// non-zero.  If this allows us to simplify the computation, do so and return46/// the new operand, otherwise return null.47static Value *simplifyValueKnownNonZero(Value *V, InstCombinerImpl &IC,48                                        Instruction &CxtI) {49  // If V has multiple uses, then we would have to do more analysis to determine50  // if this is safe.  For example, the use could be in dynamically unreached51  // code.52  if (!V->hasOneUse()) return nullptr;53 54  bool MadeChange = false;55 56  // ((1 << A) >>u B) --> (1 << (A-B))57  // Because V cannot be zero, we know that B is less than A.58  Value *A = nullptr, *B = nullptr, *One = nullptr;59  if (match(V, m_LShr(m_OneUse(m_Shl(m_Value(One), m_Value(A))), m_Value(B))) &&60      match(One, m_One())) {61    A = IC.Builder.CreateSub(A, B);62    return IC.Builder.CreateShl(One, A);63  }64 65  // (PowerOfTwo >>u B) --> isExact since shifting out the result would make it66  // inexact.  Similarly for <<.67  BinaryOperator *I = dyn_cast<BinaryOperator>(V);68  if (I && I->isLogicalShift() &&69      IC.isKnownToBeAPowerOfTwo(I->getOperand(0), false, &CxtI)) {70    // We know that this is an exact/nuw shift and that the input is a71    // non-zero context as well.72    if (Value *V2 = simplifyValueKnownNonZero(I->getOperand(0), IC, CxtI)) {73      IC.replaceOperand(*I, 0, V2);74      MadeChange = true;75    }76 77    if (I->getOpcode() == Instruction::LShr && !I->isExact()) {78      I->setIsExact();79      MadeChange = true;80    }81 82    if (I->getOpcode() == Instruction::Shl && !I->hasNoUnsignedWrap()) {83      I->setHasNoUnsignedWrap();84      MadeChange = true;85    }86  }87 88  // TODO: Lots more we could do here:89  //    If V is a phi node, we can call this on each of its operands.90  //    "select cond, X, 0" can simplify to "X".91 92  return MadeChange ? V : nullptr;93}94 95// TODO: This is a specific form of a much more general pattern.96//       We could detect a select with any binop identity constant, or we97//       could use SimplifyBinOp to see if either arm of the select reduces.98//       But that needs to be done carefully and/or while removing potential99//       reverse canonicalizations as in InstCombiner::foldSelectIntoOp().100static Value *foldMulSelectToNegate(BinaryOperator &I,101                                    InstCombiner::BuilderTy &Builder) {102  Value *Cond, *OtherOp;103 104  // mul (select Cond, 1, -1), OtherOp --> select Cond, OtherOp, -OtherOp105  // mul OtherOp, (select Cond, 1, -1) --> select Cond, OtherOp, -OtherOp106  if (match(&I, m_c_Mul(m_OneUse(m_Select(m_Value(Cond), m_One(), m_AllOnes())),107                        m_Value(OtherOp)))) {108    bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap();109    Value *Neg = Builder.CreateNeg(OtherOp, "", HasAnyNoWrap);110    return Builder.CreateSelect(Cond, OtherOp, Neg);111  }112  // mul (select Cond, -1, 1), OtherOp --> select Cond, -OtherOp, OtherOp113  // mul OtherOp, (select Cond, -1, 1) --> select Cond, -OtherOp, OtherOp114  if (match(&I, m_c_Mul(m_OneUse(m_Select(m_Value(Cond), m_AllOnes(), m_One())),115                        m_Value(OtherOp)))) {116    bool HasAnyNoWrap = I.hasNoSignedWrap() || I.hasNoUnsignedWrap();117    Value *Neg = Builder.CreateNeg(OtherOp, "", HasAnyNoWrap);118    return Builder.CreateSelect(Cond, Neg, OtherOp);119  }120 121  // fmul (select Cond, 1.0, -1.0), OtherOp --> select Cond, OtherOp, -OtherOp122  // fmul OtherOp, (select Cond, 1.0, -1.0) --> select Cond, OtherOp, -OtherOp123  if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(1.0),124                                           m_SpecificFP(-1.0))),125                         m_Value(OtherOp))))126    return Builder.CreateSelectFMF(Cond, OtherOp,127                                   Builder.CreateFNegFMF(OtherOp, &I), &I);128 129  // fmul (select Cond, -1.0, 1.0), OtherOp --> select Cond, -OtherOp, OtherOp130  // fmul OtherOp, (select Cond, -1.0, 1.0) --> select Cond, -OtherOp, OtherOp131  if (match(&I, m_c_FMul(m_OneUse(m_Select(m_Value(Cond), m_SpecificFP(-1.0),132                                           m_SpecificFP(1.0))),133                         m_Value(OtherOp))))134    return Builder.CreateSelectFMF(Cond, Builder.CreateFNegFMF(OtherOp, &I),135                                   OtherOp, &I);136 137  return nullptr;138}139 140/// Reduce integer multiplication patterns that contain a (+/-1 << Z) factor.141/// Callers are expected to call this twice to handle commuted patterns.142static Value *foldMulShl1(BinaryOperator &Mul, bool CommuteOperands,143                          InstCombiner::BuilderTy &Builder) {144  Value *X = Mul.getOperand(0), *Y = Mul.getOperand(1);145  if (CommuteOperands)146    std::swap(X, Y);147 148  const bool HasNSW = Mul.hasNoSignedWrap();149  const bool HasNUW = Mul.hasNoUnsignedWrap();150 151  // X * (1 << Z) --> X << Z152  Value *Z;153  if (match(Y, m_Shl(m_One(), m_Value(Z)))) {154    bool PropagateNSW = HasNSW && cast<ShlOperator>(Y)->hasNoSignedWrap();155    return Builder.CreateShl(X, Z, Mul.getName(), HasNUW, PropagateNSW);156  }157 158  // Similar to above, but an increment of the shifted value becomes an add:159  // X * ((1 << Z) + 1) --> (X * (1 << Z)) + X --> (X << Z) + X160  // This increases uses of X, so it may require a freeze, but that is still161  // expected to be an improvement because it removes the multiply.162  BinaryOperator *Shift;163  if (match(Y, m_OneUse(m_Add(m_BinOp(Shift), m_One()))) &&164      match(Shift, m_OneUse(m_Shl(m_One(), m_Value(Z))))) {165    bool PropagateNSW = HasNSW && Shift->hasNoSignedWrap();166    Value *FrX = X;167    if (!isGuaranteedNotToBeUndef(X))168      FrX = Builder.CreateFreeze(X, X->getName() + ".fr");169    Value *Shl = Builder.CreateShl(FrX, Z, "mulshl", HasNUW, PropagateNSW);170    return Builder.CreateAdd(Shl, FrX, Mul.getName(), HasNUW, PropagateNSW);171  }172 173  // Similar to above, but a decrement of the shifted value is disguised as174  // 'not' and becomes a sub:175  // X * (~(-1 << Z)) --> X * ((1 << Z) - 1) --> (X << Z) - X176  // This increases uses of X, so it may require a freeze, but that is still177  // expected to be an improvement because it removes the multiply.178  if (match(Y, m_OneUse(m_Not(m_OneUse(m_Shl(m_AllOnes(), m_Value(Z))))))) {179    Value *FrX = X;180    if (!isGuaranteedNotToBeUndef(X))181      FrX = Builder.CreateFreeze(X, X->getName() + ".fr");182    Value *Shl = Builder.CreateShl(FrX, Z, "mulshl");183    return Builder.CreateSub(Shl, FrX, Mul.getName());184  }185 186  return nullptr;187}188 189Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) {190  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);191  if (Value *V =192          simplifyMulInst(Op0, Op1, I.hasNoSignedWrap(), I.hasNoUnsignedWrap(),193                          SQ.getWithInstruction(&I)))194    return replaceInstUsesWith(I, V);195 196  if (SimplifyAssociativeOrCommutative(I))197    return &I;198 199  if (Instruction *X = foldVectorBinop(I))200    return X;201 202  if (Instruction *Phi = foldBinopWithPhiOperands(I))203    return Phi;204 205  if (Value *V = foldUsingDistributiveLaws(I))206    return replaceInstUsesWith(I, V);207 208  Type *Ty = I.getType();209  const unsigned BitWidth = Ty->getScalarSizeInBits();210  const bool HasNSW = I.hasNoSignedWrap();211  const bool HasNUW = I.hasNoUnsignedWrap();212 213  // X * -1 --> 0 - X214  if (match(Op1, m_AllOnes())) {215    return HasNSW ? BinaryOperator::CreateNSWNeg(Op0)216                  : BinaryOperator::CreateNeg(Op0);217  }218 219  // Also allow combining multiply instructions on vectors.220  {221    Value *NewOp;222    Constant *C1, *C2;223    const APInt *IVal;224    if (match(&I, m_Mul(m_Shl(m_Value(NewOp), m_ImmConstant(C2)),225                        m_ImmConstant(C1))) &&226        match(C1, m_APInt(IVal))) {227      // ((X << C2)*C1) == (X * (C1 << C2))228      Constant *Shl =229          ConstantFoldBinaryOpOperands(Instruction::Shl, C1, C2, DL);230      assert(Shl && "Constant folding of immediate constants failed");231      BinaryOperator *Mul = cast<BinaryOperator>(I.getOperand(0));232      BinaryOperator *BO = BinaryOperator::CreateMul(NewOp, Shl);233      if (HasNUW && Mul->hasNoUnsignedWrap())234        BO->setHasNoUnsignedWrap();235      if (HasNSW && Mul->hasNoSignedWrap() && Shl->isNotMinSignedValue())236        BO->setHasNoSignedWrap();237      return BO;238    }239 240    if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) {241      // Replace X*(2^C) with X << C, where C is either a scalar or a vector.242      if (Constant *NewCst = ConstantExpr::getExactLogBase2(C1)) {243        BinaryOperator *Shl = BinaryOperator::CreateShl(NewOp, NewCst);244 245        if (HasNUW)246          Shl->setHasNoUnsignedWrap();247        if (HasNSW) {248          const APInt *V;249          if (match(NewCst, m_APInt(V)) && *V != V->getBitWidth() - 1)250            Shl->setHasNoSignedWrap();251        }252 253        return Shl;254      }255    }256  }257 258  // mul (shr exact X, N), (2^N + 1) -> add (X, shr exact (X, N))259  {260    Value *NewOp;261    const APInt *ShiftC;262    const APInt *MulAP;263    if (BitWidth > 2 &&264        match(&I, m_Mul(m_Exact(m_Shr(m_Value(NewOp), m_APInt(ShiftC))),265                        m_APInt(MulAP))) &&266        (*MulAP - 1).isPowerOf2() && *ShiftC == MulAP->logBase2()) {267      Value *BinOp = Op0;268      BinaryOperator *OpBO = cast<BinaryOperator>(Op0);269 270      // mul nuw (ashr exact X, N) -> add nuw (X, lshr exact (X, N))271      if (HasNUW && OpBO->getOpcode() == Instruction::AShr && OpBO->hasOneUse())272        BinOp = Builder.CreateLShr(NewOp, ConstantInt::get(Ty, *ShiftC), "",273                                   /*isExact=*/true);274 275      auto *NewAdd = BinaryOperator::CreateAdd(NewOp, BinOp);276      if (HasNSW && (HasNUW || OpBO->getOpcode() == Instruction::LShr ||277                     ShiftC->getZExtValue() < BitWidth - 1))278        NewAdd->setHasNoSignedWrap(true);279 280      NewAdd->setHasNoUnsignedWrap(HasNUW);281      return NewAdd;282    }283  }284 285  if (Op0->hasOneUse() && match(Op1, m_NegatedPower2())) {286    // Interpret  X * (-1<<C)  as  (-X) * (1<<C)  and try to sink the negation.287    // The "* (1<<C)" thus becomes a potential shifting opportunity.288    if (Value *NegOp0 =289            Negator::Negate(/*IsNegation*/ true, HasNSW, Op0, *this)) {290      auto *Op1C = cast<Constant>(Op1);291      return replaceInstUsesWith(292          I, Builder.CreateMul(NegOp0, ConstantExpr::getNeg(Op1C), "",293                               /*HasNUW=*/false,294                               HasNSW && Op1C->isNotMinSignedValue()));295    }296 297    // Try to convert multiply of extended operand to narrow negate and shift298    // for better analysis.299    // This is valid if the shift amount (trailing zeros in the multiplier300    // constant) clears more high bits than the bitwidth difference between301    // source and destination types:302    // ({z/s}ext X) * (-1<<C) --> (zext (-X)) << C303    const APInt *NegPow2C;304    Value *X;305    if (match(Op0, m_ZExtOrSExt(m_Value(X))) &&306        match(Op1, m_APIntAllowPoison(NegPow2C))) {307      unsigned SrcWidth = X->getType()->getScalarSizeInBits();308      unsigned ShiftAmt = NegPow2C->countr_zero();309      if (ShiftAmt >= BitWidth - SrcWidth) {310        Value *N = Builder.CreateNeg(X, X->getName() + ".neg");311        Value *Z = Builder.CreateZExt(N, Ty, N->getName() + ".z");312        return BinaryOperator::CreateShl(Z, ConstantInt::get(Ty, ShiftAmt));313      }314    }315  }316 317  if (Instruction *FoldedMul = foldBinOpIntoSelectOrPhi(I))318    return FoldedMul;319 320  if (Value *FoldedMul = foldMulSelectToNegate(I, Builder))321    return replaceInstUsesWith(I, FoldedMul);322 323  // Simplify mul instructions with a constant RHS.324  Constant *MulC;325  if (match(Op1, m_ImmConstant(MulC))) {326    // Canonicalize (X+C1)*MulC -> X*MulC+C1*MulC.327    // Canonicalize (X|C1)*MulC -> X*MulC+C1*MulC.328    Value *X;329    Constant *C1;330    if (match(Op0, m_OneUse(m_AddLike(m_Value(X), m_ImmConstant(C1))))) {331      // C1*MulC simplifies to a tidier constant.332      Value *NewC = Builder.CreateMul(C1, MulC);333      auto *BOp0 = cast<BinaryOperator>(Op0);334      bool Op0NUW =335          (BOp0->getOpcode() == Instruction::Or || BOp0->hasNoUnsignedWrap());336      Value *NewMul = Builder.CreateMul(X, MulC);337      auto *BO = BinaryOperator::CreateAdd(NewMul, NewC);338      if (HasNUW && Op0NUW) {339        // If NewMulBO is constant we also can set BO to nuw.340        if (auto *NewMulBO = dyn_cast<BinaryOperator>(NewMul))341          NewMulBO->setHasNoUnsignedWrap();342        BO->setHasNoUnsignedWrap();343      }344      return BO;345    }346  }347 348  // abs(X) * abs(X) -> X * X349  Value *X;350  if (Op0 == Op1 && match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X))))351    return BinaryOperator::CreateMul(X, X);352 353  {354    Value *Y;355    // abs(X) * abs(Y) -> abs(X * Y)356    if (I.hasNoSignedWrap() &&357        match(Op0,358              m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(X), m_One()))) &&359        match(Op1, m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(Y), m_One()))))360      return replaceInstUsesWith(361          I, Builder.CreateBinaryIntrinsic(Intrinsic::abs,362                                           Builder.CreateNSWMul(X, Y),363                                           Builder.getTrue()));364  }365 366  // -X * C --> X * -C367  Value *Y;368  Constant *Op1C;369  if (match(Op0, m_Neg(m_Value(X))) && match(Op1, m_Constant(Op1C)))370    return BinaryOperator::CreateMul(X, ConstantExpr::getNeg(Op1C));371 372  // -X * -Y --> X * Y373  if (match(Op0, m_Neg(m_Value(X))) && match(Op1, m_Neg(m_Value(Y)))) {374    auto *NewMul = BinaryOperator::CreateMul(X, Y);375    if (HasNSW && cast<OverflowingBinaryOperator>(Op0)->hasNoSignedWrap() &&376        cast<OverflowingBinaryOperator>(Op1)->hasNoSignedWrap())377      NewMul->setHasNoSignedWrap();378    return NewMul;379  }380 381  // -X * Y --> -(X * Y)382  // X * -Y --> -(X * Y)383  if (match(&I, m_c_Mul(m_OneUse(m_Neg(m_Value(X))), m_Value(Y))))384    return BinaryOperator::CreateNeg(Builder.CreateMul(X, Y));385 386  // (-X * Y) * -X --> (X * Y) * X387  // (-X << Y) * -X --> (X << Y) * X388  if (match(Op1, m_Neg(m_Value(X)))) {389    if (Value *NegOp0 = Negator::Negate(false, /*IsNSW*/ false, Op0, *this))390      return BinaryOperator::CreateMul(NegOp0, X);391  }392 393  if (Op0->hasOneUse()) {394    // (mul (div exact X, C0), C1)395    //    -> (div exact X, C0 / C1)396    // iff C0 % C1 == 0 and X / (C0 / C1) doesn't create UB.397    const APInt *C1;398    auto UDivCheck = [&C1](const APInt &C) { return C.urem(*C1).isZero(); };399    auto SDivCheck = [&C1](const APInt &C) {400      APInt Quot, Rem;401      APInt::sdivrem(C, *C1, Quot, Rem);402      return Rem.isZero() && !Quot.isAllOnes();403    };404    if (match(Op1, m_APInt(C1)) &&405        (match(Op0, m_Exact(m_UDiv(m_Value(X), m_CheckedInt(UDivCheck)))) ||406         match(Op0, m_Exact(m_SDiv(m_Value(X), m_CheckedInt(SDivCheck)))))) {407      auto BOpc = cast<BinaryOperator>(Op0)->getOpcode();408      return BinaryOperator::CreateExact(409          BOpc, X,410          Builder.CreateBinOp(BOpc, cast<BinaryOperator>(Op0)->getOperand(1),411                              Op1));412    }413  }414 415  // (X / Y) *  Y = X - (X % Y)416  // (X / Y) * -Y = (X % Y) - X417  {418    Value *Y = Op1;419    BinaryOperator *Div = dyn_cast<BinaryOperator>(Op0);420    if (!Div || (Div->getOpcode() != Instruction::UDiv &&421                 Div->getOpcode() != Instruction::SDiv)) {422      Y = Op0;423      Div = dyn_cast<BinaryOperator>(Op1);424    }425    Value *Neg = dyn_castNegVal(Y);426    if (Div && Div->hasOneUse() &&427        (Div->getOperand(1) == Y || Div->getOperand(1) == Neg) &&428        (Div->getOpcode() == Instruction::UDiv ||429         Div->getOpcode() == Instruction::SDiv)) {430      Value *X = Div->getOperand(0), *DivOp1 = Div->getOperand(1);431 432      // If the division is exact, X % Y is zero, so we end up with X or -X.433      if (Div->isExact()) {434        if (DivOp1 == Y)435          return replaceInstUsesWith(I, X);436        return BinaryOperator::CreateNeg(X);437      }438 439      auto RemOpc = Div->getOpcode() == Instruction::UDiv ? Instruction::URem440                                                          : Instruction::SRem;441      // X must be frozen because we are increasing its number of uses.442      Value *XFreeze = X;443      if (!isGuaranteedNotToBeUndef(X))444        XFreeze = Builder.CreateFreeze(X, X->getName() + ".fr");445      Value *Rem = Builder.CreateBinOp(RemOpc, XFreeze, DivOp1);446      if (DivOp1 == Y)447        return BinaryOperator::CreateSub(XFreeze, Rem);448      return BinaryOperator::CreateSub(Rem, XFreeze);449    }450  }451 452  // Fold the following two scenarios:453  //   1) i1 mul -> i1 and.454  //   2) X * Y --> X & Y, iff X, Y can be only {0,1}.455  // Note: We could use known bits to generalize this and related patterns with456  // shifts/truncs457  if (Ty->isIntOrIntVectorTy(1) ||458      (match(Op0, m_And(m_Value(), m_One())) &&459       match(Op1, m_And(m_Value(), m_One()))))460    return BinaryOperator::CreateAnd(Op0, Op1);461 462  if (Value *R = foldMulShl1(I, /* CommuteOperands */ false, Builder))463    return replaceInstUsesWith(I, R);464  if (Value *R = foldMulShl1(I, /* CommuteOperands */ true, Builder))465    return replaceInstUsesWith(I, R);466 467  // (zext bool X) * (zext bool Y) --> zext (and X, Y)468  // (sext bool X) * (sext bool Y) --> zext (and X, Y)469  // Note: -1 * -1 == 1 * 1 == 1 (if the extends match, the result is the same)470  if (((match(Op0, m_ZExt(m_Value(X))) && match(Op1, m_ZExt(m_Value(Y)))) ||471       (match(Op0, m_SExt(m_Value(X))) && match(Op1, m_SExt(m_Value(Y))))) &&472      X->getType()->isIntOrIntVectorTy(1) && X->getType() == Y->getType() &&473      (Op0->hasOneUse() || Op1->hasOneUse() || X == Y)) {474    Value *And = Builder.CreateAnd(X, Y, "mulbool");475    return CastInst::Create(Instruction::ZExt, And, Ty);476  }477  // (sext bool X) * (zext bool Y) --> sext (and X, Y)478  // (zext bool X) * (sext bool Y) --> sext (and X, Y)479  // Note: -1 * 1 == 1 * -1  == -1480  if (((match(Op0, m_SExt(m_Value(X))) && match(Op1, m_ZExt(m_Value(Y)))) ||481       (match(Op0, m_ZExt(m_Value(X))) && match(Op1, m_SExt(m_Value(Y))))) &&482      X->getType()->isIntOrIntVectorTy(1) && X->getType() == Y->getType() &&483      (Op0->hasOneUse() || Op1->hasOneUse())) {484    Value *And = Builder.CreateAnd(X, Y, "mulbool");485    return CastInst::Create(Instruction::SExt, And, Ty);486  }487 488  // (zext bool X) * Y --> X ? Y : 0489  // Y * (zext bool X) --> X ? Y : 0490  if (match(Op0, m_ZExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))491    return SelectInst::Create(X, Op1, ConstantInt::getNullValue(Ty));492  if (match(Op1, m_ZExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))493    return SelectInst::Create(X, Op0, ConstantInt::getNullValue(Ty));494 495  // mul (sext X), Y -> select X, -Y, 0496  // mul Y, (sext X) -> select X, -Y, 0497  if (match(&I, m_c_Mul(m_OneUse(m_SExt(m_Value(X))), m_Value(Y))) &&498      X->getType()->isIntOrIntVectorTy(1))499    return SelectInst::Create(X, Builder.CreateNeg(Y, "", I.hasNoSignedWrap()),500                              ConstantInt::getNullValue(Op0->getType()));501 502  Constant *ImmC;503  if (match(Op1, m_ImmConstant(ImmC))) {504    // (sext bool X) * C --> X ? -C : 0505    if (match(Op0, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)) {506      Constant *NegC = ConstantExpr::getNeg(ImmC);507      return SelectInst::Create(X, NegC, ConstantInt::getNullValue(Ty));508    }509 510    // (ashr i32 X, 31) * C --> (X < 0) ? -C : 0511    const APInt *C;512    if (match(Op0, m_OneUse(m_AShr(m_Value(X), m_APInt(C)))) &&513        *C == C->getBitWidth() - 1) {514      Constant *NegC = ConstantExpr::getNeg(ImmC);515      Value *IsNeg = Builder.CreateIsNeg(X, "isneg");516      return SelectInst::Create(IsNeg, NegC, ConstantInt::getNullValue(Ty));517    }518  }519 520  // (lshr X, 31) * Y --> (X < 0) ? Y : 0521  // TODO: We are not checking one-use because the elimination of the multiply522  //       is better for analysis?523  const APInt *C;524  if (match(&I, m_c_BinOp(m_LShr(m_Value(X), m_APInt(C)), m_Value(Y))) &&525      *C == C->getBitWidth() - 1) {526    Value *IsNeg = Builder.CreateIsNeg(X, "isneg");527    return SelectInst::Create(IsNeg, Y, ConstantInt::getNullValue(Ty));528  }529 530  // (and X, 1) * Y --> (trunc X) ? Y : 0531  if (match(&I, m_c_BinOp(m_OneUse(m_And(m_Value(X), m_One())), m_Value(Y)))) {532    Value *Tr = Builder.CreateTrunc(X, CmpInst::makeCmpResultType(Ty));533    return SelectInst::Create(Tr, Y, ConstantInt::getNullValue(Ty));534  }535 536  // ((ashr X, 31) | 1) * X --> abs(X)537  // X * ((ashr X, 31) | 1) --> abs(X)538  if (match(&I, m_c_BinOp(m_Or(m_AShr(m_Value(X),539                                      m_SpecificIntAllowPoison(BitWidth - 1)),540                               m_One()),541                          m_Deferred(X)))) {542    Value *Abs = Builder.CreateBinaryIntrinsic(543        Intrinsic::abs, X, ConstantInt::getBool(I.getContext(), HasNSW));544    Abs->takeName(&I);545    return replaceInstUsesWith(I, Abs);546  }547 548  if (Instruction *Ext = narrowMathIfNoOverflow(I))549    return Ext;550 551  if (Instruction *Res = foldBinOpOfSelectAndCastOfSelectCondition(I))552    return Res;553 554  // (mul Op0 Op1):555  //    if Log2(Op0) folds away ->556  //        (shl Op1, Log2(Op0))557  //    if Log2(Op1) folds away ->558  //        (shl Op0, Log2(Op1))559  if (Value *Res = tryGetLog2(Op0, /*AssumeNonZero=*/false)) {560    BinaryOperator *Shl = BinaryOperator::CreateShl(Op1, Res);561    // We can only propegate nuw flag.562    Shl->setHasNoUnsignedWrap(HasNUW);563    return Shl;564  }565  if (Value *Res = tryGetLog2(Op1, /*AssumeNonZero=*/false)) {566    BinaryOperator *Shl = BinaryOperator::CreateShl(Op0, Res);567    // We can only propegate nuw flag.568    Shl->setHasNoUnsignedWrap(HasNUW);569    return Shl;570  }571 572  bool Changed = false;573  if (!HasNSW && willNotOverflowSignedMul(Op0, Op1, I)) {574    Changed = true;575    I.setHasNoSignedWrap(true);576  }577 578  if (!HasNUW && willNotOverflowUnsignedMul(Op0, Op1, I, I.hasNoSignedWrap())) {579    Changed = true;580    I.setHasNoUnsignedWrap(true);581  }582 583  return Changed ? &I : nullptr;584}585 586Instruction *InstCombinerImpl::foldFPSignBitOps(BinaryOperator &I) {587  BinaryOperator::BinaryOps Opcode = I.getOpcode();588  assert((Opcode == Instruction::FMul || Opcode == Instruction::FDiv) &&589         "Expected fmul or fdiv");590 591  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);592  Value *X, *Y;593 594  // -X * -Y --> X * Y595  // -X / -Y --> X / Y596  if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))597    return BinaryOperator::CreateWithCopiedFlags(Opcode, X, Y, &I);598 599  // fabs(X) * fabs(X) -> X * X600  // fabs(X) / fabs(X) -> X / X601  if (Op0 == Op1 && match(Op0, m_FAbs(m_Value(X))))602    return BinaryOperator::CreateWithCopiedFlags(Opcode, X, X, &I);603 604  // fabs(X) * fabs(Y) --> fabs(X * Y)605  // fabs(X) / fabs(Y) --> fabs(X / Y)606  if (match(Op0, m_FAbs(m_Value(X))) && match(Op1, m_FAbs(m_Value(Y))) &&607      (Op0->hasOneUse() || Op1->hasOneUse())) {608    Value *XY = Builder.CreateBinOpFMF(Opcode, X, Y, &I);609    Value *Fabs =610        Builder.CreateUnaryIntrinsic(Intrinsic::fabs, XY, &I, I.getName());611    return replaceInstUsesWith(I, Fabs);612  }613 614  return nullptr;615}616 617Instruction *InstCombinerImpl::foldPowiReassoc(BinaryOperator &I) {618  auto createPowiExpr = [](BinaryOperator &I, InstCombinerImpl &IC, Value *X,619                           Value *Y, Value *Z) {620    InstCombiner::BuilderTy &Builder = IC.Builder;621    Value *YZ = Builder.CreateAdd(Y, Z);622    Instruction *NewPow = Builder.CreateIntrinsic(623        Intrinsic::powi, {X->getType(), YZ->getType()}, {X, YZ}, &I);624 625    return NewPow;626  };627 628  Value *X, *Y, *Z;629  unsigned Opcode = I.getOpcode();630  assert((Opcode == Instruction::FMul || Opcode == Instruction::FDiv) &&631         "Unexpected opcode");632 633  // powi(X, Y) * X --> powi(X, Y+1)634  // X * powi(X, Y) --> powi(X, Y+1)635  if (match(&I, m_c_FMul(m_OneUse(m_AllowReassoc(m_Intrinsic<Intrinsic::powi>(636                             m_Value(X), m_Value(Y)))),637                         m_Deferred(X)))) {638    Constant *One = ConstantInt::get(Y->getType(), 1);639    if (willNotOverflowSignedAdd(Y, One, I)) {640      Instruction *NewPow = createPowiExpr(I, *this, X, Y, One);641      return replaceInstUsesWith(I, NewPow);642    }643  }644 645  // powi(x, y) * powi(x, z) -> powi(x, y + z)646  Value *Op0 = I.getOperand(0);647  Value *Op1 = I.getOperand(1);648  if (Opcode == Instruction::FMul && I.isOnlyUserOfAnyOperand() &&649      match(Op0, m_AllowReassoc(650                     m_Intrinsic<Intrinsic::powi>(m_Value(X), m_Value(Y)))) &&651      match(Op1, m_AllowReassoc(m_Intrinsic<Intrinsic::powi>(m_Specific(X),652                                                             m_Value(Z)))) &&653      Y->getType() == Z->getType()) {654    Instruction *NewPow = createPowiExpr(I, *this, X, Y, Z);655    return replaceInstUsesWith(I, NewPow);656  }657 658  if (Opcode == Instruction::FDiv && I.hasAllowReassoc() && I.hasNoNaNs()) {659    // powi(X, Y) / X --> powi(X, Y-1)660    // This is legal when (Y - 1) can't wraparound, in which case reassoc and661    // nnan are required.662    // TODO: Multi-use may be also better off creating Powi(x,y-1)663    if (match(Op0, m_OneUse(m_AllowReassoc(m_Intrinsic<Intrinsic::powi>(664                       m_Specific(Op1), m_Value(Y))))) &&665        willNotOverflowSignedSub(Y, ConstantInt::get(Y->getType(), 1), I)) {666      Constant *NegOne = ConstantInt::getAllOnesValue(Y->getType());667      Instruction *NewPow = createPowiExpr(I, *this, Op1, Y, NegOne);668      return replaceInstUsesWith(I, NewPow);669    }670 671    // powi(X, Y) / (X * Z) --> powi(X, Y-1) / Z672    // This is legal when (Y - 1) can't wraparound, in which case reassoc and673    // nnan are required.674    // TODO: Multi-use may be also better off creating Powi(x,y-1)675    if (match(Op0, m_OneUse(m_AllowReassoc(m_Intrinsic<Intrinsic::powi>(676                       m_Value(X), m_Value(Y))))) &&677        match(Op1, m_AllowReassoc(m_c_FMul(m_Specific(X), m_Value(Z)))) &&678        willNotOverflowSignedSub(Y, ConstantInt::get(Y->getType(), 1), I)) {679      Constant *NegOne = ConstantInt::getAllOnesValue(Y->getType());680      auto *NewPow = createPowiExpr(I, *this, X, Y, NegOne);681      return BinaryOperator::CreateFDivFMF(NewPow, Z, &I);682    }683  }684 685  return nullptr;686}687 688// If we have the following pattern,689// X = 1.0/sqrt(a)690// R1 = X * X691// R2 = a/sqrt(a)692// then this method collects all the instructions that match R1 and R2.693static bool getFSqrtDivOptPattern(Instruction *Div,694                                  SmallPtrSetImpl<Instruction *> &R1,695                                  SmallPtrSetImpl<Instruction *> &R2) {696  Value *A;697  if (match(Div, m_FDiv(m_FPOne(), m_Sqrt(m_Value(A)))) ||698      match(Div, m_FDiv(m_SpecificFP(-1.0), m_Sqrt(m_Value(A))))) {699    for (User *U : Div->users()) {700      Instruction *I = cast<Instruction>(U);701      if (match(I, m_FMul(m_Specific(Div), m_Specific(Div))))702        R1.insert(I);703    }704 705    CallInst *CI = cast<CallInst>(Div->getOperand(1));706    for (User *U : CI->users()) {707      Instruction *I = cast<Instruction>(U);708      if (match(I, m_FDiv(m_Specific(A), m_Sqrt(m_Specific(A)))))709        R2.insert(I);710    }711  }712  return !R1.empty() && !R2.empty();713}714 715// Check legality for transforming716// x = 1.0/sqrt(a)717// r1 = x * x;718// r2 = a/sqrt(a);719//720// TO721//722// r1 = 1/a723// r2 = sqrt(a)724// x = r1 * r2725// This transform works only when 'a' is known positive.726static bool isFSqrtDivToFMulLegal(Instruction *X,727                                  SmallPtrSetImpl<Instruction *> &R1,728                                  SmallPtrSetImpl<Instruction *> &R2) {729  // Check if the required pattern for the transformation exists.730  if (!getFSqrtDivOptPattern(X, R1, R2))731    return false;732 733  BasicBlock *BBx = X->getParent();734  BasicBlock *BBr1 = (*R1.begin())->getParent();735  BasicBlock *BBr2 = (*R2.begin())->getParent();736 737  CallInst *FSqrt = cast<CallInst>(X->getOperand(1));738  if (!FSqrt->hasAllowReassoc() || !FSqrt->hasNoNaNs() ||739      !FSqrt->hasNoSignedZeros() || !FSqrt->hasNoInfs())740    return false;741 742  // We change x = 1/sqrt(a) to x = sqrt(a) * 1/a . This change isn't allowed743  // by recip fp as it is strictly meant to transform ops of type a/b to744  // a * 1/b. So, this can be considered as algebraic rewrite and reassoc flag745  // has been used(rather abused)in the past for algebraic rewrites.746  if (!X->hasAllowReassoc() || !X->hasAllowReciprocal() || !X->hasNoInfs())747    return false;748 749  // Check the constraints on X, R1 and R2 combined.750  // fdiv instruction and one of the multiplications must reside in the same751  // block. If not, the optimized code may execute more ops than before and752  // this may hamper the performance.753  if (BBx != BBr1 && BBx != BBr2)754    return false;755 756  // Check the constraints on instructions in R1.757  if (any_of(R1, [BBr1](Instruction *I) {758        // When you have multiple instructions residing in R1 and R2759        // respectively, it's difficult to generate combinations of (R1,R2) and760        // then check if we have the required pattern. So, for now, just be761        // conservative.762        return (I->getParent() != BBr1 || !I->hasAllowReassoc());763      }))764    return false;765 766  // Check the constraints on instructions in R2.767  return all_of(R2, [BBr2](Instruction *I) {768    // When you have multiple instructions residing in R1 and R2769    // respectively, it's difficult to generate combination of (R1,R2) and770    // then check if we have the required pattern. So, for now, just be771    // conservative.772    return (I->getParent() == BBr2 && I->hasAllowReassoc());773  });774}775 776Instruction *InstCombinerImpl::foldFMulReassoc(BinaryOperator &I) {777  Value *Op0 = I.getOperand(0);778  Value *Op1 = I.getOperand(1);779  Value *X, *Y;780  Constant *C;781  BinaryOperator *Op0BinOp;782 783  // Reassociate constant RHS with another constant to form constant784  // expression.785  if (match(Op1, m_Constant(C)) && C->isFiniteNonZeroFP() &&786      match(Op0, m_AllowReassoc(m_BinOp(Op0BinOp)))) {787    // Everything in this scope folds I with Op0, intersecting their FMF.788    FastMathFlags FMF = I.getFastMathFlags() & Op0BinOp->getFastMathFlags();789    Constant *C1;790    if (match(Op0, m_OneUse(m_FDiv(m_Constant(C1), m_Value(X))))) {791      // (C1 / X) * C --> (C * C1) / X792      Constant *CC1 =793          ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL);794      if (CC1 && CC1->isNormalFP())795        return BinaryOperator::CreateFDivFMF(CC1, X, FMF);796    }797    if (match(Op0, m_FDiv(m_Value(X), m_Constant(C1)))) {798      // FIXME: This seems like it should also be checking for arcp799      // (X / C1) * C --> X * (C / C1)800      Constant *CDivC1 =801          ConstantFoldBinaryOpOperands(Instruction::FDiv, C, C1, DL);802      if (CDivC1 && CDivC1->isNormalFP())803        return BinaryOperator::CreateFMulFMF(X, CDivC1, FMF);804 805      // If the constant was a denormal, try reassociating differently.806      // (X / C1) * C --> X / (C1 / C)807      Constant *C1DivC =808          ConstantFoldBinaryOpOperands(Instruction::FDiv, C1, C, DL);809      if (C1DivC && Op0->hasOneUse() && C1DivC->isNormalFP())810        return BinaryOperator::CreateFDivFMF(X, C1DivC, FMF);811    }812 813    // We do not need to match 'fadd C, X' and 'fsub X, C' because they are814    // canonicalized to 'fadd X, C'. Distributing the multiply may allow815    // further folds and (X * C) + C2 is 'fma'.816    if (match(Op0, m_OneUse(m_FAdd(m_Value(X), m_Constant(C1))))) {817      // (X + C1) * C --> (X * C) + (C * C1)818      if (Constant *CC1 =819              ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL)) {820        Value *XC = Builder.CreateFMulFMF(X, C, FMF);821        return BinaryOperator::CreateFAddFMF(XC, CC1, FMF);822      }823    }824    if (match(Op0, m_OneUse(m_FSub(m_Constant(C1), m_Value(X))))) {825      // (C1 - X) * C --> (C * C1) - (X * C)826      if (Constant *CC1 =827              ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL)) {828        Value *XC = Builder.CreateFMulFMF(X, C, FMF);829        return BinaryOperator::CreateFSubFMF(CC1, XC, FMF);830      }831    }832  }833 834  Value *Z;835  if (match(&I,836            m_c_FMul(m_AllowReassoc(m_OneUse(m_FDiv(m_Value(X), m_Value(Y)))),837                     m_Value(Z)))) {838    BinaryOperator *DivOp = cast<BinaryOperator>(((Z == Op0) ? Op1 : Op0));839    FastMathFlags FMF = I.getFastMathFlags() & DivOp->getFastMathFlags();840    if (FMF.allowReassoc()) {841      // Sink division: (X / Y) * Z --> (X * Z) / Y842      auto *NewFMul = Builder.CreateFMulFMF(X, Z, FMF);843      return BinaryOperator::CreateFDivFMF(NewFMul, Y, FMF);844    }845  }846 847  // sqrt(X) * sqrt(Y) -> sqrt(X * Y)848  // nnan disallows the possibility of returning a number if both operands are849  // negative (in that case, we should return NaN).850  if (I.hasNoNaNs() && match(Op0, m_OneUse(m_Sqrt(m_Value(X)))) &&851      match(Op1, m_OneUse(m_Sqrt(m_Value(Y))))) {852    Value *XY = Builder.CreateFMulFMF(X, Y, &I);853    Value *Sqrt = Builder.CreateUnaryIntrinsic(Intrinsic::sqrt, XY, &I);854    return replaceInstUsesWith(I, Sqrt);855  }856 857  // The following transforms are done irrespective of the number of uses858  // for the expression "1.0/sqrt(X)".859  //  1) 1.0/sqrt(X) * X -> X/sqrt(X)860  //  2) X * 1.0/sqrt(X) -> X/sqrt(X)861  // We always expect the backend to reduce X/sqrt(X) to sqrt(X), if it862  // has the necessary (reassoc) fast-math-flags.863  if (I.hasNoSignedZeros() &&864      match(Op0, (m_FDiv(m_SpecificFP(1.0), m_Value(Y)))) &&865      match(Y, m_Sqrt(m_Value(X))) && Op1 == X)866    return BinaryOperator::CreateFDivFMF(X, Y, &I);867  if (I.hasNoSignedZeros() &&868      match(Op1, (m_FDiv(m_SpecificFP(1.0), m_Value(Y)))) &&869      match(Y, m_Sqrt(m_Value(X))) && Op0 == X)870    return BinaryOperator::CreateFDivFMF(X, Y, &I);871 872  // Like the similar transform in instsimplify, this requires 'nsz' because873  // sqrt(-0.0) = -0.0, and -0.0 * -0.0 does not simplify to -0.0.874  if (I.hasNoNaNs() && I.hasNoSignedZeros() && Op0 == Op1 && Op0->hasNUses(2)) {875    // Peek through fdiv to find squaring of square root:876    // (X / sqrt(Y)) * (X / sqrt(Y)) --> (X * X) / Y877    if (match(Op0, m_FDiv(m_Value(X), m_Sqrt(m_Value(Y))))) {878      Value *XX = Builder.CreateFMulFMF(X, X, &I);879      return BinaryOperator::CreateFDivFMF(XX, Y, &I);880    }881    // (sqrt(Y) / X) * (sqrt(Y) / X) --> Y / (X * X)882    if (match(Op0, m_FDiv(m_Sqrt(m_Value(Y)), m_Value(X)))) {883      Value *XX = Builder.CreateFMulFMF(X, X, &I);884      return BinaryOperator::CreateFDivFMF(Y, XX, &I);885    }886  }887 888  // pow(X, Y) * X --> pow(X, Y+1)889  // X * pow(X, Y) --> pow(X, Y+1)890  if (match(&I, m_c_FMul(m_OneUse(m_Intrinsic<Intrinsic::pow>(m_Value(X),891                                                              m_Value(Y))),892                         m_Deferred(X)))) {893    Value *Y1 = Builder.CreateFAddFMF(Y, ConstantFP::get(I.getType(), 1.0), &I);894    Value *Pow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, X, Y1, &I);895    return replaceInstUsesWith(I, Pow);896  }897 898  if (Instruction *FoldedPowi = foldPowiReassoc(I))899    return FoldedPowi;900 901  if (I.isOnlyUserOfAnyOperand()) {902    // pow(X, Y) * pow(X, Z) -> pow(X, Y + Z)903    if (match(Op0, m_Intrinsic<Intrinsic::pow>(m_Value(X), m_Value(Y))) &&904        match(Op1, m_Intrinsic<Intrinsic::pow>(m_Specific(X), m_Value(Z)))) {905      auto *YZ = Builder.CreateFAddFMF(Y, Z, &I);906      auto *NewPow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, X, YZ, &I);907      return replaceInstUsesWith(I, NewPow);908    }909    // pow(X, Y) * pow(Z, Y) -> pow(X * Z, Y)910    if (match(Op0, m_Intrinsic<Intrinsic::pow>(m_Value(X), m_Value(Y))) &&911        match(Op1, m_Intrinsic<Intrinsic::pow>(m_Value(Z), m_Specific(Y)))) {912      auto *XZ = Builder.CreateFMulFMF(X, Z, &I);913      auto *NewPow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, XZ, Y, &I);914      return replaceInstUsesWith(I, NewPow);915    }916 917    // exp(X) * exp(Y) -> exp(X + Y)918    if (match(Op0, m_Intrinsic<Intrinsic::exp>(m_Value(X))) &&919        match(Op1, m_Intrinsic<Intrinsic::exp>(m_Value(Y)))) {920      Value *XY = Builder.CreateFAddFMF(X, Y, &I);921      Value *Exp = Builder.CreateUnaryIntrinsic(Intrinsic::exp, XY, &I);922      return replaceInstUsesWith(I, Exp);923    }924 925    // exp2(X) * exp2(Y) -> exp2(X + Y)926    if (match(Op0, m_Intrinsic<Intrinsic::exp2>(m_Value(X))) &&927        match(Op1, m_Intrinsic<Intrinsic::exp2>(m_Value(Y)))) {928      Value *XY = Builder.CreateFAddFMF(X, Y, &I);929      Value *Exp2 = Builder.CreateUnaryIntrinsic(Intrinsic::exp2, XY, &I);930      return replaceInstUsesWith(I, Exp2);931    }932  }933 934  // (X*Y) * X => (X*X) * Y where Y != X935  //  The purpose is two-fold:936  //   1) to form a power expression (of X).937  //   2) potentially shorten the critical path: After transformation, the938  //  latency of the instruction Y is amortized by the expression of X*X,939  //  and therefore Y is in a "less critical" position compared to what it940  //  was before the transformation.941  if (match(Op0, m_OneUse(m_c_FMul(m_Specific(Op1), m_Value(Y)))) && Op1 != Y) {942    Value *XX = Builder.CreateFMulFMF(Op1, Op1, &I);943    return BinaryOperator::CreateFMulFMF(XX, Y, &I);944  }945  if (match(Op1, m_OneUse(m_c_FMul(m_Specific(Op0), m_Value(Y)))) && Op0 != Y) {946    Value *XX = Builder.CreateFMulFMF(Op0, Op0, &I);947    return BinaryOperator::CreateFMulFMF(XX, Y, &I);948  }949 950  return nullptr;951}952 953Instruction *InstCombinerImpl::visitFMul(BinaryOperator &I) {954  if (Value *V = simplifyFMulInst(I.getOperand(0), I.getOperand(1),955                                  I.getFastMathFlags(),956                                  SQ.getWithInstruction(&I)))957    return replaceInstUsesWith(I, V);958 959  if (SimplifyAssociativeOrCommutative(I))960    return &I;961 962  if (Instruction *X = foldVectorBinop(I))963    return X;964 965  if (Instruction *Phi = foldBinopWithPhiOperands(I))966    return Phi;967 968  if (Instruction *FoldedMul = foldBinOpIntoSelectOrPhi(I))969    return FoldedMul;970 971  if (Value *FoldedMul = foldMulSelectToNegate(I, Builder))972    return replaceInstUsesWith(I, FoldedMul);973 974  if (Instruction *R = foldFPSignBitOps(I))975    return R;976 977  if (Instruction *R = foldFBinOpOfIntCasts(I))978    return R;979 980  // X * -1.0 --> -X981  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);982  if (match(Op1, m_SpecificFP(-1.0)))983    return UnaryOperator::CreateFNegFMF(Op0, &I);984 985  // With no-nans/no-infs:986  // X * 0.0 --> copysign(0.0, X)987  // X * -0.0 --> copysign(0.0, -X)988  const APFloat *FPC;989  if (match(Op1, m_APFloatAllowPoison(FPC)) && FPC->isZero() &&990      ((I.hasNoInfs() && isKnownNeverNaN(Op0, SQ.getWithInstruction(&I))) ||991       isKnownNeverNaN(&I, SQ.getWithInstruction(&I)))) {992    if (FPC->isNegative())993      Op0 = Builder.CreateFNegFMF(Op0, &I);994    CallInst *CopySign = Builder.CreateIntrinsic(Intrinsic::copysign,995                                                 {I.getType()}, {Op1, Op0}, &I);996    return replaceInstUsesWith(I, CopySign);997  }998 999  // -X * C --> X * -C1000  Value *X, *Y;1001  Constant *C;1002  if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_Constant(C)))1003    if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))1004      return BinaryOperator::CreateFMulFMF(X, NegC, &I);1005 1006  if (I.hasNoNaNs() && I.hasNoSignedZeros()) {1007    // (uitofp bool X) * Y --> X ? Y : 01008    // Y * (uitofp bool X) --> X ? Y : 01009    // Note INF * 0 is NaN.1010    if (match(Op0, m_UIToFP(m_Value(X))) &&1011        X->getType()->isIntOrIntVectorTy(1)) {1012      auto *SI = SelectInst::Create(X, Op1, ConstantFP::get(I.getType(), 0.0));1013      SI->copyFastMathFlags(I.getFastMathFlags());1014      return SI;1015    }1016    if (match(Op1, m_UIToFP(m_Value(X))) &&1017        X->getType()->isIntOrIntVectorTy(1)) {1018      auto *SI = SelectInst::Create(X, Op0, ConstantFP::get(I.getType(), 0.0));1019      SI->copyFastMathFlags(I.getFastMathFlags());1020      return SI;1021    }1022  }1023 1024  // (select A, B, C) * (select A, D, E) --> select A, (B*D), (C*E)1025  if (Value *V = SimplifySelectsFeedingBinaryOp(I, Op0, Op1))1026    return replaceInstUsesWith(I, V);1027 1028  if (I.hasAllowReassoc())1029    if (Instruction *FoldedMul = foldFMulReassoc(I))1030      return FoldedMul;1031 1032  // log2(X * 0.5) * Y = log2(X) * Y - Y1033  if (I.isFast()) {1034    IntrinsicInst *Log2 = nullptr;1035    if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::log2>(1036            m_OneUse(m_FMul(m_Value(X), m_SpecificFP(0.5))))))) {1037      Log2 = cast<IntrinsicInst>(Op0);1038      Y = Op1;1039    }1040    if (match(Op1, m_OneUse(m_Intrinsic<Intrinsic::log2>(1041            m_OneUse(m_FMul(m_Value(X), m_SpecificFP(0.5))))))) {1042      Log2 = cast<IntrinsicInst>(Op1);1043      Y = Op0;1044    }1045    if (Log2) {1046      Value *Log2 = Builder.CreateUnaryIntrinsic(Intrinsic::log2, X, &I);1047      Value *LogXTimesY = Builder.CreateFMulFMF(Log2, Y, &I);1048      return BinaryOperator::CreateFSubFMF(LogXTimesY, Y, &I);1049    }1050  }1051 1052  // Simplify FMUL recurrences starting with 0.0 to 0.0 if nnan and nsz are set.1053  // Given a phi node with entry value as 0 and it used in fmul operation,1054  // we can replace fmul with 0 safely and eleminate loop operation.1055  PHINode *PN = nullptr;1056  Value *Start = nullptr, *Step = nullptr;1057  if (matchSimpleRecurrence(&I, PN, Start, Step) && I.hasNoNaNs() &&1058      I.hasNoSignedZeros() && match(Start, m_Zero()))1059    return replaceInstUsesWith(I, Start);1060 1061  // minimum(X, Y) * maximum(X, Y) => X * Y.1062  if (match(&I,1063            m_c_FMul(m_Intrinsic<Intrinsic::maximum>(m_Value(X), m_Value(Y)),1064                     m_c_Intrinsic<Intrinsic::minimum>(m_Deferred(X),1065                                                       m_Deferred(Y))))) {1066    BinaryOperator *Result = BinaryOperator::CreateFMulFMF(X, Y, &I);1067    // We cannot preserve ninf if nnan flag is not set.1068    // If X is NaN and Y is Inf then in original program we had NaN * NaN,1069    // while in optimized version NaN * Inf and this is a poison with ninf flag.1070    if (!Result->hasNoNaNs())1071      Result->setHasNoInfs(false);1072    return Result;1073  }1074 1075  // tan(X) * cos(X) -> sin(X)1076  if (I.hasAllowContract() &&1077      match(&I,1078            m_c_FMul(m_OneUse(m_Intrinsic<Intrinsic::tan>(m_Value(X))),1079                     m_OneUse(m_Intrinsic<Intrinsic::cos>(m_Deferred(X)))))) {1080    auto *Sin = Builder.CreateUnaryIntrinsic(Intrinsic::sin, X, &I);1081    if (auto *Metadata = I.getMetadata(LLVMContext::MD_fpmath)) {1082      Sin->setMetadata(LLVMContext::MD_fpmath, Metadata);1083    }1084    return replaceInstUsesWith(I, Sin);1085  }1086 1087  return nullptr;1088}1089 1090/// Fold a divide or remainder with a select instruction divisor when one of the1091/// select operands is zero. In that case, we can use the other select operand1092/// because div/rem by zero is undefined.1093bool InstCombinerImpl::simplifyDivRemOfSelectWithZeroOp(BinaryOperator &I) {1094  SelectInst *SI = dyn_cast<SelectInst>(I.getOperand(1));1095  if (!SI)1096    return false;1097 1098  int NonNullOperand;1099  if (match(SI->getTrueValue(), m_Zero()))1100    // div/rem X, (Cond ? 0 : Y) -> div/rem X, Y1101    NonNullOperand = 2;1102  else if (match(SI->getFalseValue(), m_Zero()))1103    // div/rem X, (Cond ? Y : 0) -> div/rem X, Y1104    NonNullOperand = 1;1105  else1106    return false;1107 1108  // Change the div/rem to use 'Y' instead of the select.1109  replaceOperand(I, 1, SI->getOperand(NonNullOperand));1110 1111  // Okay, we know we replace the operand of the div/rem with 'Y' with no1112  // problem.  However, the select, or the condition of the select may have1113  // multiple uses.  Based on our knowledge that the operand must be non-zero,1114  // propagate the known value for the select into other uses of it, and1115  // propagate a known value of the condition into its other users.1116 1117  // If the select and condition only have a single use, don't bother with this,1118  // early exit.1119  Value *SelectCond = SI->getCondition();1120  if (SI->use_empty() && SelectCond->hasOneUse())1121    return true;1122 1123  // Scan the current block backward, looking for other uses of SI.1124  BasicBlock::iterator BBI = I.getIterator(), BBFront = I.getParent()->begin();1125  Type *CondTy = SelectCond->getType();1126  while (BBI != BBFront) {1127    --BBI;1128    // If we found an instruction that we can't assume will return, so1129    // information from below it cannot be propagated above it.1130    if (!isGuaranteedToTransferExecutionToSuccessor(&*BBI))1131      break;1132 1133    // Replace uses of the select or its condition with the known values.1134    for (Use &Op : BBI->operands()) {1135      if (Op == SI) {1136        replaceUse(Op, SI->getOperand(NonNullOperand));1137        Worklist.push(&*BBI);1138      } else if (Op == SelectCond) {1139        replaceUse(Op, NonNullOperand == 1 ? ConstantInt::getTrue(CondTy)1140                                           : ConstantInt::getFalse(CondTy));1141        Worklist.push(&*BBI);1142      }1143    }1144 1145    // If we past the instruction, quit looking for it.1146    if (&*BBI == SI)1147      SI = nullptr;1148    if (&*BBI == SelectCond)1149      SelectCond = nullptr;1150 1151    // If we ran out of things to eliminate, break out of the loop.1152    if (!SelectCond && !SI)1153      break;1154 1155  }1156  return true;1157}1158 1159/// True if the multiply can not be expressed in an int this size.1160static bool multiplyOverflows(const APInt &C1, const APInt &C2, APInt &Product,1161                              bool IsSigned) {1162  bool Overflow;1163  Product = IsSigned ? C1.smul_ov(C2, Overflow) : C1.umul_ov(C2, Overflow);1164  return Overflow;1165}1166 1167/// True if C1 is a multiple of C2. Quotient contains C1/C2.1168static bool isMultiple(const APInt &C1, const APInt &C2, APInt &Quotient,1169                       bool IsSigned) {1170  assert(C1.getBitWidth() == C2.getBitWidth() && "Constant widths not equal");1171 1172  // Bail if we will divide by zero.1173  if (C2.isZero())1174    return false;1175 1176  // Bail if we would divide INT_MIN by -1.1177  if (IsSigned && C1.isMinSignedValue() && C2.isAllOnes())1178    return false;1179 1180  APInt Remainder(C1.getBitWidth(), /*val=*/0ULL, IsSigned);1181  if (IsSigned)1182    APInt::sdivrem(C1, C2, Quotient, Remainder);1183  else1184    APInt::udivrem(C1, C2, Quotient, Remainder);1185 1186  return Remainder.isMinValue();1187}1188 1189static Value *foldIDivShl(BinaryOperator &I, InstCombiner::BuilderTy &Builder) {1190  assert((I.getOpcode() == Instruction::SDiv ||1191          I.getOpcode() == Instruction::UDiv) &&1192         "Expected integer divide");1193 1194  bool IsSigned = I.getOpcode() == Instruction::SDiv;1195  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1196  Type *Ty = I.getType();1197 1198  Value *X, *Y, *Z;1199 1200  // With appropriate no-wrap constraints, remove a common factor in the1201  // dividend and divisor that is disguised as a left-shifted value.1202  if (match(Op1, m_Shl(m_Value(X), m_Value(Z))) &&1203      match(Op0, m_c_Mul(m_Specific(X), m_Value(Y)))) {1204    // Both operands must have the matching no-wrap for this kind of division.1205    auto *Mul = cast<OverflowingBinaryOperator>(Op0);1206    auto *Shl = cast<OverflowingBinaryOperator>(Op1);1207    bool HasNUW = Mul->hasNoUnsignedWrap() && Shl->hasNoUnsignedWrap();1208    bool HasNSW = Mul->hasNoSignedWrap() && Shl->hasNoSignedWrap();1209 1210    // (X * Y) u/ (X << Z) --> Y u>> Z1211    if (!IsSigned && HasNUW)1212      return Builder.CreateLShr(Y, Z, "", I.isExact());1213 1214    // (X * Y) s/ (X << Z) --> Y s/ (1 << Z)1215    if (IsSigned && HasNSW && (Op0->hasOneUse() || Op1->hasOneUse())) {1216      Value *Shl = Builder.CreateShl(ConstantInt::get(Ty, 1), Z);1217      return Builder.CreateSDiv(Y, Shl, "", I.isExact());1218    }1219  }1220 1221  // With appropriate no-wrap constraints, remove a common factor in the1222  // dividend and divisor that is disguised as a left-shift amount.1223  if (match(Op0, m_Shl(m_Value(X), m_Value(Z))) &&1224      match(Op1, m_Shl(m_Value(Y), m_Specific(Z)))) {1225    auto *Shl0 = cast<OverflowingBinaryOperator>(Op0);1226    auto *Shl1 = cast<OverflowingBinaryOperator>(Op1);1227 1228    // For unsigned div, we need 'nuw' on both shifts or1229    // 'nsw' on both shifts + 'nuw' on the dividend.1230    // (X << Z) / (Y << Z) --> X / Y1231    if (!IsSigned &&1232        ((Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap()) ||1233         (Shl0->hasNoUnsignedWrap() && Shl0->hasNoSignedWrap() &&1234          Shl1->hasNoSignedWrap())))1235      return Builder.CreateUDiv(X, Y, "", I.isExact());1236 1237    // For signed div, we need 'nsw' on both shifts + 'nuw' on the divisor.1238    // (X << Z) / (Y << Z) --> X / Y1239    if (IsSigned && Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap() &&1240        Shl1->hasNoUnsignedWrap())1241      return Builder.CreateSDiv(X, Y, "", I.isExact());1242  }1243 1244  // If X << Y and X << Z does not overflow, then:1245  // (X << Y) / (X << Z) -> (1 << Y) / (1 << Z) -> 1 << Y >> Z1246  if (match(Op0, m_Shl(m_Value(X), m_Value(Y))) &&1247      match(Op1, m_Shl(m_Specific(X), m_Value(Z)))) {1248    auto *Shl0 = cast<OverflowingBinaryOperator>(Op0);1249    auto *Shl1 = cast<OverflowingBinaryOperator>(Op1);1250 1251    if (IsSigned ? (Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap())1252                 : (Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap())) {1253      Constant *One = ConstantInt::get(X->getType(), 1);1254      // Only preserve the nsw flag if dividend has nsw1255      // or divisor has nsw and operator is sdiv.1256      Value *Dividend = Builder.CreateShl(1257          One, Y, "shl.dividend",1258          /*HasNUW=*/true,1259          /*HasNSW=*/1260          IsSigned ? (Shl0->hasNoUnsignedWrap() || Shl1->hasNoUnsignedWrap())1261                   : Shl0->hasNoSignedWrap());1262      return Builder.CreateLShr(Dividend, Z, "", I.isExact());1263    }1264  }1265 1266  return nullptr;1267}1268 1269/// Common integer divide/remainder transforms1270Instruction *InstCombinerImpl::commonIDivRemTransforms(BinaryOperator &I) {1271  assert(I.isIntDivRem() && "Unexpected instruction");1272  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1273 1274  // If any element of a constant divisor fixed width vector is zero or undef1275  // the behavior is undefined and we can fold the whole op to poison.1276  auto *Op1C = dyn_cast<Constant>(Op1);1277  Type *Ty = I.getType();1278  auto *VTy = dyn_cast<FixedVectorType>(Ty);1279  if (Op1C && VTy) {1280    unsigned NumElts = VTy->getNumElements();1281    for (unsigned i = 0; i != NumElts; ++i) {1282      Constant *Elt = Op1C->getAggregateElement(i);1283      if (Elt && (Elt->isNullValue() || isa<UndefValue>(Elt)))1284        return replaceInstUsesWith(I, PoisonValue::get(Ty));1285    }1286  }1287 1288  if (Instruction *Phi = foldBinopWithPhiOperands(I))1289    return Phi;1290 1291  // The RHS is known non-zero.1292  if (Value *V = simplifyValueKnownNonZero(I.getOperand(1), *this, I))1293    return replaceOperand(I, 1, V);1294 1295  // Handle cases involving: div/rem X, (select Cond, Y, Z)1296  if (simplifyDivRemOfSelectWithZeroOp(I))1297    return &I;1298 1299  // If the divisor is a select-of-constants, try to constant fold all div ops:1300  // C div/rem (select Cond, TrueC, FalseC) --> select Cond, (C div/rem TrueC),1301  // (C div/rem FalseC)1302  // TODO: Adapt simplifyDivRemOfSelectWithZeroOp to allow this and other folds.1303  if (match(Op0, m_ImmConstant()) &&1304      match(Op1, m_Select(m_Value(), m_ImmConstant(), m_ImmConstant()))) {1305    if (Instruction *R = FoldOpIntoSelect(I, cast<SelectInst>(Op1),1306                                          /*FoldWithMultiUse*/ true))1307      return R;1308  }1309 1310  return nullptr;1311}1312 1313/// This function implements the transforms common to both integer division1314/// instructions (udiv and sdiv). It is called by the visitors to those integer1315/// division instructions.1316/// Common integer divide transforms1317Instruction *InstCombinerImpl::commonIDivTransforms(BinaryOperator &I) {1318  if (Instruction *Res = commonIDivRemTransforms(I))1319    return Res;1320 1321  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1322  bool IsSigned = I.getOpcode() == Instruction::SDiv;1323  Type *Ty = I.getType();1324 1325  const APInt *C2;1326  if (match(Op1, m_APInt(C2))) {1327    Value *X;1328    const APInt *C1;1329 1330    // (X / C1) / C2  -> X / (C1*C2)1331    if ((IsSigned && match(Op0, m_SDiv(m_Value(X), m_APInt(C1)))) ||1332        (!IsSigned && match(Op0, m_UDiv(m_Value(X), m_APInt(C1))))) {1333      APInt Product(C1->getBitWidth(), /*val=*/0ULL, IsSigned);1334      if (!multiplyOverflows(*C1, *C2, Product, IsSigned))1335        return BinaryOperator::Create(I.getOpcode(), X,1336                                      ConstantInt::get(Ty, Product));1337    }1338 1339    APInt Quotient(C2->getBitWidth(), /*val=*/0ULL, IsSigned);1340    if ((IsSigned && match(Op0, m_NSWMul(m_Value(X), m_APInt(C1)))) ||1341        (!IsSigned && match(Op0, m_NUWMul(m_Value(X), m_APInt(C1))))) {1342 1343      // (X * C1) / C2 -> X / (C2 / C1) if C2 is a multiple of C1.1344      if (isMultiple(*C2, *C1, Quotient, IsSigned)) {1345        auto *NewDiv = BinaryOperator::Create(I.getOpcode(), X,1346                                              ConstantInt::get(Ty, Quotient));1347        NewDiv->setIsExact(I.isExact());1348        return NewDiv;1349      }1350 1351      // (X * C1) / C2 -> X * (C1 / C2) if C1 is a multiple of C2.1352      if (isMultiple(*C1, *C2, Quotient, IsSigned)) {1353        auto *Mul = BinaryOperator::Create(Instruction::Mul, X,1354                                           ConstantInt::get(Ty, Quotient));1355        auto *OBO = cast<OverflowingBinaryOperator>(Op0);1356        Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());1357        Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());1358        return Mul;1359      }1360    }1361 1362    if ((IsSigned && match(Op0, m_NSWShl(m_Value(X), m_APInt(C1))) &&1363         C1->ult(C1->getBitWidth() - 1)) ||1364        (!IsSigned && match(Op0, m_NUWShl(m_Value(X), m_APInt(C1))) &&1365         C1->ult(C1->getBitWidth()))) {1366      APInt C1Shifted = APInt::getOneBitSet(1367          C1->getBitWidth(), static_cast<unsigned>(C1->getZExtValue()));1368 1369      // (X << C1) / C2 -> X / (C2 >> C1) if C2 is a multiple of 1 << C1.1370      if (isMultiple(*C2, C1Shifted, Quotient, IsSigned)) {1371        auto *BO = BinaryOperator::Create(I.getOpcode(), X,1372                                          ConstantInt::get(Ty, Quotient));1373        BO->setIsExact(I.isExact());1374        return BO;1375      }1376 1377      // (X << C1) / C2 -> X * ((1 << C1) / C2) if 1 << C1 is a multiple of C2.1378      if (isMultiple(C1Shifted, *C2, Quotient, IsSigned)) {1379        auto *Mul = BinaryOperator::Create(Instruction::Mul, X,1380                                           ConstantInt::get(Ty, Quotient));1381        auto *OBO = cast<OverflowingBinaryOperator>(Op0);1382        Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());1383        Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());1384        return Mul;1385      }1386    }1387 1388    // Distribute div over add to eliminate a matching div/mul pair:1389    // ((X * C2) + C1) / C2 --> X + C1/C21390    // We need a multiple of the divisor for a signed add constant, but1391    // unsigned is fine with any constant pair.1392    if (IsSigned &&1393        match(Op0, m_NSWAddLike(m_NSWMul(m_Value(X), m_SpecificInt(*C2)),1394                                m_APInt(C1))) &&1395        isMultiple(*C1, *C2, Quotient, IsSigned)) {1396      return BinaryOperator::CreateNSWAdd(X, ConstantInt::get(Ty, Quotient));1397    }1398    if (!IsSigned &&1399        match(Op0, m_NUWAddLike(m_NUWMul(m_Value(X), m_SpecificInt(*C2)),1400                                m_APInt(C1)))) {1401      return BinaryOperator::CreateNUWAdd(X,1402                                          ConstantInt::get(Ty, C1->udiv(*C2)));1403    }1404 1405    if (!C2->isZero()) // avoid X udiv 01406      if (Instruction *FoldedDiv = foldBinOpIntoSelectOrPhi(I))1407        return FoldedDiv;1408  }1409 1410  if (match(Op0, m_One())) {1411    assert(!Ty->isIntOrIntVectorTy(1) && "i1 divide not removed?");1412    if (IsSigned) {1413      // 1 / 0 --> undef ; 1 / 1 --> 1 ; 1 / -1 --> -1 ; 1 / anything else --> 01414      // (Op1 + 1) u< 3 ? Op1 : 01415      // Op1 must be frozen because we are increasing its number of uses.1416      Value *F1 = Op1;1417      if (!isGuaranteedNotToBeUndef(Op1))1418        F1 = Builder.CreateFreeze(Op1, Op1->getName() + ".fr");1419      Value *Inc = Builder.CreateAdd(F1, Op0);1420      Value *Cmp = Builder.CreateICmpULT(Inc, ConstantInt::get(Ty, 3));1421      return SelectInst::Create(Cmp, F1, ConstantInt::get(Ty, 0));1422    } else {1423      // If Op1 is 0 then it's undefined behaviour. If Op1 is 1 then the1424      // result is one, otherwise it's zero.1425      return new ZExtInst(Builder.CreateICmpEQ(Op1, Op0), Ty);1426    }1427  }1428 1429  // See if we can fold away this div instruction.1430  if (SimplifyDemandedInstructionBits(I))1431    return &I;1432 1433  // (X - (X rem Y)) / Y -> X / Y; usually originates as ((X / Y) * Y) / Y1434  Value *X, *Z;1435  if (match(Op0, m_Sub(m_Value(X), m_Value(Z)))) // (X - Z) / Y; Y = Op11436    if ((IsSigned && match(Z, m_SRem(m_Specific(X), m_Specific(Op1)))) ||1437        (!IsSigned && match(Z, m_URem(m_Specific(X), m_Specific(Op1)))))1438      return BinaryOperator::Create(I.getOpcode(), X, Op1);1439 1440  // (X << Y) / X -> 1 << Y1441  Value *Y;1442  if (IsSigned && match(Op0, m_NSWShl(m_Specific(Op1), m_Value(Y))))1443    return BinaryOperator::CreateNSWShl(ConstantInt::get(Ty, 1), Y);1444  if (!IsSigned && match(Op0, m_NUWShl(m_Specific(Op1), m_Value(Y))))1445    return BinaryOperator::CreateNUWShl(ConstantInt::get(Ty, 1), Y);1446 1447  // X / (X * Y) -> 1 / Y if the multiplication does not overflow.1448  if (match(Op1, m_c_Mul(m_Specific(Op0), m_Value(Y)))) {1449    bool HasNSW = cast<OverflowingBinaryOperator>(Op1)->hasNoSignedWrap();1450    bool HasNUW = cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap();1451    if ((IsSigned && HasNSW) || (!IsSigned && HasNUW)) {1452      replaceOperand(I, 0, ConstantInt::get(Ty, 1));1453      replaceOperand(I, 1, Y);1454      return &I;1455    }1456  }1457 1458  // (X << Z) / (X * Y) -> (1 << Z) / Y1459  // TODO: Handle sdiv.1460  if (!IsSigned && Op1->hasOneUse() &&1461      match(Op0, m_NUWShl(m_Value(X), m_Value(Z))) &&1462      match(Op1, m_c_Mul(m_Specific(X), m_Value(Y))))1463    if (cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap()) {1464      Instruction *NewDiv = BinaryOperator::CreateUDiv(1465          Builder.CreateShl(ConstantInt::get(Ty, 1), Z, "", /*NUW*/ true), Y);1466      NewDiv->setIsExact(I.isExact());1467      return NewDiv;1468    }1469 1470  if (Value *R = foldIDivShl(I, Builder))1471    return replaceInstUsesWith(I, R);1472 1473  // With the appropriate no-wrap constraint, remove a multiply by the divisor1474  // after peeking through another divide:1475  // ((Op1 * X) / Y) / Op1 --> X / Y1476  if (match(Op0, m_BinOp(I.getOpcode(), m_c_Mul(m_Specific(Op1), m_Value(X)),1477                         m_Value(Y)))) {1478    auto *InnerDiv = cast<PossiblyExactOperator>(Op0);1479    auto *Mul = cast<OverflowingBinaryOperator>(InnerDiv->getOperand(0));1480    Instruction *NewDiv = nullptr;1481    if (!IsSigned && Mul->hasNoUnsignedWrap())1482      NewDiv = BinaryOperator::CreateUDiv(X, Y);1483    else if (IsSigned && Mul->hasNoSignedWrap())1484      NewDiv = BinaryOperator::CreateSDiv(X, Y);1485 1486    // Exact propagates only if both of the original divides are exact.1487    if (NewDiv) {1488      NewDiv->setIsExact(I.isExact() && InnerDiv->isExact());1489      return NewDiv;1490    }1491  }1492 1493  // (X * Y) / (X * Z) --> Y / Z (and commuted variants)1494  if (match(Op0, m_Mul(m_Value(X), m_Value(Y)))) {1495    auto OB0HasNSW = cast<OverflowingBinaryOperator>(Op0)->hasNoSignedWrap();1496    auto OB0HasNUW = cast<OverflowingBinaryOperator>(Op0)->hasNoUnsignedWrap();1497 1498    auto CreateDivOrNull = [&](Value *A, Value *B) -> Instruction * {1499      auto OB1HasNSW = cast<OverflowingBinaryOperator>(Op1)->hasNoSignedWrap();1500      auto OB1HasNUW =1501          cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap();1502      const APInt *C1, *C2;1503      if (IsSigned && OB0HasNSW) {1504        if (OB1HasNSW && match(B, m_APInt(C1)) && !C1->isAllOnes())1505          return BinaryOperator::CreateSDiv(A, B);1506      }1507      if (!IsSigned && OB0HasNUW) {1508        if (OB1HasNUW)1509          return BinaryOperator::CreateUDiv(A, B);1510        if (match(A, m_APInt(C1)) && match(B, m_APInt(C2)) && C2->ule(*C1))1511          return BinaryOperator::CreateUDiv(A, B);1512      }1513      return nullptr;1514    };1515 1516    if (match(Op1, m_c_Mul(m_Specific(X), m_Value(Z)))) {1517      if (auto *Val = CreateDivOrNull(Y, Z))1518        return Val;1519    }1520    if (match(Op1, m_c_Mul(m_Specific(Y), m_Value(Z)))) {1521      if (auto *Val = CreateDivOrNull(X, Z))1522        return Val;1523    }1524  }1525  return nullptr;1526}1527 1528Value *InstCombinerImpl::takeLog2(Value *Op, unsigned Depth, bool AssumeNonZero,1529                                  bool DoFold) {1530  auto IfFold = [DoFold](function_ref<Value *()> Fn) {1531    if (!DoFold)1532      return reinterpret_cast<Value *>(-1);1533    return Fn();1534  };1535 1536  // FIXME: assert that Op1 isn't/doesn't contain undef.1537 1538  // log2(2^C) -> C1539  if (match(Op, m_Power2()))1540    return IfFold([&]() {1541      Constant *C = ConstantExpr::getExactLogBase2(cast<Constant>(Op));1542      if (!C)1543        llvm_unreachable("Failed to constant fold udiv -> logbase2");1544      return C;1545    });1546 1547  // The remaining tests are all recursive, so bail out if we hit the limit.1548  if (Depth++ == MaxAnalysisRecursionDepth)1549    return nullptr;1550 1551  // log2(zext X) -> zext log2(X)1552  // FIXME: Require one use?1553  Value *X, *Y;1554  if (match(Op, m_ZExt(m_Value(X))))1555    if (Value *LogX = takeLog2(X, Depth, AssumeNonZero, DoFold))1556      return IfFold([&]() { return Builder.CreateZExt(LogX, Op->getType()); });1557 1558  // log2(trunc x) -> trunc log2(X)1559  // FIXME: Require one use?1560  if (match(Op, m_Trunc(m_Value(X)))) {1561    auto *TI = cast<TruncInst>(Op);1562    if (AssumeNonZero || TI->hasNoUnsignedWrap())1563      if (Value *LogX = takeLog2(X, Depth, AssumeNonZero, DoFold))1564        return IfFold([&]() {1565          return Builder.CreateTrunc(LogX, Op->getType(), "",1566                                     /*IsNUW=*/TI->hasNoUnsignedWrap());1567        });1568  }1569 1570  // log2(X << Y) -> log2(X) + Y1571  // FIXME: Require one use unless X is 1?1572  if (match(Op, m_Shl(m_Value(X), m_Value(Y)))) {1573    auto *BO = cast<OverflowingBinaryOperator>(Op);1574    // nuw will be set if the `shl` is trivially non-zero.1575    if (AssumeNonZero || BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap())1576      if (Value *LogX = takeLog2(X, Depth, AssumeNonZero, DoFold))1577        return IfFold([&]() { return Builder.CreateAdd(LogX, Y); });1578  }1579 1580  // log2(X >>u Y) -> log2(X) - Y1581  // FIXME: Require one use?1582  if (match(Op, m_LShr(m_Value(X), m_Value(Y)))) {1583    auto *PEO = cast<PossiblyExactOperator>(Op);1584    if (AssumeNonZero || PEO->isExact())1585      if (Value *LogX = takeLog2(X, Depth, AssumeNonZero, DoFold))1586        return IfFold([&]() { return Builder.CreateSub(LogX, Y); });1587  }1588 1589  // log2(X & Y) -> either log2(X) or log2(Y)1590  // This requires `AssumeNonZero` as `X & Y` may be zero when X != Y.1591  if (AssumeNonZero && match(Op, m_And(m_Value(X), m_Value(Y)))) {1592    if (Value *LogX = takeLog2(X, Depth, AssumeNonZero, DoFold))1593      return IfFold([&]() { return LogX; });1594    if (Value *LogY = takeLog2(Y, Depth, AssumeNonZero, DoFold))1595      return IfFold([&]() { return LogY; });1596  }1597 1598  // log2(Cond ? X : Y) -> Cond ? log2(X) : log2(Y)1599  // FIXME: Require one use?1600  if (SelectInst *SI = dyn_cast<SelectInst>(Op))1601    if (Value *LogX = takeLog2(SI->getOperand(1), Depth, AssumeNonZero, DoFold))1602      if (Value *LogY =1603              takeLog2(SI->getOperand(2), Depth, AssumeNonZero, DoFold))1604        return IfFold([&]() {1605          return Builder.CreateSelect(SI->getOperand(0), LogX, LogY);1606        });1607 1608  // log2(umin(X, Y)) -> umin(log2(X), log2(Y))1609  // log2(umax(X, Y)) -> umax(log2(X), log2(Y))1610  auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op);1611  if (MinMax && MinMax->hasOneUse() && !MinMax->isSigned()) {1612    // Use AssumeNonZero as false here. Otherwise we can hit case where1613    // log2(umax(X, Y)) != umax(log2(X), log2(Y)) (because overflow).1614    if (Value *LogX = takeLog2(MinMax->getLHS(), Depth,1615                               /*AssumeNonZero*/ false, DoFold))1616      if (Value *LogY = takeLog2(MinMax->getRHS(), Depth,1617                                 /*AssumeNonZero*/ false, DoFold))1618        return IfFold([&]() {1619          return Builder.CreateBinaryIntrinsic(MinMax->getIntrinsicID(), LogX,1620                                               LogY);1621        });1622  }1623 1624  return nullptr;1625}1626 1627/// If we have zero-extended operands of an unsigned div or rem, we may be able1628/// to narrow the operation (sink the zext below the math).1629static Instruction *narrowUDivURem(BinaryOperator &I,1630                                   InstCombinerImpl &IC) {1631  Instruction::BinaryOps Opcode = I.getOpcode();1632  Value *N = I.getOperand(0);1633  Value *D = I.getOperand(1);1634  Type *Ty = I.getType();1635  Value *X, *Y;1636  if (match(N, m_ZExt(m_Value(X))) && match(D, m_ZExt(m_Value(Y))) &&1637      X->getType() == Y->getType() && (N->hasOneUse() || D->hasOneUse())) {1638    // udiv (zext X), (zext Y) --> zext (udiv X, Y)1639    // urem (zext X), (zext Y) --> zext (urem X, Y)1640    Value *NarrowOp = IC.Builder.CreateBinOp(Opcode, X, Y);1641    return new ZExtInst(NarrowOp, Ty);1642  }1643 1644  Constant *C;1645  auto &DL = IC.getDataLayout();1646  if (isa<Instruction>(N) && match(N, m_OneUse(m_ZExt(m_Value(X)))) &&1647      match(D, m_Constant(C))) {1648    // If the constant is the same in the smaller type, use the narrow version.1649    Constant *TruncC = getLosslessUnsignedTrunc(C, X->getType(), DL);1650    if (!TruncC)1651      return nullptr;1652 1653    // udiv (zext X), C --> zext (udiv X, C')1654    // urem (zext X), C --> zext (urem X, C')1655    return new ZExtInst(IC.Builder.CreateBinOp(Opcode, X, TruncC), Ty);1656  }1657  if (isa<Instruction>(D) && match(D, m_OneUse(m_ZExt(m_Value(X)))) &&1658      match(N, m_Constant(C))) {1659    // If the constant is the same in the smaller type, use the narrow version.1660    Constant *TruncC = getLosslessUnsignedTrunc(C, X->getType(), DL);1661    if (!TruncC)1662      return nullptr;1663 1664    // udiv C, (zext X) --> zext (udiv C', X)1665    // urem C, (zext X) --> zext (urem C', X)1666    return new ZExtInst(IC.Builder.CreateBinOp(Opcode, TruncC, X), Ty);1667  }1668 1669  return nullptr;1670}1671 1672Instruction *InstCombinerImpl::visitUDiv(BinaryOperator &I) {1673  if (Value *V = simplifyUDivInst(I.getOperand(0), I.getOperand(1), I.isExact(),1674                                  SQ.getWithInstruction(&I)))1675    return replaceInstUsesWith(I, V);1676 1677  if (Instruction *X = foldVectorBinop(I))1678    return X;1679 1680  // Handle the integer div common cases1681  if (Instruction *Common = commonIDivTransforms(I))1682    return Common;1683 1684  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1685  Value *X;1686  const APInt *C1, *C2;1687  if (match(Op0, m_LShr(m_Value(X), m_APInt(C1))) && match(Op1, m_APInt(C2))) {1688    // (X lshr C1) udiv C2 --> X udiv (C2 << C1)1689    bool Overflow;1690    APInt C2ShlC1 = C2->ushl_ov(*C1, Overflow);1691    if (!Overflow) {1692      bool IsExact = I.isExact() && match(Op0, m_Exact(m_Value()));1693      BinaryOperator *BO = BinaryOperator::CreateUDiv(1694          X, ConstantInt::get(X->getType(), C2ShlC1));1695      if (IsExact)1696        BO->setIsExact();1697      return BO;1698    }1699  }1700 1701  // Op0 / C where C is large (negative) --> zext (Op0 >= C)1702  // TODO: Could use isKnownNegative() to handle non-constant values.1703  Type *Ty = I.getType();1704  if (match(Op1, m_Negative())) {1705    Value *Cmp = Builder.CreateICmpUGE(Op0, Op1);1706    return CastInst::CreateZExtOrBitCast(Cmp, Ty);1707  }1708  // Op0 / (sext i1 X) --> zext (Op0 == -1) (if X is 0, the div is undefined)1709  if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)) {1710    Value *Cmp = Builder.CreateICmpEQ(Op0, ConstantInt::getAllOnesValue(Ty));1711    return CastInst::CreateZExtOrBitCast(Cmp, Ty);1712  }1713 1714  if (Instruction *NarrowDiv = narrowUDivURem(I, *this))1715    return NarrowDiv;1716 1717  Value *A, *B;1718 1719  // Look through a right-shift to find the common factor:1720  // ((Op1 *nuw A) >> B) / Op1 --> A >> B1721  if (match(Op0, m_LShr(m_NUWMul(m_Specific(Op1), m_Value(A)), m_Value(B))) ||1722      match(Op0, m_LShr(m_NUWMul(m_Value(A), m_Specific(Op1)), m_Value(B)))) {1723    Instruction *Lshr = BinaryOperator::CreateLShr(A, B);1724    if (I.isExact() && cast<PossiblyExactOperator>(Op0)->isExact())1725      Lshr->setIsExact();1726    return Lshr;1727  }1728 1729  auto GetShiftableDenom = [&](Value *Denom) -> Value * {1730    // Op0 udiv Op1 -> Op0 lshr log2(Op1), if log2() folds away.1731    if (Value *Log2 = tryGetLog2(Op1, /*AssumeNonZero=*/true))1732      return Log2;1733 1734    // Op0 udiv Op1 -> Op0 lshr cttz(Op1), if Op1 is a power of 2.1735    if (isKnownToBeAPowerOfTwo(Denom, /*OrZero=*/true, &I))1736      // This will increase instruction count but it's okay1737      // since bitwise operations are substantially faster than1738      // division.1739      return Builder.CreateBinaryIntrinsic(Intrinsic::cttz, Denom,1740                                           Builder.getTrue());1741 1742    return nullptr;1743  };1744 1745  if (auto *Res = GetShiftableDenom(Op1))1746    return replaceInstUsesWith(1747        I, Builder.CreateLShr(Op0, Res, I.getName(), I.isExact()));1748 1749  return nullptr;1750}1751 1752Instruction *InstCombinerImpl::visitSDiv(BinaryOperator &I) {1753  if (Value *V = simplifySDivInst(I.getOperand(0), I.getOperand(1), I.isExact(),1754                                  SQ.getWithInstruction(&I)))1755    return replaceInstUsesWith(I, V);1756 1757  if (Instruction *X = foldVectorBinop(I))1758    return X;1759 1760  // Handle the integer div common cases1761  if (Instruction *Common = commonIDivTransforms(I))1762    return Common;1763 1764  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1765  Type *Ty = I.getType();1766  Value *X;1767  // sdiv Op0, -1 --> -Op01768  // sdiv Op0, (sext i1 X) --> -Op0 (because if X is 0, the op is undefined)1769  if (match(Op1, m_AllOnes()) ||1770      (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)))1771    return BinaryOperator::CreateNSWNeg(Op0);1772 1773  // X / INT_MIN --> X == INT_MIN1774  if (match(Op1, m_SignMask()))1775    return new ZExtInst(Builder.CreateICmpEQ(Op0, Op1), Ty);1776 1777  if (I.isExact()) {1778    // sdiv exact X, 1<<C --> ashr exact X, C   iff  1<<C  is non-negative1779    if (match(Op1, m_Power2()) && match(Op1, m_NonNegative())) {1780      Constant *C = ConstantExpr::getExactLogBase2(cast<Constant>(Op1));1781      return BinaryOperator::CreateExactAShr(Op0, C);1782    }1783 1784    // sdiv exact X, (1<<ShAmt) --> ashr exact X, ShAmt (if shl is non-negative)1785    Value *ShAmt;1786    if (match(Op1, m_NSWShl(m_One(), m_Value(ShAmt))))1787      return BinaryOperator::CreateExactAShr(Op0, ShAmt);1788 1789    // sdiv exact X, -1<<C --> -(ashr exact X, C)1790    if (match(Op1, m_NegatedPower2())) {1791      Constant *NegPow2C = ConstantExpr::getNeg(cast<Constant>(Op1));1792      Constant *C = ConstantExpr::getExactLogBase2(NegPow2C);1793      Value *Ashr = Builder.CreateAShr(Op0, C, I.getName() + ".neg", true);1794      return BinaryOperator::CreateNSWNeg(Ashr);1795    }1796  }1797 1798  const APInt *Op1C;1799  if (match(Op1, m_APInt(Op1C))) {1800    // If the dividend is sign-extended and the constant divisor is small enough1801    // to fit in the source type, shrink the division to the narrower type:1802    // (sext X) sdiv C --> sext (X sdiv C)1803    Value *Op0Src;1804    if (match(Op0, m_OneUse(m_SExt(m_Value(Op0Src)))) &&1805        Op0Src->getType()->getScalarSizeInBits() >=1806            Op1C->getSignificantBits()) {1807 1808      // In the general case, we need to make sure that the dividend is not the1809      // minimum signed value because dividing that by -1 is UB. But here, we1810      // know that the -1 divisor case is already handled above.1811 1812      Constant *NarrowDivisor =1813          ConstantExpr::getTrunc(cast<Constant>(Op1), Op0Src->getType());1814      Value *NarrowOp = Builder.CreateSDiv(Op0Src, NarrowDivisor);1815      return new SExtInst(NarrowOp, Ty);1816    }1817 1818    // -X / C --> X / -C (if the negation doesn't overflow).1819    // TODO: This could be enhanced to handle arbitrary vector constants by1820    //       checking if all elements are not the min-signed-val.1821    if (!Op1C->isMinSignedValue() && match(Op0, m_NSWNeg(m_Value(X)))) {1822      Constant *NegC = ConstantInt::get(Ty, -(*Op1C));1823      Instruction *BO = BinaryOperator::CreateSDiv(X, NegC);1824      BO->setIsExact(I.isExact());1825      return BO;1826    }1827  }1828 1829  // -X / Y --> -(X / Y)1830  Value *Y;1831  if (match(&I, m_SDiv(m_OneUse(m_NSWNeg(m_Value(X))), m_Value(Y))))1832    return BinaryOperator::CreateNSWNeg(1833        Builder.CreateSDiv(X, Y, I.getName(), I.isExact()));1834 1835  // abs(X) / X --> X > -1 ? 1 : -11836  // X / abs(X) --> X > -1 ? 1 : -11837  if (match(&I, m_c_BinOp(1838                    m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(X), m_One())),1839                    m_Deferred(X)))) {1840    Value *Cond = Builder.CreateIsNotNeg(X);1841    return SelectInst::Create(Cond, ConstantInt::get(Ty, 1),1842                              ConstantInt::getAllOnesValue(Ty));1843  }1844 1845  KnownBits KnownDividend = computeKnownBits(Op0, &I);1846  if (!I.isExact() &&1847      (match(Op1, m_Power2(Op1C)) || match(Op1, m_NegatedPower2(Op1C))) &&1848      KnownDividend.countMinTrailingZeros() >= Op1C->countr_zero()) {1849    I.setIsExact();1850    return &I;1851  }1852 1853  if (KnownDividend.isNonNegative()) {1854    // If both operands are unsigned, turn this into a udiv.1855    if (isKnownNonNegative(Op1, SQ.getWithInstruction(&I))) {1856      auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName());1857      BO->setIsExact(I.isExact());1858      return BO;1859    }1860 1861    if (match(Op1, m_NegatedPower2())) {1862      // X sdiv (-(1 << C)) -> -(X sdiv (1 << C)) ->1863      //                    -> -(X udiv (1 << C)) -> -(X u>> C)1864      Constant *CNegLog2 = ConstantExpr::getExactLogBase2(1865          ConstantExpr::getNeg(cast<Constant>(Op1)));1866      Value *Shr = Builder.CreateLShr(Op0, CNegLog2, I.getName(), I.isExact());1867      return BinaryOperator::CreateNeg(Shr);1868    }1869 1870    if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, &I)) {1871      // X sdiv (1 << Y) -> X udiv (1 << Y) ( -> X u>> Y)1872      // Safe because the only negative value (1 << Y) can take on is1873      // INT_MIN, and X sdiv INT_MIN == X udiv INT_MIN == 0 if X doesn't have1874      // the sign bit set.1875      auto *BO = BinaryOperator::CreateUDiv(Op0, Op1, I.getName());1876      BO->setIsExact(I.isExact());1877      return BO;1878    }1879  }1880 1881  // -X / X --> X == INT_MIN ? 1 : -11882  if (isKnownNegation(Op0, Op1)) {1883    APInt MinVal = APInt::getSignedMinValue(Ty->getScalarSizeInBits());1884    Value *Cond = Builder.CreateICmpEQ(Op0, ConstantInt::get(Ty, MinVal));1885    return SelectInst::Create(Cond, ConstantInt::get(Ty, 1),1886                              ConstantInt::getAllOnesValue(Ty));1887  }1888  return nullptr;1889}1890 1891/// Remove negation and try to convert division into multiplication.1892Instruction *InstCombinerImpl::foldFDivConstantDivisor(BinaryOperator &I) {1893  Constant *C;1894  if (!match(I.getOperand(1), m_Constant(C)))1895    return nullptr;1896 1897  // -X / C --> X / -C1898  Value *X;1899  const DataLayout &DL = I.getDataLayout();1900  if (match(I.getOperand(0), m_FNeg(m_Value(X))))1901    if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))1902      return BinaryOperator::CreateFDivFMF(X, NegC, &I);1903 1904  // nnan X / +0.0 -> copysign(inf, X)1905  // nnan nsz X / -0.0 -> copysign(inf, X)1906  if (I.hasNoNaNs() &&1907      (match(I.getOperand(1), m_PosZeroFP()) ||1908       (I.hasNoSignedZeros() && match(I.getOperand(1), m_AnyZeroFP())))) {1909    IRBuilder<> B(&I);1910    CallInst *CopySign = B.CreateIntrinsic(1911        Intrinsic::copysign, {C->getType()},1912        {ConstantFP::getInfinity(I.getType()), I.getOperand(0)}, &I);1913    CopySign->takeName(&I);1914    return replaceInstUsesWith(I, CopySign);1915  }1916 1917  // If the constant divisor has an exact inverse, this is always safe. If not,1918  // then we can still create a reciprocal if fast-math-flags allow it and the1919  // constant is a regular number (not zero, infinite, or denormal).1920  if (!(C->hasExactInverseFP() || (I.hasAllowReciprocal() && C->isNormalFP())))1921    return nullptr;1922 1923  // Disallow denormal constants because we don't know what would happen1924  // on all targets.1925  // TODO: Use Intrinsic::canonicalize or let function attributes tell us that1926  // denorms are flushed?1927  auto *RecipC = ConstantFoldBinaryOpOperands(1928      Instruction::FDiv, ConstantFP::get(I.getType(), 1.0), C, DL);1929  if (!RecipC || !RecipC->isNormalFP())1930    return nullptr;1931 1932  // X / C --> X * (1 / C)1933  return BinaryOperator::CreateFMulFMF(I.getOperand(0), RecipC, &I);1934}1935 1936/// Remove negation and try to reassociate constant math.1937static Instruction *foldFDivConstantDividend(BinaryOperator &I) {1938  Constant *C;1939  if (!match(I.getOperand(0), m_Constant(C)))1940    return nullptr;1941 1942  // C / -X --> -C / X1943  Value *X;1944  const DataLayout &DL = I.getDataLayout();1945  if (match(I.getOperand(1), m_FNeg(m_Value(X))))1946    if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))1947      return BinaryOperator::CreateFDivFMF(NegC, X, &I);1948 1949  if (!I.hasAllowReassoc() || !I.hasAllowReciprocal())1950    return nullptr;1951 1952  // Try to reassociate C / X expressions where X includes another constant.1953  Constant *C2, *NewC = nullptr;1954  if (match(I.getOperand(1), m_FMul(m_Value(X), m_Constant(C2)))) {1955    // C / (X * C2) --> (C / C2) / X1956    NewC = ConstantFoldBinaryOpOperands(Instruction::FDiv, C, C2, DL);1957  } else if (match(I.getOperand(1), m_FDiv(m_Value(X), m_Constant(C2)))) {1958    // C / (X / C2) --> (C * C2) / X1959    NewC = ConstantFoldBinaryOpOperands(Instruction::FMul, C, C2, DL);1960  }1961  // Disallow denormal constants because we don't know what would happen1962  // on all targets.1963  // TODO: Use Intrinsic::canonicalize or let function attributes tell us that1964  // denorms are flushed?1965  if (!NewC || !NewC->isNormalFP())1966    return nullptr;1967 1968  return BinaryOperator::CreateFDivFMF(NewC, X, &I);1969}1970 1971/// Negate the exponent of pow/exp to fold division-by-pow() into multiply.1972static Instruction *foldFDivPowDivisor(BinaryOperator &I,1973                                       InstCombiner::BuilderTy &Builder) {1974  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);1975  auto *II = dyn_cast<IntrinsicInst>(Op1);1976  if (!II || !II->hasOneUse() || !I.hasAllowReassoc() ||1977      !I.hasAllowReciprocal())1978    return nullptr;1979 1980  // Z / pow(X, Y) --> Z * pow(X, -Y)1981  // Z / exp{2}(Y) --> Z * exp{2}(-Y)1982  // In the general case, this creates an extra instruction, but fmul allows1983  // for better canonicalization and optimization than fdiv.1984  Intrinsic::ID IID = II->getIntrinsicID();1985  SmallVector<Value *> Args;1986  switch (IID) {1987  case Intrinsic::pow:1988    Args.push_back(II->getArgOperand(0));1989    Args.push_back(Builder.CreateFNegFMF(II->getArgOperand(1), &I));1990    break;1991  case Intrinsic::powi: {1992    // Require 'ninf' assuming that makes powi(X, -INT_MIN) acceptable.1993    // That is, X ** (huge negative number) is 0.0, ~1.0, or INF and so1994    // dividing by that is INF, ~1.0, or 0.0. Code that uses powi allows1995    // non-standard results, so this corner case should be acceptable if the1996    // code rules out INF values.1997    if (!I.hasNoInfs())1998      return nullptr;1999    Args.push_back(II->getArgOperand(0));2000    Args.push_back(Builder.CreateNeg(II->getArgOperand(1)));2001    Type *Tys[] = {I.getType(), II->getArgOperand(1)->getType()};2002    Value *Pow = Builder.CreateIntrinsic(IID, Tys, Args, &I);2003    return BinaryOperator::CreateFMulFMF(Op0, Pow, &I);2004  }2005  case Intrinsic::exp:2006  case Intrinsic::exp2:2007    Args.push_back(Builder.CreateFNegFMF(II->getArgOperand(0), &I));2008    break;2009  default:2010    return nullptr;2011  }2012  Value *Pow = Builder.CreateIntrinsic(IID, I.getType(), Args, &I);2013  return BinaryOperator::CreateFMulFMF(Op0, Pow, &I);2014}2015 2016/// Convert div to mul if we have an sqrt divisor iff sqrt's operand is a fdiv2017/// instruction.2018static Instruction *foldFDivSqrtDivisor(BinaryOperator &I,2019                                        InstCombiner::BuilderTy &Builder) {2020  // X / sqrt(Y / Z) -->  X * sqrt(Z / Y)2021  if (!I.hasAllowReassoc() || !I.hasAllowReciprocal())2022    return nullptr;2023  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);2024  auto *II = dyn_cast<IntrinsicInst>(Op1);2025  if (!II || II->getIntrinsicID() != Intrinsic::sqrt || !II->hasOneUse() ||2026      !II->hasAllowReassoc() || !II->hasAllowReciprocal())2027    return nullptr;2028 2029  Value *Y, *Z;2030  auto *DivOp = dyn_cast<Instruction>(II->getOperand(0));2031  if (!DivOp)2032    return nullptr;2033  if (!match(DivOp, m_FDiv(m_Value(Y), m_Value(Z))))2034    return nullptr;2035  if (!DivOp->hasAllowReassoc() || !I.hasAllowReciprocal() ||2036      !DivOp->hasOneUse())2037    return nullptr;2038  Value *SwapDiv = Builder.CreateFDivFMF(Z, Y, DivOp);2039  Value *NewSqrt =2040      Builder.CreateUnaryIntrinsic(II->getIntrinsicID(), SwapDiv, II);2041  return BinaryOperator::CreateFMulFMF(Op0, NewSqrt, &I);2042}2043 2044// Change2045// X = 1/sqrt(a)2046// R1 = X * X2047// R2 = a * X2048//2049// TO2050//2051// FDiv = 1/a2052// FSqrt = sqrt(a)2053// FMul = FDiv * FSqrt2054// Replace Uses Of R1 With FDiv2055// Replace Uses Of R2 With FSqrt2056// Replace Uses Of X With FMul2057static Instruction *2058convertFSqrtDivIntoFMul(CallInst *CI, Instruction *X,2059                        const SmallPtrSetImpl<Instruction *> &R1,2060                        const SmallPtrSetImpl<Instruction *> &R2,2061                        InstCombiner::BuilderTy &B, InstCombinerImpl *IC) {2062 2063  B.SetInsertPoint(X);2064 2065  // Have an instruction that is representative of all of instructions in R1 and2066  // get the most common fpmath metadata and fast-math flags on it.2067  Value *SqrtOp = CI->getArgOperand(0);2068  auto *FDiv = cast<Instruction>(2069      B.CreateFDiv(ConstantFP::get(X->getType(), 1.0), SqrtOp));2070  auto *R1FPMathMDNode = (*R1.begin())->getMetadata(LLVMContext::MD_fpmath);2071  FastMathFlags R1FMF = (*R1.begin())->getFastMathFlags(); // Common FMF2072  for (Instruction *I : R1) {2073    R1FPMathMDNode = MDNode::getMostGenericFPMath(2074        R1FPMathMDNode, I->getMetadata(LLVMContext::MD_fpmath));2075    R1FMF &= I->getFastMathFlags();2076    IC->replaceInstUsesWith(*I, FDiv);2077    IC->eraseInstFromFunction(*I);2078  }2079  FDiv->setMetadata(LLVMContext::MD_fpmath, R1FPMathMDNode);2080  FDiv->copyFastMathFlags(R1FMF);2081 2082  // Have a single sqrt call instruction that is representative of all of2083  // instructions in R2 and get the most common fpmath metadata and fast-math2084  // flags on it.2085  auto *FSqrt = cast<CallInst>(CI->clone());2086  FSqrt->insertBefore(CI->getIterator());2087  auto *R2FPMathMDNode = (*R2.begin())->getMetadata(LLVMContext::MD_fpmath);2088  FastMathFlags R2FMF = (*R2.begin())->getFastMathFlags(); // Common FMF2089  for (Instruction *I : R2) {2090    R2FPMathMDNode = MDNode::getMostGenericFPMath(2091        R2FPMathMDNode, I->getMetadata(LLVMContext::MD_fpmath));2092    R2FMF &= I->getFastMathFlags();2093    IC->replaceInstUsesWith(*I, FSqrt);2094    IC->eraseInstFromFunction(*I);2095  }2096  FSqrt->setMetadata(LLVMContext::MD_fpmath, R2FPMathMDNode);2097  FSqrt->copyFastMathFlags(R2FMF);2098 2099  Instruction *FMul;2100  // If X = -1/sqrt(a) initially,then FMul = -(FDiv * FSqrt)2101  if (match(X, m_FDiv(m_SpecificFP(-1.0), m_Specific(CI)))) {2102    Value *Mul = B.CreateFMul(FDiv, FSqrt);2103    FMul = cast<Instruction>(B.CreateFNeg(Mul));2104  } else2105    FMul = cast<Instruction>(B.CreateFMul(FDiv, FSqrt));2106  FMul->copyMetadata(*X);2107  FMul->copyFastMathFlags(FastMathFlags::intersectRewrite(R1FMF, R2FMF) |2108                          FastMathFlags::unionValue(R1FMF, R2FMF));2109  return IC->replaceInstUsesWith(*X, FMul);2110}2111 2112Instruction *InstCombinerImpl::visitFDiv(BinaryOperator &I) {2113  Module *M = I.getModule();2114 2115  if (Value *V = simplifyFDivInst(I.getOperand(0), I.getOperand(1),2116                                  I.getFastMathFlags(),2117                                  SQ.getWithInstruction(&I)))2118    return replaceInstUsesWith(I, V);2119 2120  if (Instruction *X = foldVectorBinop(I))2121    return X;2122 2123  if (Instruction *Phi = foldBinopWithPhiOperands(I))2124    return Phi;2125 2126  if (Instruction *R = foldFDivConstantDivisor(I))2127    return R;2128 2129  if (Instruction *R = foldFDivConstantDividend(I))2130    return R;2131 2132  if (Instruction *R = foldFPSignBitOps(I))2133    return R;2134 2135  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);2136 2137  // Convert2138  // x = 1.0/sqrt(a)2139  // r1 = x * x;2140  // r2 = a/sqrt(a);2141  //2142  // TO2143  //2144  // r1 = 1/a2145  // r2 = sqrt(a)2146  // x = r1 * r22147  SmallPtrSet<Instruction *, 2> R1, R2;2148  if (isFSqrtDivToFMulLegal(&I, R1, R2)) {2149    CallInst *CI = cast<CallInst>(I.getOperand(1));2150    if (Instruction *D = convertFSqrtDivIntoFMul(CI, &I, R1, R2, Builder, this))2151      return D;2152  }2153 2154  if (isa<Constant>(Op0))2155    if (SelectInst *SI = dyn_cast<SelectInst>(Op1))2156      if (Instruction *R = FoldOpIntoSelect(I, SI))2157        return R;2158 2159  if (isa<Constant>(Op1))2160    if (SelectInst *SI = dyn_cast<SelectInst>(Op0))2161      if (Instruction *R = FoldOpIntoSelect(I, SI))2162        return R;2163 2164  if (I.hasAllowReassoc() && I.hasAllowReciprocal()) {2165    Value *X, *Y;2166    if (match(Op0, m_OneUse(m_FDiv(m_Value(X), m_Value(Y)))) &&2167        (!isa<Constant>(Y) || !isa<Constant>(Op1))) {2168      // (X / Y) / Z => X / (Y * Z)2169      Value *YZ = Builder.CreateFMulFMF(Y, Op1, &I);2170      return BinaryOperator::CreateFDivFMF(X, YZ, &I);2171    }2172    if (match(Op1, m_OneUse(m_FDiv(m_Value(X), m_Value(Y)))) &&2173        (!isa<Constant>(Y) || !isa<Constant>(Op0))) {2174      // Z / (X / Y) => (Y * Z) / X2175      Value *YZ = Builder.CreateFMulFMF(Y, Op0, &I);2176      return BinaryOperator::CreateFDivFMF(YZ, X, &I);2177    }2178    // Z / (1.0 / Y) => (Y * Z)2179    //2180    // This is a special case of Z / (X / Y) => (Y * Z) / X, with X = 1.0. The2181    // m_OneUse check is avoided because even in the case of the multiple uses2182    // for 1.0/Y, the number of instructions remain the same and a division is2183    // replaced by a multiplication.2184    if (match(Op1, m_FDiv(m_SpecificFP(1.0), m_Value(Y))))2185      return BinaryOperator::CreateFMulFMF(Y, Op0, &I);2186  }2187 2188  if (I.hasAllowReassoc() && Op0->hasOneUse() && Op1->hasOneUse()) {2189    // sin(X) / cos(X) -> tan(X)2190    // cos(X) / sin(X) -> 1/tan(X) (cotangent)2191    Value *X;2192    bool IsTan = match(Op0, m_Intrinsic<Intrinsic::sin>(m_Value(X))) &&2193                 match(Op1, m_Intrinsic<Intrinsic::cos>(m_Specific(X)));2194    bool IsCot =2195        !IsTan && match(Op0, m_Intrinsic<Intrinsic::cos>(m_Value(X))) &&2196                  match(Op1, m_Intrinsic<Intrinsic::sin>(m_Specific(X)));2197 2198    if ((IsTan || IsCot) && hasFloatFn(M, &TLI, I.getType(), LibFunc_tan,2199                                       LibFunc_tanf, LibFunc_tanl)) {2200      IRBuilder<> B(&I);2201      IRBuilder<>::FastMathFlagGuard FMFGuard(B);2202      B.setFastMathFlags(I.getFastMathFlags());2203      AttributeList Attrs =2204          cast<CallBase>(Op0)->getCalledFunction()->getAttributes();2205      Value *Res = emitUnaryFloatFnCall(X, &TLI, LibFunc_tan, LibFunc_tanf,2206                                        LibFunc_tanl, B, Attrs);2207      if (IsCot)2208        Res = B.CreateFDiv(ConstantFP::get(I.getType(), 1.0), Res);2209      return replaceInstUsesWith(I, Res);2210    }2211  }2212 2213  // X / (X * Y) --> 1.0 / Y2214  // Reassociate to (X / X -> 1.0) is legal when NaNs are not allowed.2215  // We can ignore the possibility that X is infinity because INF/INF is NaN.2216  Value *X, *Y;2217  if (I.hasNoNaNs() && I.hasAllowReassoc() &&2218      match(Op1, m_c_FMul(m_Specific(Op0), m_Value(Y)))) {2219    replaceOperand(I, 0, ConstantFP::get(I.getType(), 1.0));2220    replaceOperand(I, 1, Y);2221    return &I;2222  }2223 2224  // X / fabs(X) -> copysign(1.0, X)2225  // fabs(X) / X -> copysign(1.0, X)2226  if (I.hasNoNaNs() && I.hasNoInfs() &&2227      (match(&I, m_FDiv(m_Value(X), m_FAbs(m_Deferred(X)))) ||2228       match(&I, m_FDiv(m_FAbs(m_Value(X)), m_Deferred(X))))) {2229    Value *V = Builder.CreateBinaryIntrinsic(2230        Intrinsic::copysign, ConstantFP::get(I.getType(), 1.0), X, &I);2231    return replaceInstUsesWith(I, V);2232  }2233 2234  if (Instruction *Mul = foldFDivPowDivisor(I, Builder))2235    return Mul;2236 2237  if (Instruction *Mul = foldFDivSqrtDivisor(I, Builder))2238    return Mul;2239 2240  // pow(X, Y) / X --> pow(X, Y-1)2241  if (I.hasAllowReassoc() &&2242      match(Op0, m_OneUse(m_Intrinsic<Intrinsic::pow>(m_Specific(Op1),2243                                                      m_Value(Y))))) {2244    Value *Y1 =2245        Builder.CreateFAddFMF(Y, ConstantFP::get(I.getType(), -1.0), &I);2246    Value *Pow = Builder.CreateBinaryIntrinsic(Intrinsic::pow, Op1, Y1, &I);2247    return replaceInstUsesWith(I, Pow);2248  }2249 2250  if (Instruction *FoldedPowi = foldPowiReassoc(I))2251    return FoldedPowi;2252 2253  return nullptr;2254}2255 2256// Variety of transform for:2257//  (urem/srem (mul X, Y), (mul X, Z))2258//  (urem/srem (shl X, Y), (shl X, Z))2259//  (urem/srem (shl Y, X), (shl Z, X))2260// NB: The shift cases are really just extensions of the mul case. We treat2261// shift as Val * (1 << Amt).2262static Instruction *simplifyIRemMulShl(BinaryOperator &I,2263                                       InstCombinerImpl &IC) {2264  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *X = nullptr;2265  APInt Y, Z;2266  bool ShiftByX = false;2267 2268  // If V is not nullptr, it will be matched using m_Specific.2269  auto MatchShiftOrMulXC = [](Value *Op, Value *&V, APInt &C,2270                              bool &PreserveNSW) -> bool {2271    const APInt *Tmp = nullptr;2272    if ((!V && match(Op, m_Mul(m_Value(V), m_APInt(Tmp)))) ||2273        (V && match(Op, m_Mul(m_Specific(V), m_APInt(Tmp)))))2274      C = *Tmp;2275    else if ((!V && match(Op, m_Shl(m_Value(V), m_APInt(Tmp)))) ||2276             (V && match(Op, m_Shl(m_Specific(V), m_APInt(Tmp))))) {2277      C = APInt(Tmp->getBitWidth(), 1) << *Tmp;2278      // We cannot preserve NSW when shifting by BW - 1.2279      PreserveNSW = Tmp->ult(Tmp->getBitWidth() - 1);2280    }2281    if (Tmp != nullptr)2282      return true;2283 2284    // Reset `V` so we don't start with specific value on next match attempt.2285    V = nullptr;2286    return false;2287  };2288 2289  auto MatchShiftCX = [](Value *Op, APInt &C, Value *&V) -> bool {2290    const APInt *Tmp = nullptr;2291    if ((!V && match(Op, m_Shl(m_APInt(Tmp), m_Value(V)))) ||2292        (V && match(Op, m_Shl(m_APInt(Tmp), m_Specific(V))))) {2293      C = *Tmp;2294      return true;2295    }2296 2297    // Reset `V` so we don't start with specific value on next match attempt.2298    V = nullptr;2299    return false;2300  };2301 2302  bool Op0PreserveNSW = true, Op1PreserveNSW = true;2303  if (MatchShiftOrMulXC(Op0, X, Y, Op0PreserveNSW) &&2304      MatchShiftOrMulXC(Op1, X, Z, Op1PreserveNSW)) {2305    // pass2306  } else if (MatchShiftCX(Op0, Y, X) && MatchShiftCX(Op1, Z, X)) {2307    ShiftByX = true;2308  } else {2309    return nullptr;2310  }2311 2312  bool IsSRem = I.getOpcode() == Instruction::SRem;2313 2314  OverflowingBinaryOperator *BO0 = cast<OverflowingBinaryOperator>(Op0);2315  // TODO: We may be able to deduce more about nsw/nuw of BO0/BO1 based on Y >=2316  // Z or Z >= Y.2317  bool BO0HasNSW = Op0PreserveNSW && BO0->hasNoSignedWrap();2318  bool BO0HasNUW = BO0->hasNoUnsignedWrap();2319  bool BO0NoWrap = IsSRem ? BO0HasNSW : BO0HasNUW;2320 2321  APInt RemYZ = IsSRem ? Y.srem(Z) : Y.urem(Z);2322  // (rem (mul nuw/nsw X, Y), (mul X, Z))2323  //      if (rem Y, Z) == 02324  //          -> 02325  if (RemYZ.isZero() && BO0NoWrap)2326    return IC.replaceInstUsesWith(I, ConstantInt::getNullValue(I.getType()));2327 2328  // Helper function to emit either (RemSimplificationC << X) or2329  // (RemSimplificationC * X) depending on whether we matched Op0/Op1 as2330  // (shl V, X) or (mul V, X) respectively.2331  auto CreateMulOrShift =2332      [&](const APInt &RemSimplificationC) -> BinaryOperator * {2333    Value *RemSimplification =2334        ConstantInt::get(I.getType(), RemSimplificationC);2335    return ShiftByX ? BinaryOperator::CreateShl(RemSimplification, X)2336                    : BinaryOperator::CreateMul(X, RemSimplification);2337  };2338 2339  OverflowingBinaryOperator *BO1 = cast<OverflowingBinaryOperator>(Op1);2340  bool BO1HasNSW = Op1PreserveNSW && BO1->hasNoSignedWrap();2341  bool BO1HasNUW = BO1->hasNoUnsignedWrap();2342  bool BO1NoWrap = IsSRem ? BO1HasNSW : BO1HasNUW;2343  // (rem (mul X, Y), (mul nuw/nsw X, Z))2344  //      if (rem Y, Z) == Y2345  //          -> (mul nuw/nsw X, Y)2346  if (RemYZ == Y && BO1NoWrap) {2347    BinaryOperator *BO = CreateMulOrShift(Y);2348    // Copy any overflow flags from Op0.2349    BO->setHasNoSignedWrap(IsSRem || BO0HasNSW);2350    BO->setHasNoUnsignedWrap(!IsSRem || BO0HasNUW);2351    return BO;2352  }2353 2354  // (rem (mul nuw/nsw X, Y), (mul {nsw} X, Z))2355  //      if Y >= Z2356  //          -> (mul {nuw} nsw X, (rem Y, Z))2357  if (Y.uge(Z) && (IsSRem ? (BO0HasNSW && BO1HasNSW) : BO0HasNUW)) {2358    BinaryOperator *BO = CreateMulOrShift(RemYZ);2359    BO->setHasNoSignedWrap();2360    BO->setHasNoUnsignedWrap(BO0HasNUW);2361    return BO;2362  }2363 2364  return nullptr;2365}2366 2367/// This function implements the transforms common to both integer remainder2368/// instructions (urem and srem). It is called by the visitors to those integer2369/// remainder instructions.2370/// Common integer remainder transforms2371Instruction *InstCombinerImpl::commonIRemTransforms(BinaryOperator &I) {2372  if (Instruction *Res = commonIDivRemTransforms(I))2373    return Res;2374 2375  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);2376 2377  if (isa<Constant>(Op1)) {2378    if (Instruction *Op0I = dyn_cast<Instruction>(Op0)) {2379      if (SelectInst *SI = dyn_cast<SelectInst>(Op0I)) {2380        if (Instruction *R = FoldOpIntoSelect(I, SI))2381          return R;2382      } else if (auto *PN = dyn_cast<PHINode>(Op0I)) {2383        const APInt *Op1Int;2384        if (match(Op1, m_APInt(Op1Int)) && !Op1Int->isMinValue() &&2385            (I.getOpcode() == Instruction::URem ||2386             !Op1Int->isMinSignedValue())) {2387          // foldOpIntoPhi will speculate instructions to the end of the PHI's2388          // predecessor blocks, so do this only if we know the srem or urem2389          // will not fault.2390          if (Instruction *NV = foldOpIntoPhi(I, PN))2391            return NV;2392        }2393      }2394 2395      // See if we can fold away this rem instruction.2396      if (SimplifyDemandedInstructionBits(I))2397        return &I;2398    }2399  }2400 2401  if (Instruction *R = simplifyIRemMulShl(I, *this))2402    return R;2403 2404  return nullptr;2405}2406 2407Instruction *InstCombinerImpl::visitURem(BinaryOperator &I) {2408  if (Value *V = simplifyURemInst(I.getOperand(0), I.getOperand(1),2409                                  SQ.getWithInstruction(&I)))2410    return replaceInstUsesWith(I, V);2411 2412  if (Instruction *X = foldVectorBinop(I))2413    return X;2414 2415  if (Instruction *common = commonIRemTransforms(I))2416    return common;2417 2418  if (Instruction *NarrowRem = narrowUDivURem(I, *this))2419    return NarrowRem;2420 2421  // X urem Y -> X and Y-1, where Y is a power of 2,2422  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);2423  Type *Ty = I.getType();2424  if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/ true, &I)) {2425    // This may increase instruction count, we don't enforce that Y is a2426    // constant.2427    Constant *N1 = Constant::getAllOnesValue(Ty);2428    Value *Add = Builder.CreateAdd(Op1, N1);2429    return BinaryOperator::CreateAnd(Op0, Add);2430  }2431 2432  // 1 urem X -> zext(X != 1)2433  if (match(Op0, m_One())) {2434    Value *Cmp = Builder.CreateICmpNE(Op1, ConstantInt::get(Ty, 1));2435    return CastInst::CreateZExtOrBitCast(Cmp, Ty);2436  }2437 2438  // Op0 urem C -> Op0 < C ? Op0 : Op0 - C, where C >= signbit.2439  // Op0 must be frozen because we are increasing its number of uses.2440  if (match(Op1, m_Negative())) {2441    Value *F0 = Op0;2442    if (!isGuaranteedNotToBeUndef(Op0))2443      F0 = Builder.CreateFreeze(Op0, Op0->getName() + ".fr");2444    Value *Cmp = Builder.CreateICmpULT(F0, Op1);2445    Value *Sub = Builder.CreateSub(F0, Op1);2446    return SelectInst::Create(Cmp, F0, Sub);2447  }2448 2449  // If the divisor is a sext of a boolean, then the divisor must be max2450  // unsigned value (-1). Therefore, the remainder is Op0 unless Op0 is also2451  // max unsigned value. In that case, the remainder is 0:2452  // urem Op0, (sext i1 X) --> (Op0 == -1) ? 0 : Op02453  Value *X;2454  if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)) {2455    Value *FrozenOp0 = Op0;2456    if (!isGuaranteedNotToBeUndef(Op0))2457      FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");2458    Value *Cmp =2459        Builder.CreateICmpEQ(FrozenOp0, ConstantInt::getAllOnesValue(Ty));2460    return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), FrozenOp0);2461  }2462 2463  // For "(X + 1) % Op1" and if (X u< Op1) => (X + 1) == Op1 ? 0 : X + 1 .2464  if (match(Op0, m_Add(m_Value(X), m_One()))) {2465    Value *Val =2466        simplifyICmpInst(ICmpInst::ICMP_ULT, X, Op1, SQ.getWithInstruction(&I));2467    if (Val && match(Val, m_One())) {2468      Value *FrozenOp0 = Op0;2469      if (!isGuaranteedNotToBeUndef(Op0))2470        FrozenOp0 = Builder.CreateFreeze(Op0, Op0->getName() + ".frozen");2471      Value *Cmp = Builder.CreateICmpEQ(FrozenOp0, Op1);2472      return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), FrozenOp0);2473    }2474  }2475 2476  return nullptr;2477}2478 2479Instruction *InstCombinerImpl::visitSRem(BinaryOperator &I) {2480  if (Value *V = simplifySRemInst(I.getOperand(0), I.getOperand(1),2481                                  SQ.getWithInstruction(&I)))2482    return replaceInstUsesWith(I, V);2483 2484  if (Instruction *X = foldVectorBinop(I))2485    return X;2486 2487  // Handle the integer rem common cases2488  if (Instruction *Common = commonIRemTransforms(I))2489    return Common;2490 2491  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);2492  {2493    const APInt *Y;2494    // X % -Y -> X % Y2495    if (match(Op1, m_Negative(Y)) && !Y->isMinSignedValue())2496      return replaceOperand(I, 1, ConstantInt::get(I.getType(), -*Y));2497  }2498 2499  // -X srem Y --> -(X srem Y)2500  Value *X, *Y;2501  if (match(&I, m_SRem(m_OneUse(m_NSWNeg(m_Value(X))), m_Value(Y))))2502    return BinaryOperator::CreateNSWNeg(Builder.CreateSRem(X, Y));2503 2504  // If the sign bits of both operands are zero (i.e. we can prove they are2505  // unsigned inputs), turn this into a urem.2506  APInt Mask(APInt::getSignMask(I.getType()->getScalarSizeInBits()));2507  if (MaskedValueIsZero(Op1, Mask, &I) && MaskedValueIsZero(Op0, Mask, &I)) {2508    // X srem Y -> X urem Y, iff X and Y don't have sign bit set2509    return BinaryOperator::CreateURem(Op0, Op1, I.getName());2510  }2511 2512  // If it's a constant vector, flip any negative values positive.2513  if (isa<ConstantVector>(Op1) || isa<ConstantDataVector>(Op1)) {2514    Constant *C = cast<Constant>(Op1);2515    unsigned VWidth = cast<FixedVectorType>(C->getType())->getNumElements();2516 2517    bool hasNegative = false;2518    bool hasMissing = false;2519    for (unsigned i = 0; i != VWidth; ++i) {2520      Constant *Elt = C->getAggregateElement(i);2521      if (!Elt) {2522        hasMissing = true;2523        break;2524      }2525 2526      if (ConstantInt *RHS = dyn_cast<ConstantInt>(Elt))2527        if (RHS->isNegative())2528          hasNegative = true;2529    }2530 2531    if (hasNegative && !hasMissing) {2532      SmallVector<Constant *, 16> Elts(VWidth);2533      for (unsigned i = 0; i != VWidth; ++i) {2534        Elts[i] = C->getAggregateElement(i);  // Handle undef, etc.2535        if (ConstantInt *RHS = dyn_cast<ConstantInt>(Elts[i])) {2536          if (RHS->isNegative())2537            Elts[i] = cast<ConstantInt>(ConstantExpr::getNeg(RHS));2538        }2539      }2540 2541      Constant *NewRHSV = ConstantVector::get(Elts);2542      if (NewRHSV != C)  // Don't loop on -MININT2543        return replaceOperand(I, 1, NewRHSV);2544    }2545  }2546 2547  return nullptr;2548}2549 2550Instruction *InstCombinerImpl::visitFRem(BinaryOperator &I) {2551  if (Value *V = simplifyFRemInst(I.getOperand(0), I.getOperand(1),2552                                  I.getFastMathFlags(),2553                                  SQ.getWithInstruction(&I)))2554    return replaceInstUsesWith(I, V);2555 2556  if (Instruction *X = foldVectorBinop(I))2557    return X;2558 2559  if (Instruction *Phi = foldBinopWithPhiOperands(I))2560    return Phi;2561 2562  return nullptr;2563}2564