diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 26 | 
1 files changed, 25 insertions, 1 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 636fa6c1dab..eb089e5201f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1471,12 +1471,36 @@ bool TargetLowering::SimplifyDemandedBits(        if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,                                 KnownSrcBits, TLO, Depth + 1))          return true; +    } else if ((NumSrcEltBits % BitWidth) == 0 && +               TLO.DAG.getDataLayout().isLittleEndian()) { +      unsigned Scale = NumSrcEltBits / BitWidth; +      unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1; +      APInt DemandedSrcBits = APInt::getNullValue(NumSrcEltBits); +      APInt DemandedSrcElts = APInt::getNullValue(NumSrcElts); +      for (unsigned i = 0; i != NumElts; ++i) +        if (DemandedElts[i]) { +          unsigned Offset = (i % Scale) * BitWidth; +          DemandedSrcBits.insertBits(DemandedBits, Offset); +          DemandedSrcElts.setBit(i / Scale); +        } + +      if (SrcVT.isVector()) { +        APInt KnownSrcUndef, KnownSrcZero; +        if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef, +                                       KnownSrcZero, TLO, Depth + 1)) +          return true; +      } + +      KnownBits KnownSrcBits; +      if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts, +                               KnownSrcBits, TLO, Depth + 1)) +        return true;      }      // If this is a bitcast, let computeKnownBits handle it.  Only do this on a      // recursive call where Known may be useful to the caller.      if (Depth > 0) { -      Known = TLO.DAG.computeKnownBits(Op, Depth); +      Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);        return false;      }      break; | 

