diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-07-20 13:26:51 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-07-20 13:26:51 +0000 |
commit | 6fb8b68b2d1cc953f8521d93a5a6faee39662697 (patch) | |
tree | 7e65cceaf224188a27c2ef8a76f02d05749555c8 | |
parent | cbf5af12b0417fdf9d701db293447205b7e0f1c6 (diff) | |
download | bcm5719-llvm-6fb8b68b2d1cc953f8521d93a5a6faee39662697.tar.gz bcm5719-llvm-6fb8b68b2d1cc953f8521d93a5a6faee39662697.zip |
[X86][AVX] Convert X86ISD::VBROADCAST demanded elts combine to use SimplifyDemandedVectorElts
This is an early step towards using SimplifyDemandedVectorElts for target shuffle combining - this merely moves the existing X86ISD::VBROADCAST simplification code to use the SimplifyDemandedVectorElts mechanism.
Adds X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode to handle X86ISD::VBROADCAST - in time we can support all target shuffles (and other ops) here.
llvm-svn: 337547
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 58 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 7 |
2 files changed, 48 insertions, 17 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index b1b6b7c6aad..d9b42f69ad9 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -30635,24 +30635,13 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG, switch (Opcode) { case X86ISD::VBROADCAST: { - // If broadcasting from another shuffle, attempt to simplify it. // TODO - we really need a general SimplifyDemandedVectorElts mechanism. - SDValue Src = N.getOperand(0); - SDValue BC = peekThroughBitcasts(Src); - EVT SrcVT = Src.getValueType(); - EVT BCVT = BC.getValueType(); - if (isTargetShuffle(BC.getOpcode()) && - VT.getScalarSizeInBits() % BCVT.getScalarSizeInBits() == 0) { - unsigned Scale = VT.getScalarSizeInBits() / BCVT.getScalarSizeInBits(); - SmallVector<int, 16> DemandedMask(BCVT.getVectorNumElements(), - SM_SentinelUndef); - for (unsigned i = 0; i != Scale; ++i) - DemandedMask[i] = i; - if (SDValue Res = combineX86ShufflesRecursively( - {BC}, 0, BC, DemandedMask, {}, /*Depth*/ 1, - /*HasVarMask*/ false, DAG, Subtarget)) - return DAG.getNode(X86ISD::VBROADCAST, DL, VT, - DAG.getBitcast(SrcVT, Res)); + APInt KnownUndef, KnownZero; + APInt DemandedMask(APInt::getAllOnesValue(VT.getVectorNumElements())); + const TargetLowering &TLI = DAG.getTargetLoweringInfo(); + if (TLI.SimplifyDemandedVectorElts(N, DemandedMask, KnownUndef, KnownZero, + DCI)) { + return SDValue(N.getNode(), 0); } return SDValue(); } @@ -31298,6 +31287,41 @@ static SDValue combineShuffle(SDNode *N, SelectionDAG &DAG, return SDValue(); } +bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode( + SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, + TargetLoweringOpt &TLO, unsigned Depth) const { + + if (X86ISD::VBROADCAST != Op.getOpcode()) + return false; + + EVT VT = Op.getValueType(); + SDValue Src = Op.getOperand(0); + SDValue BC = peekThroughBitcasts(Src); + EVT SrcVT = Src.getValueType(); + EVT BCVT = BC.getValueType(); + + if (!isTargetShuffle(BC.getOpcode()) || + (VT.getScalarSizeInBits() % BCVT.getScalarSizeInBits()) != 0) + return false; + + unsigned Scale = VT.getScalarSizeInBits() / BCVT.getScalarSizeInBits(); + SmallVector<int, 16> DemandedMask(BCVT.getVectorNumElements(), + SM_SentinelUndef); + for (unsigned i = 0; i != Scale; ++i) + DemandedMask[i] = i; + + if (SDValue Res = combineX86ShufflesRecursively( + {BC}, 0, BC, DemandedMask, {}, Depth + 1, /*HasVarMask*/ false, + TLO.DAG, Subtarget)) { + SDLoc DL(Op); + Res = TLO.DAG.getNode(X86ISD::VBROADCAST, DL, VT, + TLO.DAG.getBitcast(SrcVT, Res)); + return TLO.CombineTo(Op, Res); + } + + return false; +} + /// 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 diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 32215b170a8..623b95b3705 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -866,6 +866,13 @@ namespace llvm { const SelectionDAG &DAG, unsigned Depth) const override; + bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op, + const APInt &DemandedElts, + APInt &KnownUndef, + APInt &KnownZero, + TargetLoweringOpt &TLO, + unsigned Depth) const override; + SDValue unwrapAddress(SDValue N) const override; bool isGAPlusOffset(SDNode *N, const GlobalValue* &GA, |