summaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
diff options
context:
space:
mode:
authorMon P Wang <wangmp@apple.com>2008-12-18 20:03:17 +0000
committerMon P Wang <wangmp@apple.com>2008-12-18 20:03:17 +0000
commit87c8a8f304d1ee72829086ce2c41a8fa3813ba6a (patch)
treed5b38f2594ae2e43b94f0751c2972cb599818d5f /lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
parent5c9f34b7a0c151dd8c508a872dc5e898bde4582e (diff)
downloadllvm-87c8a8f304d1ee72829086ce2c41a8fa3813ba6a.tar.gz
llvm-87c8a8f304d1ee72829086ce2c41a8fa3813ba6a.tar.bz2
llvm-87c8a8f304d1ee72829086ce2c41a8fa3813ba6a.tar.xz
Added support for vector widening.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61209 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeTypes.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeTypes.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 8454dda303..704c537bb4 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -108,6 +108,8 @@ void DAGTypeLegalizer::PerformExpensiveChecks() {
Mapped |= 32;
if (SplitVectors.find(Res) != SplitVectors.end())
Mapped |= 64;
+ if (WidenedVectors.find(Res) != WidenedVectors.end())
+ Mapped |= 128;
if (I->getNodeId() != Processed) {
if (Mapped != 0) {
@@ -115,7 +117,10 @@ void DAGTypeLegalizer::PerformExpensiveChecks() {
Failed = true;
}
} else if (isTypeLegal(Res.getValueType()) || IgnoreNodeResults(I)) {
- if (Mapped > 1) {
+ // 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) {
cerr << "Value with legal type was transformed!";
Failed = true;
}
@@ -144,6 +149,8 @@ void DAGTypeLegalizer::PerformExpensiveChecks() {
cerr << " ExpandedFloats";
if (Mapped & 64)
cerr << " SplitVectors";
+ if (Mapped & 128)
+ cerr << " WidenedVectors";
cerr << "\n";
abort();
}
@@ -241,6 +248,10 @@ bool DAGTypeLegalizer::run() {
SplitVectorResult(N, i);
Changed = true;
goto NodeDone;
+ case WidenVector:
+ WidenVectorResult(N, i);
+ Changed = true;
+ goto NodeDone;
}
}
@@ -255,6 +266,13 @@ 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:
@@ -288,6 +306,10 @@ ScanOperands:
NeedsReanalyzing = SplitVectorOperand(N, i);
Changed = true;
break;
+ case WidenVector:
+ NeedsReanalyzing = WidenVectorOperand(N, i);
+ Changed = true;
+ break;
}
break;
}
@@ -791,6 +813,18 @@ void DAGTypeLegalizer::SetSplitVector(SDValue Op, SDValue Lo,
Entry.second = Hi;
}
+void DAGTypeLegalizer::SetWidenedVector(SDValue Op, SDValue Result) {
+ AnalyzeNewValue(Result);
+
+ SDValue &OpEntry = WidenedVectors[Op];
+ assert(OpEntry.getNode() == 0 && "Node is already promoted!");
+ OpEntry = Result;
+}
+
+// Set to ignore result
+void DAGTypeLegalizer::SetIgnoredNodeResult(SDNode* N) {
+ IgnoredNodesResultsSet.insert(N);
+}
//===----------------------------------------------------------------------===//
// Utilities.