diff options
author | Nirav Dave <niravd@google.com> | 2016-04-15 15:01:38 +0000 |
---|---|---|
committer | Nirav Dave <niravd@google.com> | 2016-04-15 15:01:38 +0000 |
commit | 1f51c334ca0e41424d4e821c9a63896c5cfe68ab (patch) | |
tree | b5cbe8160876a4d1ff2f96489bebb868a2100e34 /llvm/lib/Target | |
parent | 4c5bd58ebecd3aada7cebd37db8ff94f0b44770a (diff) | |
download | bcm5719-llvm-1f51c334ca0e41424d4e821c9a63896c5cfe68ab.tar.gz bcm5719-llvm-1f51c334ca0e41424d4e821c9a63896c5cfe68ab.zip |
Fix typing on generated LXV2DX/STXV2DX instructions
[PPC] Previously when casting generic loads to LXV2DX/ST instructions we
would leave the original load return type in place allowing for an
assertion failure when we merge two equivalent LXV2DX nodes with
different types.
This fixes PR27350.
Reviewers: nemanjai
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D19133
llvm-svn: 266438
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 0f71b8d048b..76148f4e7ce 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -10352,13 +10352,24 @@ SDValue PPCTargetLowering::expandVSXLoadForLE(SDNode *N, MVT VecTy = N->getValueType(0).getSimpleVT(); SDValue LoadOps[] = { Chain, Base }; SDValue Load = DAG.getMemIntrinsicNode(PPCISD::LXVD2X, dl, - DAG.getVTList(VecTy, MVT::Other), - LoadOps, VecTy, MMO); + DAG.getVTList(MVT::v2f64, MVT::Other), + LoadOps, MVT::v2f64, MMO); + DCI.AddToWorklist(Load.getNode()); Chain = Load.getValue(1); - SDValue Swap = DAG.getNode(PPCISD::XXSWAPD, dl, - DAG.getVTList(VecTy, MVT::Other), Chain, Load); + SDValue Swap = DAG.getNode( + PPCISD::XXSWAPD, dl, DAG.getVTList(MVT::v2f64, MVT::Other), Chain, Load); DCI.AddToWorklist(Swap.getNode()); + + // Add a bitcast if the resulting load type doesn't match v2f64. + if (VecTy != MVT::v2f64) { + SDValue N = DAG.getNode(ISD::BITCAST, dl, VecTy, Swap); + DCI.AddToWorklist(N.getNode()); + // Package {bitcast value, swap's chain} to match Load's shape. + return DAG.getNode(ISD::MERGE_VALUES, dl, DAG.getVTList(VecTy, MVT::Other), + N, Swap.getValue(1)); + } + return Swap; } @@ -10402,8 +10413,15 @@ SDValue PPCTargetLowering::expandVSXStoreForLE(SDNode *N, SDValue Src = N->getOperand(SrcOpnd); MVT VecTy = Src.getValueType().getSimpleVT(); + + // All stores are done as v2f64 and possible bit cast. + if (VecTy != MVT::v2f64) { + Src = DAG.getNode(ISD::BITCAST, dl, MVT::v2f64, Src); + DCI.AddToWorklist(Src.getNode()); + } + SDValue Swap = DAG.getNode(PPCISD::XXSWAPD, dl, - DAG.getVTList(VecTy, MVT::Other), Chain, Src); + DAG.getVTList(MVT::v2f64, MVT::Other), Chain, Src); DCI.AddToWorklist(Swap.getNode()); Chain = Swap.getValue(1); SDValue StoreOps[] = { Chain, Swap, Base }; |