diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 14:04:50 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 14:04:50 +0000 | 
| commit | fd4675b5a029cce616a1b0ad339344c5df800ea6 (patch) | |
| tree | 90692ad6d7101214860cca83c219d3c001515d02 /lib/CodeGen | |
| parent | c7dac04c3480f3c20487f912f77343139fce2d99 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 15 | 
1 files changed, 8 insertions, 7 deletions
| diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 17f907eb07e8..388663eb1db7 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3987,6 +3987,12 @@ SDValue DAGCombiner::visitAND(SDNode *N) {    // reassociate and    if (SDValue RAND = ReassociateOps(ISD::AND, SDLoc(N), N0, N1))      return RAND; + +  // Try to convert a constant mask AND into a shuffle clear mask. +  if (VT.isVector()) +    if (SDValue Shuffle = XformToShuffleWithZero(N)) +      return Shuffle; +    // fold (and (or x, C), D) -> D if (C & D) == D    auto MatchSubset = [](ConstantSDNode *LHS, ConstantSDNode *RHS) {      return RHS->getAPIntValue().isSubsetOf(LHS->getAPIntValue()); @@ -16480,6 +16486,8 @@ SDValue DAGCombiner::visitFP16_TO_FP(SDNode *N) {  /// e.g. AND V, <0xffffffff, 0, 0xffffffff, 0>. ==>  ///      vector_shuffle V, Zero, <0, 4, 2, 4>  SDValue DAGCombiner::XformToShuffleWithZero(SDNode *N) { +  assert(N->getOpcode() == ISD::AND && "Unexpected opcode!"); +    EVT VT = N->getValueType(0);    SDValue LHS = N->getOperand(0);    SDValue RHS = peekThroughBitcast(N->getOperand(1)); @@ -16490,9 +16498,6 @@ SDValue DAGCombiner::XformToShuffleWithZero(SDNode *N) {    if (LegalOperations)      return SDValue(); -  if (N->getOpcode() != ISD::AND) -    return SDValue(); -    if (RHS.getOpcode() != ISD::BUILD_VECTOR)      return SDValue(); @@ -16581,10 +16586,6 @@ SDValue DAGCombiner::SimplifyVBinOp(SDNode *N) {            N->getOpcode(), SDLoc(LHS), LHS.getValueType(), Ops, N->getFlags()))      return Fold; -  // Try to convert a constant mask AND into a shuffle clear mask. -  if (SDValue Shuffle = XformToShuffleWithZero(N)) -    return Shuffle; -    // Type legalization might introduce new shuffles in the DAG.    // Fold (VBinOp (shuffle (A, Undef, Mask)), (shuffle (B, Undef, Mask)))    //   -> (shuffle (VBinOp (A, B)), Undef, Mask). | 
