summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-07-09 00:41:34 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-07-09 00:41:34 +0000
commitf0a33b71e90e8d99597d1eaa42ac7e571b2080c3 (patch)
tree743377a25f037718cd2e855d8e23ca01108d856f /llvm/lib/CodeGen
parent342595f832b1241340410596d67e12415a7f4c68 (diff)
downloadbcm5719-llvm-f0a33b71e90e8d99597d1eaa42ac7e571b2080c3.tar.gz
bcm5719-llvm-f0a33b71e90e8d99597d1eaa42ac7e571b2080c3.zip
[SDAG] At the suggestion of Hal, switch to an output parameter that
tracks which elements of the build vector are in fact undef. This should make actually inpsecting them (likely in my next patch) reasonably pretty. Also makes the output parameter optional as it is clear now that *most* users are happy with undefs in their splats. llvm-svn: 212581
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp6
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp31
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp12
3 files changed, 27 insertions, 22 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index d58824a92d6..7497feb1e66 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -655,13 +655,13 @@ static ConstantSDNode *isConstOrConstSplat(SDValue N) {
return CN;
if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
- bool HasUndefElements;
- ConstantSDNode *CN = BV->getConstantSplatNode(HasUndefElements);
+ BitVector UndefElements;
+ ConstantSDNode *CN = BV->getConstantSplatNode(&UndefElements);
// BuildVectors can truncate their operands. Ignore that case here.
// FIXME: We blindly ignore splats which include undef which is overly
// pessimistic.
- if (CN && !HasUndefElements &&
+ if (CN && UndefElements.none() &&
CN->getValueType(0) == N.getValueType().getScalarType())
return CN;
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 15baf14f2d9..c2cb0d8d779 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1521,15 +1521,15 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, SDLoc dl, SDValue N1,
// A splat should always show up as a build vector node.
if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
- bool SplatHasUndefs;
- SDValue Splat = BV->getSplatValue(SplatHasUndefs);
+ BitVector UndefElements;
+ SDValue Splat = BV->getSplatValue(&UndefElements);
// If this is a splat of an undef, shuffling it is also undef.
if (Splat && Splat.getOpcode() == ISD::UNDEF)
return getUNDEF(VT);
// We only have a splat which can skip shuffles if there is a splatted
// value and no undef lanes rearranged by the shuffle.
- if (Splat && !SplatHasUndefs) {
+ if (Splat && UndefElements.none()) {
// Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
// number of elements match or the value splatted is a zero constant.
if (V.getValueType().getVectorNumElements() ==
@@ -6635,17 +6635,22 @@ bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue,
return true;
}
-SDValue BuildVectorSDNode::getSplatValue(bool &HasUndefElements) const {
- HasUndefElements = false;
+SDValue BuildVectorSDNode::getSplatValue(BitVector *UndefElements) const {
+ if (UndefElements) {
+ UndefElements->clear();
+ UndefElements->resize(getNumOperands());
+ }
SDValue Splatted;
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
SDValue Op = getOperand(i);
- if (Op.getOpcode() == ISD::UNDEF)
- HasUndefElements = true;
- else if (!Splatted)
+ if (Op.getOpcode() == ISD::UNDEF) {
+ if (UndefElements)
+ (*UndefElements)[i] = true;
+ } else if (!Splatted) {
Splatted = Op;
- else if (Splatted != Op)
+ } else if (Splatted != Op) {
return SDValue();
+ }
}
if (!Splatted) {
@@ -6658,15 +6663,15 @@ SDValue BuildVectorSDNode::getSplatValue(bool &HasUndefElements) const {
}
ConstantSDNode *
-BuildVectorSDNode::getConstantSplatNode(bool &HasUndefElements) const {
+BuildVectorSDNode::getConstantSplatNode(BitVector *UndefElements) const {
return dyn_cast_or_null<ConstantSDNode>(
- getSplatValue(HasUndefElements).getNode());
+ getSplatValue(UndefElements).getNode());
}
ConstantFPSDNode *
-BuildVectorSDNode::getConstantFPSplatNode(bool &HasUndefElements) const {
+BuildVectorSDNode::getConstantFPSplatNode(BitVector *UndefElements) const {
return dyn_cast_or_null<ConstantFPSDNode>(
- getSplatValue(HasUndefElements).getNode());
+ getSplatValue(UndefElements).getNode());
}
bool BuildVectorSDNode::isConstant() const {
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 9aee3894b64..578821a19f5 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1158,11 +1158,11 @@ bool TargetLowering::isConstTrueVal(const SDNode *N) const {
return false;
IsVec = true;
- bool HasUndefElements;
- CN = BV->getConstantSplatNode(HasUndefElements);
+ BitVector UndefElements;
+ CN = BV->getConstantSplatNode(&UndefElements);
// Only interested in constant splats, and we don't try to handle undef
// elements in identifying boolean constants.
- if (!CN || HasUndefElements)
+ if (!CN || UndefElements.none())
return false;
}
@@ -1190,11 +1190,11 @@ bool TargetLowering::isConstFalseVal(const SDNode *N) const {
return false;
IsVec = true;
- bool HasUndefElements;
- CN = BV->getConstantSplatNode(HasUndefElements);
+ BitVector UndefElements;
+ CN = BV->getConstantSplatNode(&UndefElements);
// Only interested in constant splats, and we don't try to handle undef
// elements in identifying boolean constants.
- if (!CN || HasUndefElements)
+ if (!CN || UndefElements.none())
return false;
}
OpenPOWER on IntegriCloud