diff options
author | Nate Begeman <natebegeman@mac.com> | 2005-12-07 19:48:11 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2005-12-07 19:48:11 +0000 |
commit | cc827e60b67b2cbcf08a37b119e68081e4171b8a (patch) | |
tree | a92f56150edfae3684ceb2c637831e3a6c8dd046 /lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | |
parent | cc2210b4fa9debfaafa2d385549b0c30448e9c12 (diff) |
Fix a crash where ConstantVec nodes were being generated with the wrong
type when the target did not support them. Also teach Legalize how to
expand ConstantVecs.
This allows us to generate
_test:
lwz r2, 12(r3)
lwz r4, 8(r3)
lwz r5, 4(r3)
lwz r6, 0(r3)
addi r2, r2, 4
addi r4, r4, 3
addi r5, r5, 2
addi r6, r6, 1
stw r2, 12(r3)
stw r4, 8(r3)
stw r5, 4(r3)
stw r6, 0(r3)
blr
For:
void %test(%v4i *%P) {
%T = load %v4i* %P
%S = add %v4i %T, <int 1, int 2, int 3, int 4>
store %v4i %S, %v4i * %P
ret void
}
On PowerPC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24633 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 18da8168a9..41ba14205d 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3159,6 +3159,28 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ Hi = DAG.getConstant(Cst >> MVT::getSizeInBits(NVT), NVT); break; } + case ISD::ConstantVec: { + unsigned NumElements = Node->getNumOperands(); + // If we only have two elements left in the constant vector, just break it + // apart into the two scalar constants it contains. Otherwise, bisect the + // ConstantVec, and return each half as a new ConstantVec. + // FIXME: this is hard coded as big endian, it may have to change to support + // SSE and Alpha MVI + if (NumElements == 2) { + Hi = Node->getOperand(0); + Lo = Node->getOperand(1); + } else { + NumElements /= 2; + std::vector<SDOperand> LoOps, HiOps; + for (unsigned I = 0, E = NumElements; I < E; ++I) { + HiOps.push_back(Node->getOperand(I)); + LoOps.push_back(Node->getOperand(I+NumElements)); + } + Lo = DAG.getNode(ISD::ConstantVec, MVT::Vector, LoOps); + Hi = DAG.getNode(ISD::ConstantVec, MVT::Vector, HiOps); + } + break; + } case ISD::BUILD_PAIR: // Legalize both operands. FIXME: in the future we should handle the case |