diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-01-26 21:05:00 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-01-26 21:05:00 +0000 |
| commit | 3e1701da296f76fdbad6c1662eaf008de446948d (patch) | |
| tree | fd5180d5b668e09e7f76630d578f0aa8f5e77109 /llvm/lib | |
| parent | a9e0584cce33c3ec94f40f296c86d2ff3e1058a9 (diff) | |
| download | bcm5719-llvm-3e1701da296f76fdbad6c1662eaf008de446948d.tar.gz bcm5719-llvm-3e1701da296f76fdbad6c1662eaf008de446948d.zip | |
[x86] add materializeVectorConstant() helper function; NFC
LowerBUILD_VECTOR is still over 300 lines long, but it's a start...
llvm-svn: 258858
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index cefc0a7c75a..cb5a8b3d2df 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6389,39 +6389,53 @@ static SDValue LowerToHorizontalOp(const BuildVectorSDNode *BV, return SDValue(); } -SDValue -X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const { - SDLoc dl(Op); - +/// Create a vector constant without a load. SSE/AVX provide the bare minimum +/// functionality to do this, so it's all zeros, all ones, or some derivation +/// that is cheap to calculate. +static SDValue materializeVectorConstant(SDValue Op, SelectionDAG &DAG, + const X86Subtarget &Subtarget) { + SDLoc DL(Op); MVT VT = Op.getSimpleValueType(); - MVT ExtVT = VT.getVectorElementType(); - unsigned NumElems = Op.getNumOperands(); - // Generate vectors for predicate vectors. - if (VT.getVectorElementType() == MVT::i1 && Subtarget->hasAVX512()) - return LowerBUILD_VECTORvXi1(Op, DAG); - - // Vectors containing all zeros can be matched by pxor and xorps later + // Vectors containing all zeros can be matched by pxor and xorps. if (ISD::isBuildVectorAllZeros(Op.getNode())) { // Canonicalize this to <4 x i32> to 1) ensure the zero vectors are CSE'd // and 2) ensure that i64 scalars are eliminated on x86-32 hosts. if (VT == MVT::v4i32 || VT == MVT::v8i32 || VT == MVT::v16i32) return Op; - return getZeroVector(VT, Subtarget, DAG, dl); + return getZeroVector(VT, &Subtarget, DAG, DL); } // Vectors containing all ones can be matched by pcmpeqd on 128-bit width // vectors or broken into v4i32 operations on 256-bit vectors. AVX2 can use // vpcmpeqd on 256-bit vectors. - if (Subtarget->hasSSE2() && ISD::isBuildVectorAllOnes(Op.getNode())) { - if (VT == MVT::v4i32 || (VT == MVT::v8i32 && Subtarget->hasInt256())) + if (Subtarget.hasSSE2() && ISD::isBuildVectorAllOnes(Op.getNode())) { + if (VT == MVT::v4i32 || (VT == MVT::v8i32 && Subtarget.hasInt256())) return Op; if (!VT.is512BitVector()) - return getOnesVector(VT, Subtarget, DAG, dl); + return getOnesVector(VT, &Subtarget, DAG, DL); } + return SDValue(); +} + +SDValue +X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const { + SDLoc dl(Op); + + MVT VT = Op.getSimpleValueType(); + MVT ExtVT = VT.getVectorElementType(); + unsigned NumElems = Op.getNumOperands(); + + // Generate vectors for predicate vectors. + if (VT.getVectorElementType() == MVT::i1 && Subtarget->hasAVX512()) + return LowerBUILD_VECTORvXi1(Op, DAG); + + if (SDValue VectorConstant = materializeVectorConstant(Op, DAG, *Subtarget)) + return VectorConstant; + BuildVectorSDNode *BV = cast<BuildVectorSDNode>(Op.getNode()); if (SDValue AddSub = LowerToAddSub(BV, Subtarget, DAG)) return AddSub; |

