diff options
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 87cee5e072a..b992b68fb58 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34952,9 +34952,11 @@ SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode( } } + APInt ShuffleUndef, ShuffleZero; SmallVector<int, 16> ShuffleMask; SmallVector<SDValue, 2> ShuffleOps; - if (getTargetShuffleInputs(Op, ShuffleOps, ShuffleMask, DAG, Depth)) { + if (getTargetShuffleInputs(Op, DemandedElts, ShuffleOps, ShuffleMask, + ShuffleUndef, ShuffleZero, DAG, Depth, false)) { // If all the demanded elts are from one operand and are inline, // then we can use the operand directly. int NumOps = ShuffleOps.size(); @@ -34963,15 +34965,17 @@ SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode( return VT.getSizeInBits() == V.getValueSizeInBits(); })) { + if (DemandedElts.isSubsetOf(ShuffleUndef)) + return DAG.getUNDEF(VT); + if (DemandedElts.isSubsetOf(ShuffleUndef | ShuffleZero)) + return getZeroVector(VT.getSimpleVT(), Subtarget, DAG, SDLoc(Op)); + // Bitmask that indicates which ops have only been accessed 'inline'. APInt IdentityOp = APInt::getAllOnesValue(NumOps); - bool AllUndef = true; - for (int i = 0; i != NumElts; ++i) { int M = ShuffleMask[i]; - if (SM_SentinelUndef == M || !DemandedElts[i]) + if (!DemandedElts[i] || ShuffleUndef[i]) continue; - AllUndef = false; int Op = M / NumElts; int Index = M % NumElts; if (M < 0 || Index != i) { @@ -34982,16 +34986,11 @@ SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode( if (IdentityOp == 0) break; } - - if (AllUndef) - return DAG.getUNDEF(VT); - assert((IdentityOp == 0 || IdentityOp.countPopulation() == 1) && "Multiple identity shuffles detected"); - for (int i = 0; i != NumOps; ++i) - if (IdentityOp[i]) - return DAG.getBitcast(VT, ShuffleOps[i]); + if (IdentityOp != 0) + return DAG.getBitcast(VT, ShuffleOps[IdentityOp.countTrailingZeros()]); } } |