diff options
author | Craig Topper <craig.topper@gmail.com> | 2017-02-12 23:49:46 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2017-02-12 23:49:46 +0000 |
commit | 53eafa8ea43066d528434b7883b8602474149780 (patch) | |
tree | 14bded53a6ca54ae21a073941b626cbb13172012 /llvm | |
parent | 1bcd504a88a90b955bb12e8fd2074d9617653c99 (diff) | |
download | bcm5719-llvm-53eafa8ea43066d528434b7883b8602474149780.tar.gz bcm5719-llvm-53eafa8ea43066d528434b7883b8602474149780.zip |
[X86] Don't let LowerEXTRACT_SUBVECTOR call getNode for EXTRACT_SUBVECTOR.
This results in the simplifications inside of getNode running while we're legalizing nodes popped off the worklist during the final DAG combine. This basically makes a DAG combine like operation occur during this legalize step, but we don't handle something quite the same way. I think we don't recursively added the removed nodes to the DAG combiner worklist.
llvm-svn: 294929
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index cb002e44580..9d2b3fcd039 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -14010,12 +14010,14 @@ static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget, In.getSimpleValueType().is512BitVector()) && "Can only extract from 256-bit or 512-bit vectors"); - if (ResVT.is128BitVector()) - return extract128BitVector(In, IdxVal, DAG, dl); - if (ResVT.is256BitVector()) - return extract256BitVector(In, IdxVal, DAG, dl); + // If the input is a buildvector just emit a smaller one. + unsigned ElemsPerChunk = ResVT.getVectorNumElements(); + if (In.getOpcode() == ISD::BUILD_VECTOR) + return DAG.getNode(ISD::BUILD_VECTOR, dl, ResVT, + makeArrayRef(In->op_begin() + IdxVal, ElemsPerChunk)); - llvm_unreachable("Unimplemented!"); + // Everything else is legal. + return Op; } static bool areOnlyUsersOf(SDNode *N, ArrayRef<SDValue> ValidUsers) { |