diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2018-10-04 19:12:07 +0000 | 
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2018-10-04 19:12:07 +0000 | 
| commit | 9d6688e38d250d071613162daaf1035daca2d0b9 (patch) | |
| tree | 77e762c6fced11a57ba16f9b43e53755877e18e0 /llvm/lib | |
| parent | 0d1bb79a0413f221432a7b1d0d2d10c84c4bbb99 (diff) | |
| download | bcm5719-llvm-9d6688e38d250d071613162daaf1035daca2d0b9.tar.gz bcm5719-llvm-9d6688e38d250d071613162daaf1035daca2d0b9.zip | |
[InstCombine] reduce code duplication in SimplifyDemandedVectorElts; NFCI
llvm-svn: 343806
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 133 | 
1 files changed, 42 insertions, 91 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 1b5e28ff17f..f8b57eeb388 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -1052,8 +1052,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,    UndefElts = 0; -  // Handle ConstantAggregateZero, ConstantVector, ConstantDataSequential. -  if (Constant *C = dyn_cast<Constant>(V)) { +  if (auto *C = dyn_cast<Constant>(V)) {      // Check if this is identity. If so, return 0 since we are not simplifying      // anything.      if (DemandedElts.isAllOnesValue()) @@ -1061,7 +1060,6 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      Type *EltTy = cast<VectorType>(V->getType())->getElementType();      Constant *Undef = UndefValue::get(EltTy); -      SmallVector<Constant*, 16> Elts;      for (unsigned i = 0; i != VWidth; ++i) {        if (!DemandedElts[i]) {   // If not demanded, set to undef. @@ -1109,9 +1107,21 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,    if (!I) return nullptr;        // Only analyze instructions.    bool MadeChange = false; +  auto simplifyAndSetOp = [&](Instruction *Inst, unsigned OpNum, +                              APInt Demanded, APInt &Undef) { +    auto *II = dyn_cast<IntrinsicInst>(Inst); +    Value *Op = II ? II->getArgOperand(OpNum) : Inst->getOperand(OpNum); +    if (Value *V = SimplifyDemandedVectorElts(Op, Demanded, Undef, Depth + 1)) { +      if (II) +        II->setArgOperand(OpNum, V); +      else +        Inst->setOperand(OpNum, V); +      MadeChange = true; +    } +  }; +    APInt UndefElts2(VWidth, 0);    APInt UndefElts3(VWidth, 0); -  Value *TmpV;    switch (I->getOpcode()) {    default: break; @@ -1122,9 +1132,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      if (!Idx) {        // Note that we can't propagate undef elt info, because we don't know        // which elt is getting updated. -      TmpV = SimplifyDemandedVectorElts(I->getOperand(0), DemandedElts, -                                        UndefElts2, Depth + 1); -      if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(I, 0, DemandedElts, UndefElts2);        break;      } @@ -1134,9 +1142,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      APInt PreInsertDemandedElts = DemandedElts;      if (IdxNo < VWidth)        PreInsertDemandedElts.clearBit(IdxNo); -    TmpV = SimplifyDemandedVectorElts(I->getOperand(0), PreInsertDemandedElts, -                                      UndefElts, Depth + 1); -    if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } + +    simplifyAndSetOp(I, 0, PreInsertDemandedElts, UndefElts);      // If this is inserting an element that isn't demanded, remove this      // insertelement. @@ -1169,14 +1176,10 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      }      APInt LHSUndefElts(LHSVWidth, 0); -    TmpV = SimplifyDemandedVectorElts(I->getOperand(0), LeftDemanded, -                                      LHSUndefElts, Depth + 1); -    if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } +    simplifyAndSetOp(I, 0, LeftDemanded, LHSUndefElts);      APInt RHSUndefElts(LHSVWidth, 0); -    TmpV = SimplifyDemandedVectorElts(I->getOperand(1), RightDemanded, -                                      RHSUndefElts, Depth + 1); -    if (TmpV) { I->setOperand(1, TmpV); MadeChange = true; } +    simplifyAndSetOp(I, 1, RightDemanded, RHSUndefElts);      bool NewUndefElts = false;      unsigned LHSIdx = -1u, LHSValIdx = -1u; @@ -1269,12 +1272,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // element of the select condition is known undef, then we are free to        // choose the output value from either arm of the select. If we know that        // one of those values is undef, then the output can be undef. -      if (Value *V = SimplifyDemandedVectorElts(Sel->getCondition(), -                                                DemandedElts, UndefElts, -                                                Depth + 1)) { -        Sel->setCondition(V); -        MadeChange = true; -      } +      simplifyAndSetOp(I, 0, DemandedElts, UndefElts);      }      // Next, see if we can transform the arms of the select. @@ -1296,17 +1294,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        }      } -    if (Value *V = SimplifyDemandedVectorElts(Sel->getTrueValue(), DemandedLHS, -                                              UndefElts2, Depth + 1)) { -      Sel->setTrueValue(V); -      MadeChange = true; -    } - -    if (Value *V = SimplifyDemandedVectorElts(Sel->getFalseValue(), DemandedRHS, -                                              UndefElts3, Depth + 1)) { -      Sel->setFalseValue(V); -      MadeChange = true; -    } +    simplifyAndSetOp(I, 1, DemandedLHS, UndefElts2); +    simplifyAndSetOp(I, 2, DemandedRHS, UndefElts3);      // Output elements are undefined if the element from each arm is undefined.      // TODO: This can be improved. See comment in select condition handling. @@ -1348,12 +1337,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        break;      } -    TmpV = SimplifyDemandedVectorElts(I->getOperand(0), InputDemandedElts, -                                      UndefElts2, Depth + 1); -    if (TmpV) { -      I->setOperand(0, TmpV); -      MadeChange = true; -    } +    simplifyAndSetOp(I, 0, InputDemandedElts, UndefElts2);      if (VWidth == InVWidth) {        UndefElts = UndefElts2; @@ -1380,9 +1364,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,    }    case Instruction::FPTrunc:    case Instruction::FPExt: -    TmpV = SimplifyDemandedVectorElts(I->getOperand(0), DemandedElts, UndefElts, -                                      Depth + 1); -    if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } +    simplifyAndSetOp(I, 0, DemandedElts, UndefElts);      break;    case Instruction::Call: { @@ -1402,9 +1384,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // Only the lower element is used.        DemandedElts = 1; -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0), DemandedElts, -                                        UndefElts, Depth + 1); -      if (TmpV) { II->setArgOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 0, DemandedElts, UndefElts);        // Only the lower element is undefined. The high elements are zero.        UndefElts = UndefElts[0]; @@ -1413,9 +1393,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      // Unary scalar-as-vector operations that work column-wise.      case Intrinsic::x86_sse_rcp_ss:      case Intrinsic::x86_sse_rsqrt_ss: -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0), DemandedElts, -                                        UndefElts, Depth + 1); -      if (TmpV) { II->setArgOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 0, DemandedElts, UndefElts);        // If lowest element of a scalar op isn't used then use Arg0.        if (!DemandedElts[0]) { @@ -1435,9 +1413,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      case Intrinsic::x86_sse2_min_sd:      case Intrinsic::x86_sse2_max_sd:      case Intrinsic::x86_sse2_cmp_sd: { -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0), DemandedElts, -                                        UndefElts, Depth + 1); -      if (TmpV) { II->setArgOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 0, DemandedElts, UndefElts);        // If lowest element of a scalar op isn't used then use Arg0.        if (!DemandedElts[0]) { @@ -1447,9 +1423,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // Only lower element is used for operand 1.        DemandedElts = 1; -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(1), DemandedElts, -                                        UndefElts2, Depth + 1); -      if (TmpV) { II->setArgOperand(1, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 1, DemandedElts, UndefElts2);        // Lower element is undefined if both lower elements are undefined.        // Consider things like undef&0.  The result is known zero, not undef. @@ -1466,9 +1440,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // Don't use the low element of operand 0.        APInt DemandedElts2 = DemandedElts;        DemandedElts2.clearBit(0); -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0), DemandedElts2, -                                        UndefElts, Depth + 1); -      if (TmpV) { II->setArgOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 0, DemandedElts2, UndefElts);        // If lowest element of a scalar op isn't used then use Arg0.        if (!DemandedElts[0]) { @@ -1478,9 +1450,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // Only lower element is used for operand 1.        DemandedElts = 1; -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(1), DemandedElts, -                                        UndefElts2, Depth + 1); -      if (TmpV) { II->setArgOperand(1, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 1, DemandedElts, UndefElts2);        // Take the high undef elements from operand 0 and take the lower element        // from operand 1. @@ -1504,9 +1474,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      case Intrinsic::x86_avx512_mask_sub_sd_round:      case Intrinsic::x86_avx512_mask_max_sd_round:      case Intrinsic::x86_avx512_mask_min_sd_round: -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0), DemandedElts, -                                        UndefElts, Depth + 1); -      if (TmpV) { II->setArgOperand(0, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 0, DemandedElts, UndefElts);        // If lowest element of a scalar op isn't used then use Arg0.        if (!DemandedElts[0]) { @@ -1516,12 +1484,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        // Only lower element is used for operand 1 and 2.        DemandedElts = 1; -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(1), DemandedElts, -                                        UndefElts2, Depth + 1); -      if (TmpV) { II->setArgOperand(1, TmpV); MadeChange = true; } -      TmpV = SimplifyDemandedVectorElts(II->getArgOperand(2), DemandedElts, -                                        UndefElts3, Depth + 1); -      if (TmpV) { II->setArgOperand(2, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 1, DemandedElts, UndefElts2); +      simplifyAndSetOp(II, 2, DemandedElts, UndefElts3);        // Lower element is undefined if all three lower elements are undefined.        // Consider things like undef&0.  The result is known zero, not undef. @@ -1566,14 +1530,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,          }          // Demand elements from the operand. -        auto *Op = II->getArgOperand(OpNum);          APInt OpUndefElts(InnerVWidth, 0); -        TmpV = SimplifyDemandedVectorElts(Op, OpDemandedElts, OpUndefElts, -                                          Depth + 1); -        if (TmpV) { -          II->setArgOperand(OpNum, TmpV); -          MadeChange = true; -        } +        simplifyAndSetOp(II, OpNum, OpDemandedElts, OpUndefElts);          // Pack the operand's UNDEF elements, one lane at a time.          OpUndefElts = OpUndefElts.zext(VWidth); @@ -1601,10 +1559,7 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,      // PERMV      case Intrinsic::x86_avx2_permd:      case Intrinsic::x86_avx2_permps: { -      Value *Op1 = II->getArgOperand(1); -      TmpV = SimplifyDemandedVectorElts(Op1, DemandedElts, UndefElts, -                                        Depth + 1); -      if (TmpV) { II->setArgOperand(1, TmpV); MadeChange = true; } +      simplifyAndSetOp(II, 1, DemandedElts, UndefElts);        break;      } @@ -1625,27 +1580,23 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,        break;      } -    } +    } // switch on IntrinsicID      break; -  } -  } +  } // case Call +  } // switch on Opcode    // TODO: We bail completely on integer div/rem and shifts because they have    // UB/poison potential, but that should be refined.    BinaryOperator *BO;    if (match(I, m_BinOp(BO)) && !BO->isIntDivRem() && !BO->isShift()) { -    TmpV = SimplifyDemandedVectorElts(I->getOperand(0), DemandedElts, UndefElts, -                                      Depth + 1); -    if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } -    TmpV = SimplifyDemandedVectorElts(I->getOperand(1), DemandedElts, -                                      UndefElts2, Depth + 1); -    if (TmpV) { I->setOperand(1, TmpV); MadeChange = true; } +    simplifyAndSetOp(I, 0, DemandedElts, UndefElts); +    simplifyAndSetOp(I, 1, DemandedElts, UndefElts2);      // TODO: If this is a potentially poison-producing instruction, we need      // to drop the wrapping/exact flags? -    // Output elements are undefined if both are undefined.  Consider things -    // like undef&0.  The result is known zero, not undef. +    // Output elements are undefined if both are undefined. Consider things +    // like undef & 0. The result is known zero, not undef.      UndefElts &= UndefElts2;    } | 

