diff options
| author | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2019-08-16 13:16:48 +0000 | 
|---|---|---|
| committer | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2019-08-16 13:16:48 +0000 | 
| commit | 9dddd26e31ae9a79008ee99697d52bc565a95411 (patch) | |
| tree | 7232aad602f893c4f2d03bffd599ab071cc8d863 /llvm/lib | |
| parent | 6a75061e36fe1998e51ba9de2702f756b6ad5a8e (diff) | |
| download | bcm5719-llvm-9dddd26e31ae9a79008ee99697d52bc565a95411.tar.gz bcm5719-llvm-9dddd26e31ae9a79008ee99697d52bc565a95411.zip | |
[DAGCombiner] Add simple folds for SMULFIX/UMULFIX/SMULFIXSAT
Summary:
Add the following DAGCombiner folds for mulfix being
one of SMULFIX/UMULFIX/SMULFIXSAT:
  (mulfix x, undef, scale) -> 0
  (mulfix x, 0, scale) -> 0
Also added canonicalization of constants to RHS.
Reviewers: RKSimon, craig.topper, spatel
Reviewed By: RKSimon
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66052
llvm-svn: 369103
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 84ff85cd8fe..8bcdda4e00a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -379,6 +379,7 @@ namespace {      SDValue visitSUBE(SDNode *N);      SDValue visitSUBCARRY(SDNode *N);      SDValue visitMUL(SDNode *N); +    SDValue visitMULFIX(SDNode *N);      SDValue useDivRem(SDNode *N);      SDValue visitSDIV(SDNode *N);      SDValue visitSDIVLike(SDValue N0, SDValue N1, SDNode *N); @@ -1696,6 +1697,9 @@ SDValue DAGCombiner::visit(SDNode *N) {    case ISD::ADDCARRY:           return visitADDCARRY(N);    case ISD::SUBE:               return visitSUBE(N);    case ISD::SUBCARRY:           return visitSUBCARRY(N); +  case ISD::SMULFIX: +  case ISD::SMULFIXSAT: +  case ISD::UMULFIX:            return visitMULFIX(N);    case ISD::MUL:                return visitMUL(N);    case ISD::SDIV:               return visitSDIV(N);    case ISD::UDIV:               return visitUDIV(N); @@ -3465,6 +3469,29 @@ SDValue DAGCombiner::visitSUBCARRY(SDNode *N) {    return SDValue();  } +// Notice that "mulfix" can be any of SMULFIX, SMULFIXSAT and UMULFIX here. +SDValue DAGCombiner::visitMULFIX(SDNode *N) { +  SDValue N0 = N->getOperand(0); +  SDValue N1 = N->getOperand(1); +  SDValue Scale = N->getOperand(2); +  EVT VT = N0.getValueType(); + +  // fold (mulfix x, undef, scale) -> 0 +  if (N0.isUndef() || N1.isUndef()) +    return DAG.getConstant(0, SDLoc(N), VT); + +  // Canonicalize constant to RHS (vector doesn't have to splat) +  if (DAG.isConstantIntBuildVectorOrConstantInt(N0) && +     !DAG.isConstantIntBuildVectorOrConstantInt(N1)) +    return DAG.getNode(N->getOpcode(), SDLoc(N), VT, N1, N0, Scale); + +  // fold (mulfix x, 0, scale) -> 0 +  if (isNullConstant(N1)) +    return DAG.getConstant(0, SDLoc(N), VT); + +  return SDValue(); +} +  SDValue DAGCombiner::visitMUL(SDNode *N) {    SDValue N0 = N->getOperand(0);    SDValue N1 = N->getOperand(1); | 

