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/SelectionDAGISel.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/SelectionDAGISel.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 97597e053f..c6cc60ac0c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -318,9 +318,15 @@ public: } // Handle the case where we have a 1-element vector, in which // case we want to immediately turn it into a scalar constant. - if (Ops.size() == 1) + if (Ops.size() == 1) { return N = Ops[0]; - return N = DAG.getNode(ISD::ConstantVec, TVT, Ops); + } else if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) { + return N = DAG.getNode(ISD::ConstantVec, TVT, Ops); + } else { + // If the packed type isn't legal, then create a ConstantVec node with + // generic Vector type instead. + return N = DAG.getNode(ISD::ConstantVec, MVT::Vector, Ops); + } } else { // Canonicalize all constant ints to be unsigned. return N = DAG.getConstant(cast<ConstantIntegral>(C)->getRawValue(),VT); |