diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 44d0d711dd1..d86f9d5a220 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -31870,6 +31870,30 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode( return false; } +bool X86TargetLowering::SimplifyDemandedBitsForTargetNode( + SDValue Op, const APInt &OriginalDemandedBits, KnownBits &Known, + TargetLoweringOpt &TLO, unsigned Depth) const { + unsigned Opc = Op.getOpcode(); + switch(Opc) { + case X86ISD::PMULDQ: + case X86ISD::PMULUDQ: { + // PMULDQ/PMULUDQ only uses lower 32 bits from each vector element. + KnownBits KnownOp; + SDValue LHS = Op.getOperand(0); + SDValue RHS = Op.getOperand(1); + APInt DemandedMask = OriginalDemandedBits & APInt::getLowBitsSet(64, 32); + if (SimplifyDemandedBits(LHS, DemandedMask, KnownOp, TLO, Depth + 1)) + return true; + if (SimplifyDemandedBits(RHS, DemandedMask, KnownOp, TLO, Depth + 1)) + return true; + break; + } + } + + return TargetLowering::SimplifyDemandedBitsForTargetNode( + Op, OriginalDemandedBits, Known, TLO, Depth); +} + /// Check if a vector extract from a target-specific shuffle of a load can be /// folded into a single element load. /// Similar handling for VECTOR_SHUFFLE is performed by DAGCombiner, but @@ -40362,13 +40386,9 @@ static SDValue combinePMULDQ(SDNode *N, SelectionDAG &DAG, if (ISD::isBuildVectorAllZeros(RHS.getNode())) return RHS; + // PMULDQ/PMULUDQ only uses lower 32 bits from each vector element. const TargetLowering &TLI = DAG.getTargetLoweringInfo(); - APInt DemandedMask(APInt::getLowBitsSet(64, 32)); - - // PMULQDQ/PMULUDQ only uses lower 32 bits from each vector element. - if (TLI.SimplifyDemandedBits(LHS, DemandedMask, DCI)) - return SDValue(N, 0); - if (TLI.SimplifyDemandedBits(RHS, DemandedMask, DCI)) + if (TLI.SimplifyDemandedBits(SDValue(N, 0), APInt::getAllOnesValue(64), DCI)) return SDValue(N, 0); return SDValue(); |

