diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index fb51a4eb1421..a0967f574006 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -1028,13 +1028,13 @@ SDValue DAGCombiner::PromoteOperand(SDValue Op, EVT PVT, bool &Replace) {    switch (Opc) {    default: break;    case ISD::AssertSext: -    return DAG.getNode(ISD::AssertSext, DL, PVT, -                       SExtPromoteOperand(Op.getOperand(0), PVT), -                       Op.getOperand(1)); +    if (SDValue Op0 = SExtPromoteOperand(Op.getOperand(0), PVT)) +      return DAG.getNode(ISD::AssertSext, DL, PVT, Op0, Op.getOperand(1)); +    break;    case ISD::AssertZext: -    return DAG.getNode(ISD::AssertZext, DL, PVT, -                       ZExtPromoteOperand(Op.getOperand(0), PVT), -                       Op.getOperand(1)); +    if (SDValue Op0 = ZExtPromoteOperand(Op.getOperand(0), PVT)) +      return DAG.getNode(ISD::AssertZext, DL, PVT, Op0, Op.getOperand(1)); +    break;    case ISD::Constant: {      unsigned ExtOpc =        Op.getValueType().isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; @@ -1563,7 +1563,7 @@ SDValue DAGCombiner::combine(SDNode *N) {    // If N is a commutative binary node, try commuting it to enable more    // sdisel CSE. -  if (!RV.getNode() && SelectionDAG::isCommutativeBinOp(N->getOpcode()) && +  if (!RV.getNode() && TLI.isCommutativeBinOp(N->getOpcode()) &&        N->getNumValues() == 1) {      SDValue N0 = N->getOperand(0);      SDValue N1 = N->getOperand(1); @@ -12488,12 +12488,18 @@ void DAGCombiner::getStoreMergeCandidates(    if (BasePtr.Base.isUndef())      return; -  bool IsLoadSrc = isa<LoadSDNode>(St->getValue());    bool IsConstantSrc = isa<ConstantSDNode>(St->getValue()) ||                         isa<ConstantFPSDNode>(St->getValue());    bool IsExtractVecSrc =        (St->getValue().getOpcode() == ISD::EXTRACT_VECTOR_ELT ||         St->getValue().getOpcode() == ISD::EXTRACT_SUBVECTOR); +  bool IsLoadSrc = isa<LoadSDNode>(St->getValue()); +  BaseIndexOffset LBasePtr; +  // Match on loadbaseptr if relevant. +  if (IsLoadSrc) +    LBasePtr = BaseIndexOffset::match( +        cast<LoadSDNode>(St->getValue())->getBasePtr(), DAG); +    auto CandidateMatch = [&](StoreSDNode *Other, BaseIndexOffset &Ptr) -> bool {      if (Other->isVolatile() || Other->isIndexed())        return false; @@ -12502,9 +12508,15 @@ void DAGCombiner::getStoreMergeCandidates(        if (!(MemVT.isInteger() && MemVT.bitsEq(Other->getMemoryVT()) &&              isa<ConstantFPSDNode>(Other->getValue())))          return false; -    if (IsLoadSrc) -      if (!isa<LoadSDNode>(Other->getValue())) +    if (IsLoadSrc) { +      // The Load's Base Ptr must also match +      if (LoadSDNode *OtherLd = dyn_cast<LoadSDNode>(Other->getValue())) { +        auto LPtr = BaseIndexOffset::match(OtherLd->getBasePtr(), DAG); +        if (!(LBasePtr.equalBaseIndex(LPtr))) +          return false; +      } else          return false; +    }      if (IsConstantSrc)        if (!(isa<ConstantSDNode>(Other->getValue()) ||              isa<ConstantFPSDNode>(Other->getValue())))  | 
