aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2009-04-27 19:33:03 +0000
committerDuncan Sands <baldrick@free.fr>2009-04-27 19:33:03 +0000
commit9771b91c2b4ce3baefdb9ba4ddfd9a9dd5077004 (patch)
tree227ee45cb06b8d609d01ef1929f34f62a972f80a /lib/CodeGen/SelectionDAG
parent48c255d7f864e95680f139118db60cde539b561a (diff)
downloadexternal_llvm-9771b91c2b4ce3baefdb9ba4ddfd9a9dd5077004.zip
external_llvm-9771b91c2b4ce3baefdb9ba4ddfd9a9dd5077004.tar.gz
external_llvm-9771b91c2b4ce3baefdb9ba4ddfd9a9dd5077004.tar.bz2
Now that PR2957 is resolved, remove a bunch of
no-longer needed workarounds. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70234 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG')
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeDAG.cpp4
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeTypes.cpp18
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeTypes.h10
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp62
4 files changed, 4 insertions, 90 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index be7a794..0b019fd 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -489,10 +489,8 @@ void SelectionDAGLegalize::HandleOp(SDValue Op) {
// If the type legalizer was run then we should never see any illegal result
// types here except for target constants (the type legalizer does not touch
// those) or for build vector used as a mask for a vector shuffle.
- // FIXME: We can removed the BUILD_VECTOR case when we fix PR2957.
assert((TypesNeedLegalizing || getTypeAction(VT) == Legal ||
- IsLegalizingCallArgs || Op.getOpcode() == ISD::TargetConstant ||
- Op.getOpcode() == ISD::BUILD_VECTOR) &&
+ IsLegalizingCallArgs || Op.getOpcode() == ISD::TargetConstant) &&
"Illegal type introduced after type legalization?");
switch (getTypeAction(VT)) {
default: assert(0 && "Bad type action!");
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 632524f..dc0f795 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -116,11 +116,8 @@ void DAGTypeLegalizer::PerformExpensiveChecks() {
cerr << "Unprocessed value in a map!";
Failed = true;
}
- } else if (isTypeLegal(Res.getValueType()) || IgnoreNodeResults(I)) {
- // FIXME: Because of PR2957, the build vector can be placed on this
- // list but if the associated vector shuffle is split, the build vector
- // can also be split so we allow this to go through for now.
- if (Mapped > 1 && Res.getOpcode() != ISD::BUILD_VECTOR) {
+ } else if (isTypeLegal(Res.getValueType())) {
+ if (Mapped > 1) {
cerr << "Value with legal type was transformed!";
Failed = true;
}
@@ -266,13 +263,6 @@ ScanOperands:
if (IgnoreNodeResults(N->getOperand(i).getNode()))
continue;
- if (N->getOpcode() == ISD::VECTOR_SHUFFLE && i == 2) {
- // The shuffle mask doesn't need to be a legal vector type.
- // FIXME: We can remove this once we fix PR2957.
- SetIgnoredNodeResult(N->getOperand(2).getNode());
- continue;
- }
-
MVT OpVT = N->getOperand(i).getValueType();
switch (getTypeAction(OpVT)) {
default:
@@ -842,10 +832,6 @@ void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
OpEntry = Result;
}
-// Set to ignore result
-void DAGTypeLegalizer::SetIgnoredNodeResult(SDNode* N) {
- IgnoredNodesResultsSet.insert(N);
-}
//===----------------------------------------------------------------------===//
// Utilities.
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index 24fb44c..330b5e7 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -114,16 +114,10 @@ private:
}
/// IgnoreNodeResults - Pretend all of this node's results are legal.
- /// FIXME: Remove once PR2957 is done.
bool IgnoreNodeResults(SDNode *N) const {
- return N->getOpcode() == ISD::TargetConstant ||
- IgnoredNodesResultsSet.count(N);
+ return N->getOpcode() == ISD::TargetConstant;
}
- /// IgnoredNode - Set of nodes whose result don't need to be legal.
- /// FIXME: Remove once PR2957 is done.
- DenseSet<SDNode*> IgnoredNodesResultsSet;
-
/// PromotedIntegers - For integer nodes that are below legal width, this map
/// indicates what promoted value to use.
DenseMap<SDValue, SDValue> PromotedIntegers;
@@ -202,7 +196,6 @@ private:
SDValue PromoteTargetBoolean(SDValue Bool, MVT VT);
void ReplaceValueWith(SDValue From, SDValue To);
void ReplaceValueWithHelper(SDValue From, SDValue To);
- void SetIgnoredNodeResult(SDNode* N);
void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
void SplitInteger(SDValue Op, MVT LoVT, MVT HiVT,
SDValue &Lo, SDValue &Hi);
@@ -577,7 +570,6 @@ private:
SDValue SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N);
SDValue SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
SDValue SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo);
- SDValue SplitVecOp_VECTOR_SHUFFLE(SDNode *N, unsigned OpNo);
//===--------------------------------------------------------------------===//
// Vector Widening Support: LegalizeVectorTypes.cpp
diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index fac4d99..f35db83 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -910,7 +910,6 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
case ISD::EXTRACT_VECTOR_ELT:Res = SplitVecOp_EXTRACT_VECTOR_ELT(N); break;
case ISD::STORE: Res = SplitVecOp_STORE(cast<StoreSDNode>(N),
OpNo); break;
- case ISD::VECTOR_SHUFFLE: Res = SplitVecOp_VECTOR_SHUFFLE(N, OpNo);break;
case ISD::CTTZ:
case ISD::CTLZ:
@@ -1073,67 +1072,6 @@ SDValue DAGTypeLegalizer::SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo) {
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
}
-SDValue DAGTypeLegalizer::SplitVecOp_VECTOR_SHUFFLE(SDNode *N, unsigned OpNo) {
- assert(OpNo == 2 && "Shuffle source type differs from result type?");
- SDValue Mask = N->getOperand(2);
- DebugLoc dl = N->getDebugLoc();
- unsigned MaskLength = Mask.getValueType().getVectorNumElements();
- unsigned LargestMaskEntryPlusOne = 2 * MaskLength;
- unsigned MinimumBitWidth = Log2_32_Ceil(LargestMaskEntryPlusOne);
-
- // Look for a legal vector type to place the mask values in.
- // Note that there may not be *any* legal vector-of-integer
- // type for which the element type is legal!
- for (MVT::SimpleValueType EltVT = MVT::FIRST_INTEGER_VALUETYPE;
- EltVT <= MVT::LAST_INTEGER_VALUETYPE;
- // Integer values types are consecutively numbered. Exploit this.
- EltVT = MVT::SimpleValueType(EltVT + 1)) {
-
- // Is the element type big enough to hold the values?
- if (MVT(EltVT).getSizeInBits() < MinimumBitWidth)
- // Nope.
- continue;
-
- // Is the vector type legal?
- MVT VecVT = MVT::getVectorVT(EltVT, MaskLength);
- if (!isTypeLegal(VecVT))
- // Nope.
- continue;
-
- // If the element type is not legal, find a larger legal type to use for
- // the BUILD_VECTOR operands. This is an ugly hack, but seems to work!
- // FIXME: The real solution is to change VECTOR_SHUFFLE into a variadic
- // node where the shuffle mask is a list of integer operands, #2 .. #2+n.
- for (MVT::SimpleValueType OpVT = EltVT; OpVT <= MVT::LAST_INTEGER_VALUETYPE;
- // Integer values types are consecutively numbered. Exploit this.
- OpVT = MVT::SimpleValueType(OpVT + 1)) {
- if (!isTypeLegal(OpVT))
- continue;
-
- // Success! Rebuild the vector using the legal types.
- SmallVector<SDValue, 16> Ops(MaskLength);
- for (unsigned i = 0; i < MaskLength; ++i) {
- SDValue Arg = Mask.getOperand(i);
- if (Arg.getOpcode() == ISD::UNDEF) {
- Ops[i] = DAG.getUNDEF(OpVT);
- } else {
- uint64_t Idx = cast<ConstantSDNode>(Arg)->getZExtValue();
- Ops[i] = DAG.getConstant(Idx, OpVT);
- }
- }
- return DAG.UpdateNodeOperands(SDValue(N,0),
- N->getOperand(0), N->getOperand(1),
- DAG.getNode(ISD::BUILD_VECTOR, dl,
- VecVT, &Ops[0], Ops.size()));
- }
-
- // Continuing is pointless - failure is certain.
- break;
- }
- assert(false && "Failed to find an appropriate mask type!");
- return SDValue(N, 0);
-}
-
//===----------------------------------------------------------------------===//
// Result Vector Widening