summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-07-20 13:26:51 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-07-20 13:26:51 +0000
commit6fb8b68b2d1cc953f8521d93a5a6faee39662697 (patch)
tree7e65cceaf224188a27c2ef8a76f02d05749555c8
parentcbf5af12b0417fdf9d701db293447205b7e0f1c6 (diff)
downloadbcm5719-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.cpp58
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.h7
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,
OpenPOWER on IntegriCloud