summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-09-03 22:25:52 +0000
committerCraig Topper <craig.topper@intel.com>2017-09-03 22:25:52 +0000
commitbc13af84f2f429f4f7ae897dbee838f7064094f3 (patch)
treecb3004aa3fc41b60a9845068d653470b2c620a32 /llvm/lib
parentfcf6bc550344794cedfd282df45f384b12c88650 (diff)
downloadbcm5719-llvm-bc13af84f2f429f4f7ae897dbee838f7064094f3.tar.gz
bcm5719-llvm-bc13af84f2f429f4f7ae897dbee838f7064094f3.zip
[X86] Add a combine to turn (insert_subvector zero, (insert_subvector zero, X, Idx), Idx) into an insert of X into the larger zero vector.
llvm-svn: 312460
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 2cb6ec376c4..58ea9e0ffd9 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -35656,10 +35656,21 @@ static SDValue combineInsertSubvector(SDNode *N, SelectionDAG &DAG,
unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
MVT SubVecVT = SubVec.getSimpleValueType();
- // Inserting zeros into zeros is a nop.
- if (ISD::isBuildVectorAllZeros(Vec.getNode()) &&
- ISD::isBuildVectorAllZeros(SubVec.getNode()))
- return Vec;
+ if (ISD::isBuildVectorAllZeros(Vec.getNode())) {
+ // Inserting zeros into zeros is a nop.
+ if (ISD::isBuildVectorAllZeros(SubVec.getNode()))
+ return Vec;
+
+ // If we're inserting into a zero vector and then into a larger zero vector,
+ // just insert into the larger zero vector directly.
+ if (SubVec.getOpcode() == ISD::INSERT_SUBVECTOR &&
+ ISD::isBuildVectorAllZeros(SubVec.getOperand(0).getNode())) {
+ unsigned Idx2Val = cast<ConstantSDNode>(Idx)->getZExtValue();
+ return DAG.getNode(ISD::INSERT_SUBVECTOR, dl, OpVT, Vec,
+ SubVec.getOperand(1),
+ DAG.getIntPtrConstant(IdxVal + Idx2Val, dl));
+ }
+ }
// If this is an insert of an extract, combine to a shuffle. Don't do this
// if the insert or extract can be represented with a subregister operation.
OpenPOWER on IntegriCloud