diff options
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 22 | 
1 files changed, 7 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 69354b72356..885b7aae4c9 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -8595,23 +8595,15 @@ static SDValue LowerToHorizontalOp(const BuildVectorSDNode *BV,    // int/FP at 128-bit/256-bit. Each type was introduced with a different    // subtarget feature. Try to match those "native" patterns first.    MVT VT = BV->getSimpleValueType(0); -  unsigned HOpcode; -  SDValue V0, V1; -  if ((VT == MVT::v4f32 || VT == MVT::v2f64) && Subtarget.hasSSE3()) -    if (isHopBuildVector(BV, DAG, HOpcode, V0, V1)) -      return getHopForBuildVector(BV, DAG, HOpcode, V0, V1); - -  if ((VT == MVT::v8i16 || VT == MVT::v4i32) && Subtarget.hasSSSE3()) -    if (isHopBuildVector(BV, DAG, HOpcode, V0, V1)) -      return getHopForBuildVector(BV, DAG, HOpcode, V0, V1); - -  if ((VT == MVT::v8f32 || VT == MVT::v4f64) && Subtarget.hasAVX()) -    if (isHopBuildVector(BV, DAG, HOpcode, V0, V1)) -      return getHopForBuildVector(BV, DAG, HOpcode, V0, V1); - -  if ((VT == MVT::v16i16 || VT == MVT::v8i32) && Subtarget.hasAVX2()) +  if (((VT == MVT::v4f32 || VT == MVT::v2f64) && Subtarget.hasSSE3()) || +      ((VT == MVT::v8i16 || VT == MVT::v4i32) && Subtarget.hasSSSE3()) || +      ((VT == MVT::v8f32 || VT == MVT::v4f64) && Subtarget.hasAVX()) || +      ((VT == MVT::v16i16 || VT == MVT::v8i32) && Subtarget.hasAVX2())) { +    unsigned HOpcode; +    SDValue V0, V1;      if (isHopBuildVector(BV, DAG, HOpcode, V0, V1))        return getHopForBuildVector(BV, DAG, HOpcode, V0, V1); +  }    // Try harder to match 256-bit ops by using extract/concat.    if (!Subtarget.hasAVX() || !VT.is256BitVector())  | 

